前言

23年底网上公开了一个某凌OA前台RCE,接口为/sys/ui/sys_ui_component/sysUiComponent.do这个漏洞是文件解压以后复制到WEB目录导致的任意文件写入,接口是直接能前台访问。我印象中能前台直接访问的接口里没有这个,后来发现是V16的某些版本才存在,于是分析了一下漏洞出现的原因以及是如何修复的。

鉴权分析

蓝凌为了给不同role的用户做权限校验,自写了一种xml配置方式。

/sys/ui/有关的配置xml在WEB-INF/KmssConfig/sys/ui/design.xml定义

<?xml version="1.0" encoding="UTF-8"?>
<configs
xmlns="http://www.example.org/design-config"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/design-config ../../design.xsd ">
<module
messageKey="sys-ui:module.sys.ui"
urlPrefix="/sys/ui/"
defaultValidator="true">
<request
path="index.jsp*"
defaultValidator="roleValidator(role=SYSROLE_ADMIN;SYSROLE_SYSADMIN)" />
<request
path="tools.jsp*"
defaultValidator="roleValidator(role=SYSROLE_ADMIN;SYSROLE_SYSADMIN)" />
<request
path="tree.jsp*"
defaultValidator="roleValidator(role=SYSROLE_USER)" />
<request
path="help/font/**"
defaultValidator="roleValidator(role=SYSROLE_USER)" />
<request
path="help/component/**"
defaultValidator="roleValidator(role=SYSROLE_ADMIN;ROLE_SYSPORTAL_BASE_SETTING)" />
<request
path="help/**"
defaultValidator="roleValidator(role=SYSROLE_ADMIN;ROLE_SYSPORTAL_EXT_SETTING)" />
<request
path="demo/**"
defaultValidator="roleValidator(role=SYSROLE_USER)" />
<request
path="jsp/**"
defaultValidator="roleValidator(role=SYSROLE_USER)" />
<request
path="sys_ui_logo/**"
defaultValidator="roleValidator(role=SYSROLE_ADMIN;SYSROLE_SYSADMIN)" />
<request
path="sys_ui_extend/**"
defaultValidator="roleValidator(role=SYSROLE_ADMIN;ROLE_SYSPORTAL_EXT_SETTING)" />
<request
path="sys_ui_tool/**"
defaultValidator="roleValidator(role=SYSROLE_ADMIN;SYSROLE_SYSADMIN)" />
<request
path="sys_ui_config/**"
defaultValidator="roleValidator(role=SYSROLE_ADMIN;SYSROLE_SYSADMIN)" />
<request
path="sys_ui_qrcode/**"
defaultValidator="roleValidator(role=SYSROLE_USER)" />
<request
path="/sys_ui_compress/sysUiCompress.do*"
defaultValidator="roleValidator(role=SYSROLE_ADMIN;SYSROLE_SYSADMIN)"/>
</module>
</configs>

/sys/ui/模块defaultValidatorture即无需鉴权,如果匹配到下面path里的路径则需要对应的defaultValidator权限。漏洞路径为/sys/ui/sys_ui_component/sysUiComponent.do匹配不到path里的路径所以也就无需鉴权了。具体的鉴权代码在com.landray.kmss.sys.authentication.intercept.AuthenticationValidateCoreImp#checkAuthentication(com.landray.kmss.sys.authentication.intercept.ValidatorRequestContext)



com.landray.kmss.sys.config.design.SysConfigs#loadAuthValidator



通过路径获取对应的模块



根据模块对应的授权配置匹配路径



com.landray.kmss.sys.config.design.SysCfgQuery#match



此处为参数级权限校验

这个漏洞出现的原因其实就是/sys/ui/模块默认无需鉴权,开发在这个模块新增了一个路由这个路由的命名正好也没匹配到其他的path,开发也忘记在xml里添加相应的鉴权配置,导致这个路由可以直接前台访问。

解析差异

在2023-06-09官方就已经修复了这个漏洞,修复方法为在xml里配置了鉴权。

WEB-INF/KmssConfig/sys/ui/design.xml



我们注意到这个地方使用的参数级鉴权,只有method等于某些特定值的时候才需要鉴权。

我们重新回到对于参数级权限校验处理的方法

