Skip to main content

1.12 | XXE

🛡 XXE Mitigation - Cách Phòng Chống XXE

1️⃣ Kiểm soát và xác thực đầu vào

  • Chỉ chấp nhận dữ liệu XML từ nguồn tin cậy.
  • Kiểm tra nội dung XML trước khi xử lý.
  • Không cho phép người dùng nhập trực tiếp XML.

2️⃣ Cấu hình XML Parser để vô hiệu hóa DTD và External Entities

Trong Java, bạn có thể tắt DTD bằng cách:

XMLInputFactory xif = XMLInputFactory.newFactory();
xif.setProperty(XMLInputFactory.SUPPORT_DTD, false); // Tắt hỗ trợ DTD

Nếu không thể vô hiệu hóa hoàn toàn DTD, hãy chặn external entities:

XMLInputFactory xif = XMLInputFactory.newFactory();
xif.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false); // Chặn external entities
xif.setProperty(XMLInputFactory.SUPPORT_DTD, true); // Chỉ cho phép DTD nội bộ

Lưu ý: Các thư viện XML khác nhau sẽ có cách cấu hình khác nhau. Hãy kiểm tra theo thư viện bạn đang dùng.

3️⃣ Kiểm tra Content-Type và Accept Header

  • Chỉ chấp nhận request có Content-Type hợp lệ.
  • Nếu client gửi Accept Header không phù hợp, trả về HTTP 406 Not Acceptable.

Ví dụ trong Spring Boot (Java):

@RequestMapping(value = "/upload", method = RequestMethod.POST, consumes = "application/xml")
public ResponseEntity<String> uploadFile(@RequestBody String xmlData) {
return new ResponseEntity<>("Received", HttpStatus.OK);
}

🔹 Chặn nếu Content-Type không phải XML.

4️⃣ Sử dụng thư viện chống XXE

Một số thư viện hỗ trợ bảo vệ khỏi XXE:

  • OWASP Java XML Parser
  • Jackson for XML (không dùng DOM hoặc SAX trực tiếp)
  • DefusedXml (Python)
  • SafeXmlParser (.NET)

5️⃣ Dùng JSON thay vì XML nếu có thể

Nếu ứng dụng không bắt buộc dùng XML, hãy cân nhắc sử dụng JSON, vì JSON không hỗ trợ các thực thể XML (<!ENTITY>), giảm thiểu rủi ro XXE.

🔒 Tổng kết

Kiểm tra và xác thực dữ liệu đầu vào
Vô hiệu hóa DTD và External Entities trong parser
Kiểm tra Content-Type và Accept Header
Sử dụng thư viện XML an toàn
Ưu tiên JSON thay vì XML nếu có thể

Bằng cách áp dụng các biện pháp trên, bạn có thể giảm thiểu nguy cơ bị tấn công XXE! 🚀