XXE injection
Trong phần này sẽ giải thích XML external entity là gì, miêu tả một số ví phụ phổ biến, giải thích cách tìm và khai thác các loại XXE injection khác nhau và tóm tắt cách ngăn chặn chúng.
XML external entity injection là gì ?
XML external entity ( XXE) injection là một lỗ hổng bảo mật web cho phép kẻ tấn công can thiệp vào quá trình xử lý dữ liệu XML của ứng dụng. Nó thường cho phép kẻ tấn công xem các tệp trên hệ thống tệp của máy chủ ứng dụng và tương tác với bất kì hệ thống back-end hoặc hệ thống bên ngoài nào mà bản thân ứng dụng có thể truy cập.
=> Trong một số trường hợp, attacker có thể leo thang cuộc tấn công XXE để xâm phạm máy chủ bên dưới hoặc cơ sở back-end khác bằng cách tận dụng XXE để thực hiện SSRF.
Lỗ hổng XXE phát sinh như thế nào ?
Một số ứng dụng sử dụng định dạng XML để truyền dữ liệu giữa trình duyệt và máy chủ. Các ứng dụng thực hiện điều này hầu như luôn sử dụng nền tảng API hoặc thư viện tiêu chuẩn để xử lý dữ liệu XML trên máy chủ. Các lỗ hổng XXE phát sinh do XML chứa nhiều tính năng nguy hiểm tiềm ẩn khác nhau và các trình phân tích cú pháp tiêu chuẩn hỗ trợ các tính năng này ngay cả khi chúng không được ứng dụng sử dụng bình thường.
Các kiểu tấn công XXE phổ biến
Exploiting XXE to retrieve files, trong đó một số thực thể bên ngoài được xác định có chứa nội dung của tệp và được trả về trong phản hồi của ứng dụng.
Exploiting XXE to perform SSRF attacks, trong đó một thực thể bên ngoài được xác định dựa trên một URL đến hệ thống back-end.
Exploiting blind XXE exfiletrate data out-of-band, trong đó dữ liệu nhạy cảm được truyền từ máy chủ ứng dụng đến hệ thống mà kẻ tấn công kiểm soát.
Exploiting blind XXE to retrieve data via error messages, nơi kẻ tấn công có thể kích hoạt thông báo lỗi phân tích cú pháp có chứa dữ liệu nhạy cảm.
Exploiting XXE to retrieve files
Để thực hiện một cuộc tấn công XXE injection để lấy một tệp tùy ý từ hệ thống tệp của máy chủ, cần sửa đổi XML đã gửi theo 2 cách:
Chỉnh sửa phần tử DOCTYPE xác định một thực thể bên ngoài chứa đường dẫn đến tệp.
Chỉnh sửa giá trị dữ liệu trong XML được trả về trong phản hồi của ứng dụng, để sử dụng thực thể bên ngoài đã xác định.
Ví dụ: Giả sử ứng dụng mua sắm kiểm tra mức tồn kho của hàng hóa bằng cách gửi XML tới máy chủ:
<?xml version="1.0" encoding="UTF-8"?>
<stockCheck><productId>381</productId></stockCheck>
Ứng dụng không thực hiện biện pháp bảo vệ cụ thể nào trước các cuộc tấn công XXE, vì vậy có thể khai thác lỗ hổng XXE để truy xuất tệp /etc/passwd :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd">]>
<stockCheck><productId>&xxe;</productId></stockCheck>
Payload này xác định một thực thể bên ngoài &xxe; có giá trị là nội dung của tệp /etc/passwd và sử dụng thực thể bên trong giá trị productId.
Thực hành lab: (Level Apprentice)
Tên lab: Exploiting XXE using external entities to retrieve files
Nội dung lab: Lab này có chứa năng kiểm tra hàng tồn kho để phân tích cú pháp đầu vào XML và trả về bất kì giá trị không mong muốn nào trong phản hồi. Để giải quyết, hãy thêm một thực thể bên ngoài để truy xuất nội dung tệp /etc/passwd
Thực hiện lab:
Truy cập lab, thực hiện gửi 1 request Check Stock. Dùng Burp suite để chặn và sửa đổi request đó.
Thêm thực thể bên ngoài và gửi request :
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd">]> <stockCheck> <productId> &xxe; </productId> <storeId> 1 </storeId> </stockCheck>
Trong thực tế, lỗ hổng XXE thường sẽ có một số lượng lớn giá trị dữ liệu trong XML đã gửi, bất kỳ giá trị nào trong số đó có thể được sử dụng trong phản hồi của ứng dụng. Để kiểm tra lỗ hổng XXE một cách có hệ thống, cần phải kiểm tra từng nút dữ liệu trong XML bằng cách sử dụng thực thể đã xác định của bạn và xem liệu thực thể có xuất hiện trong phản hồi hay không.
Last updated