com.landray.kmss.sys.config.design.SysCfgQuery#match

这个地方会获取method参数的值然后和配置里的比较



跟入com.landray.kmss.common.actions.RequestContext#getParameter



他这里就是用的tomcat的getParameterMap获取参数map然后获取值。

我们看后面调用方法的时候,他是怎么获取的。com.landray.kmss.common.actions.BaseAction#getMethodName



这里传入的request可以由我们在org.springframework.web.servlet.DispatcherServlet#doDispatch里改变





当请求为POST且Content-Type以multipart/开头request即为DefaultMultipartHttpServletRequest

所以当我们以上传格式传入method



验证权限的时候获取不到method参数的值,而查找调用方法时可以找到。

所以只需使用form-data格式传入method即可绕过权限校验复活这个漏洞。

漏洞利用

/sys/ui/sys_ui_component/sysUiComponent.do路由在WEB-INF/KmssConfig/sys/ui/spring-mvc.xml处定义



找到对应存在漏洞的方法

com.landray.kmss.sys.ui.actions.SysUiComponentAction#getThemeInfo

如果上传文件的后缀为zip的话会进行解压



解压的方法里判断目录穿越的情况



判断解压的文件里是否包含component.ini,如果包含的话加载ini从中获取id和name最后将一些需要的参数返回



然后把刚才解压的内容复制到this.getAppFolder(extendId)



extendId是我们刚才解压文件里面component.ini里的值。相当于将我们压缩包的文件解压然后全部复制到web目录的/resource/ui-component/+extendId目录下面

我们将component.ini文件内容填写如下

id=dasdasdas
name=test
thumb=/thumb.jpg

压缩包的文件解压后将会被复制的/resource/ui-component/dasdasdas/

我们制作一个如下压缩包



构造数据包使用上传格式传入method的值绕过权限校验,同时上传我们制作好的压缩包即可实现前台RCE

修复

官方于2024-07-26修复了漏洞。



修复访问为对/sys/ui/sys_ui_component/sysUiComponent.do添加了默认鉴权

以及在进入鉴权参数判断前对上传格式的数据包进行解析

com.landray.kmss.sys.authentication.intercept.FilterInvocationDefinitionSourceImp#getAttributes

总结

通过分析某凌OA鉴权机制发现其鉴权和最终获取method时存在差异。可以利用spring获取参数时会对form-data格式进行解析获取,而正常使用getParameter获取参数时获取不到form-data里参数的值从而实现鉴权绕过。这种绕过鉴权的方式在smartbi中也出现过,其实在某远OA里也存在。这种解析差异不止可以用来绕过鉴权,在java里很多时候会使用全局过滤器做sql注入、xss检测。过滤器里使用getParameter获取参数值实际上是获取不到form-data格式里的值的,这种情况可能会被直接绕过全局过滤器检测,所以进行黑盒测试的如果碰到sql注入有代码检测可以直接转为form-data格式进行测试有可能会有惊喜。

