利用解析差异复活某凌OA前台RCE

admin 2025年6月25日00:22:13评论13 views字数 4455阅读14分51秒阅读模式

前言

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)

利用解析差异复活某凌OA前台RCEcom.landray.kmss.sys.config.design.SysConfigs#loadAuthValidator

利用解析差异复活某凌OA前台RCE通过路径获取对应的模块

利用解析差异复活某凌OA前台RCE根据模块对应的授权配置匹配路径

利用解析差异复活某凌OA前台RCEcom.landray.kmss.sys.config.design.SysCfgQuery#match

利用解析差异复活某凌OA前台RCE此处为参数级权限校验,这个漏洞出现的原因其实就是/sys/ui/模块默认无需鉴权,开发在这个模块新增了一个路由这个路由的命名正好也没匹配到其他的path,开发也忘记在xml里添加相应的鉴权配置,导致这个路由可以直接前台访问。

解析差异

在2023-06-09官方就已经修复了这个漏洞,修复方法为在xml里配置了鉴权。WEB-INF/KmssConfig/sys/ui/design.xml利用解析差异复活某凌OA前台RCE我们注意到这个地方使用的参数级鉴权,只有method等于某些特定值的时候才需要鉴权。 我们重新回到对于参数级权限校验处理的方法com.landray.kmss.sys.config.design.SysCfgQuery#match这个地方会获取method参数的值然后和配置里的比较利用解析差异复活某凌OA前台RCE跟入com.landray.kmss.common.actions.RequestContext#getParameter利用解析差异复活某凌OA前台RCE他这里就是用的tomcat的getParameterMap获取参数map然后获取值。 我们看后面调用方法的时候,他是怎么获取的。com.landray.kmss.common.actions.BaseAction#getMethodName利用解析差异复活某凌OA前台RCE这里传入的request可以由我们在org.springframework.web.servlet.DispatcherServlet#doDispatch里改变利用解析差异复活某凌OA前台RCE利用解析差异复活某凌OA前台RCE利用解析差异复活某凌OA前台RCE当请求为POST且Content-Type以multipart/开头request即为DefaultMultipartHttpServletRequest所以当我们以上传格式传入method利用解析差异复活某凌OA前台RCE验证权限的时候获取不到method参数的值,而查找调用方法时可以找到。 所以只需使用form-data格式传入method即可绕过权限校验复活这个漏洞。

漏洞利用

/sys/ui/sys_ui_component/sysUiComponent.do路由在WEB-INF/KmssConfig/sys/ui/spring-mvc.xml处定义利用解析差异复活某凌OA前台RCE找到对应存在漏洞的方法com.landray.kmss.sys.ui.actions.SysUiComponentAction#getThemeInfo利用解析差异复活某凌OA前台RCE利用解析差异复活某凌OA前台RCE如果上传文件的后缀为zip的话会进行解压利用解析差异复活某凌OA前台RCE解压的方法里判断目录穿越的情况利用解析差异复活某凌OA前台RCE判断解压的文件里是否包含component.ini,如果包含的话加载ini从中获取id和name最后将一些需要的参数返回利用解析差异复活某凌OA前台RCE然后把刚才解压的内容复制到this.getAppFolder(extendId)利用解析差异复活某凌OA前台RCEextendId是我们刚才解压文件里面component.ini里的值。相当于将我们压缩包的文件解压然后全部复制到web目录的/resource/ui-component/+extendId目录下面 我们将component.ini文件内容填写如下

id=dasdasdasname=testthumb=/thumb.jpg

压缩包的文件解压后将会被复制的/resource/ui-component/dasdasdas/我们制作一个如下压缩包利用解析差异复活某凌OA前台RCE构造数据包使用上传格式传入method的值绕过权限校验,同时上传我们制作好的压缩包即可实现前台RCE

修复

官方于2024-07-26修复了漏洞。利用解析差异复活某凌OA前台RCE修复方式为对/sys/ui/sys_ui_component/sysUiComponent.do添加了默认鉴权 以及在进入鉴权参数判断前对上传格式的数据包进行解析com.landray.kmss.sys.authentication.intercept.FilterInvocationDefinitionSourceImp#getAttributes

利用解析差异复活某凌OA前台RCE

总结

通过分析某凌OA鉴权机制发现其鉴权和最终获取method时存在差异。可以利用spring获取参数时会对form-data格式进行解析获取,而正常使用getParameter获取参数时获取不到form-data里参数的值从而实现鉴权绕过。这种绕过鉴权的方式在smartbi中也出现过,其实在某远OA里也存在。

这种解析差异不止可以用来绕过鉴权,在java里很多时候会使用全局过滤器做sql注入、xss检测。过滤器里使用getParameter获取参数值实际上是获取不到form-data格式里的值的,这种情况可能会被直接绕过全局过滤器检测,所以进行黑盒测试的如果碰到sql注入有代码检测可以直接转为form-data格式进行测试可能会有惊喜。

本文仅供安全研究和学习使用,由于传播、利用此文档提供的信息而造成任何直接或间接的后果及损害,均由使用本人负责,公众号及文章作者不为此承担任何责任。

原文始发于微信公众号(漫漫安全路):利用解析差异复活某凌OA前台RCE

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年6月25日00:22:13
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   利用解析差异复活某凌OA前台RCEhttps://cn-sec.com/archives/4195436.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息