某凌 EKP 前台远程命令执行漏洞分析
字数 1408 2025-08-24 16:48:07
某凌 EKP 前台远程命令执行漏洞分析
漏洞描述
某凌 EKP 是由深圳市某凌软件股份有限公司开发的一款面向中小企业的移动化智能办公产品。该系统存在远程命令执行漏洞,攻击者能够借助 sysUiComponent 接口的 replaceExtend 方法,将 dataxml.jsp 后台命令执行漏洞转化为前台命令执行漏洞。
影响版本
- version = V16
漏洞分析
前置漏洞(后台 dataxml.jsp RCE)
该漏洞属于后台 dataxml.jsp 远程命令执行的前台绕过版本。后台漏洞原理如下:
- 执行了
treeBean的getDataList方法,并传入请求参数 SysFormulaSimulateByJS类继承了IXMLDataBean,其getDataList方法通过FormulaParser#parseValueScript()执行传入的 script 脚本- 虽然禁用了 unicode 和一些黑名单,但未禁用
Runtime.exec和ProcessBuilder,因此仍可执行命令
利用方式:
s_bean=sysFormulaSimulateByJS&script=var x = Function/**/('return(java.lang.Runtime.getRuntime())')();x.exec("calc.exe");var a = mainOutput();function mainOutput() {};
权限绕过机制
系统后来增加了权限校验(WEB-INF/KmssConfig/sys/authentication/spring.xml),匿名用户仅允许访问特定接口:
<property name="anonymousPaths">
<value>
/login*.jsp*; /resource/**; /service/**; /ui-ext/**; /*/*.index; /logout*; /admin.do*;
/browser.jsp*;/third/dingrobot/dingrobotCover.do*;
/axis/*; /kk*; /forward.html*; /sys/webservice/*;
/vcode*;/sys/authentication/validate*;/ui-ext/scormcourse/**;/*.txt;
/sys/print/word/file/**;/elec/rmkk/rmkk.do*;/elec/yqq/callback.do*;/sys/person/image.jsp*;/elec/sgt/callback.do*;/hr/recruit/invite_qr_code/*;
/sysInfo*;/data/sys-attachment/sysJgWebOffice/execute;/sys/anonymous/enter/token.do*;/**/*.woff2;/**/*.woff;/**/*.ttf;/**/*.svg;/**/*.eot
</value>
</property>
漏洞绕过(前台 RCE)
在 V16 版本中引入了 SysUiComponent,但在 design.xml (WEB-INF/KmssConfig/sys/ui/design.xml) 和 spring.xml 中忘记添加鉴权,导致可调用 SysUiComponentAction#getThemeInfo 进行文件上传。
漏洞利用流程:
- 通过
SysUiComponentAction#replaceExtend()将dataxml.jsp所在目录的文件复制到可访问目录 - 调用
SysUiComponentService#replaceExtend()获取两个参数值 - 删除
extendId目录,然后将folderName目录的文件复制过来 - 通过
copyDirectory方法递归复制目录内容
关键代码分析:
public static void copyDirectory(File srcDir, File destDir, FileFilter filter, boolean preserveFileDate) throws IOException {
// 检查源目录和目标目录的有效性
checkFileRequirements(srcDir, destDir);
if (!srcDir.isDirectory()) {
throw new IOException("Source '" + srcDir + "' exists but is not a directory");
}
else if (srcDir.getCanonicalPath().equals(destDir.getCanonicalPath())) {
throw new IOException("Source '" + srcDir + "' and destination '" + destDir + "' are the same");
}
else {
// 执行实际的目录复制操作
doCopyDirectory(srcDir, destDir, filter, preserveFileDate, exclusionList);
}
}
路由分析
通过分析配置文件 /WEB-INF/KmssConfig/sys/ui/spring-mvc.xml:
<bean
name="/sys/ui/sys_ui_component/sysUiComponent.do"
class="com.landray.kmss.sys.ui.actions.SysUiComponentAction"
lazy-init="true"
parent="KmssBaseAction">
<!-- 配置详情省略 -->
</bean>
访问方式:
- URL:
/sys/ui/sys_ui_component/sysUiComponent.do - 类:
com.landray.kmss.sys.ui.actions.SysUiComponentAction
调用特定方法:
要调用 replaceExtend() 方法,需要在URL中添加 method 参数:
/sys/ui/sys_ui_component/sysUiComponent.do?method=replaceExtend
漏洞利用
构造PoC的关键是将 dataxml.jsp 所在的目录 /sys/common 通过目录穿越复制到匿名用户可访问的Web目录。
修复建议
- 在
design.xml和spring.xml中为SysUiComponent添加适当的鉴权配置 - 限制
replaceExtend方法的目录操作权限 - 对
dataxml.jsp的执行权限进行严格限制 - 更新系统至最新安全版本