利用解析差异复活某凌OA前台RCE的更多相关文章

  1. 蓝凌OA前台任意文件读取漏洞利用

    近期CNVD爆出漏洞编号:CNVD-2021-28277,首次公开日期为2021-04-15,蓝凌oa存在多个漏洞,攻击者可利用该漏洞获取服务器控制权.今天挑选一个蓝凌OA前台任意文件读取漏洞进行分析 ...

  2. 蓝凌OA二次开发手册

    1.蓝凌OA表单前端调用后台数据 一.后台存储过程: create procedure sp_test @ftext nvarchar(50) as begin select @ftext as '测 ...

  3. web兼容学习分析笔记-margin 和padding浏览器解析差异

    二.margin 和padding浏览器解析差异 只有默认margin的元素 <body>margin:8px  margin:15px 10px 15px 10px(IE7) <b ...

  4. 通达OA 前台任意用户登录漏洞复现

    漏洞描述 通达OA是一套办公系统.通达OA官方于4月17日发布安全更新.经分析,在该次安全更新中修复了包括任意用户登录在内的高危漏洞.攻击者通过构造恶意请求,可以直接绕过登录验证逻辑,伪装为系统管理身 ...

  5. 泛微 e-cology OA 前台SQL注入漏洞

    0x00概述 该漏洞是由于OA系统的WorkflowCenterTreeData接口在收到用户输入的时候未进行安全过滤,oracle数据库传入恶意SQL语句,导致SQL漏洞. 0x01影响范围 使用o ...

  6. 蓝凌OA常用表整理

    SELECT * FROM V_FI_ORG_EMP  --用户表视图(关联单位)SELECT * FROM FI_ORG_EMP  --用户表 SELECT * FROM FI_ORG_INFO   ...

  7. 泛微 e-cology OA 前台SQL注入

    poc https://github.com/AdministratorGithub/e-cology-OA-SQL 用法:python elog_sql.py http://target 不存在返回 ...

  8. DBShop前台RCE

    前言 处理重装系统的Controller在判断是否有锁文件后用的是重定向而不是exit,这样后面的逻辑代码还是会执行,导致了数据库重装漏洞和RCE. 正文 InstallController.php中 ...

  9. 某cms最新版前台RCE漏洞(无需任何权限)2020-03-15

    漏洞文件:application/common/controller/Base.php 中的 getAddonTemplate 方法: 错误的使用了public,导致我们可以直接外部访问. 然后使用了 ...

  10. WeCenter (最新版) 前台RCE漏洞 (2020-02-22)

    漏洞通过phar触发反序列化漏洞. 触发点:./models/account.php 中的 associate_remote_avatar 方法: 搜索全局调用了该方法的地方: ./app/accou ...

随机推荐

  1. 深入理解Hadoop读书笔记-1

    背景 公司的物流业务系统目前实现了使用storm集群进行过门事件的实时计算处理,但是还有一个需求,我们需要存储每个标签上传的每条明细数据,然后进行定期的标签报表统计,这个是目前的实时计算框架无法满足的 ...

  2. 未给任务“SignFile”的所需参数“CertificateThumbprint”赋值.

    问题重现 一个项目发布时错误如下错误: 解决方法 打开项目属性-签名 方式一 [取消勾选]为 ClickOnce 清单签名 - 简单粗暴 方式二 [勾选]为 ClickOnce 清单签名 创建测试证书 ...

  3. window下配置多个Git账号

    三步完成配置一台电脑下多git账号配置 1.生成密钥 git客户端安排好后,打开git Bash,生成SSH key. ssh-keygen -t rsa -C "user1111@emai ...

  4. 解决github页面打不开 页面加载慢,注册不了显示Unable to verify your captcha response...

    解决国内打开Github页面.注册等问题 下列方法可以解决: github网站页面打不开: github页面打开慢,偶尔打不开,部分页面链接也打不开: 注册不了github账号,找回密码失败等,显示U ...

  5. SparkSql 写 Es

    官方文档 key 备注 es.write.operation index(默认)添加新数据,旧数据被替换,重新索引;create添加新数据,数据存在抛出异常;update 更新现有数据,不存在抛出异常 ...

  6. vscode配置xdebug断点调试thinkphp

    vscode配置xdebug断点调试thinkphp其实和配置其他php框架的断点调试一样,步骤如下: 下载xdebug,重命名为php_xdebug.dll并移动到php.ini目录: (不知道下载 ...

  7. Fortify工具安装以及使用

    ​工具简介: Fortify是一款强大的静态代码扫描分析工具,其发现代码漏洞缺陷的能力十分强悍,主要是将代码经过编译,依托于其强大的内置规则库来发现漏洞的.Fortify 是一个静态的.白盒的软件源代 ...

  8. python-docx styles(样式)的用法

    doc=Document()#创建一个空白文档 p=doc.add_paragraph()#给文档增加一个段落 p.paragraph_format.space_before=Pt(0)#设置段落 段 ...

  9. windows 隐藏桌面了解此图片

    1. 桌面上有了解此图片图标无法删除 这是因为在windows背景设置中选择了Window聚焦. 如果想关闭可以选择其他选项.如果不想关闭Window聚焦还想隐藏桌面了解此图片图标,可以参考下面设置. ...

  10. CUDA:页锁定内存(pinned memory)和按页分配内存(pageable memory )

    CUDA架构而言,主机端的内存分为两种,一种是可分页内存(pageable memroy), 一种是页锁定内存(page-lock或 pinned). 可分页内存是由操作系统API malloc()在 ...