XML External Entity Processing
Trong bài viết này, chúng ta sẽ tìm hiểu kỹ thuật tấn công vào các ứng dụng có xử lý dữ liệu XML, đó là XML External Entity Processing. Khai thác lỗ hổng này ta có thể có quyền đọc các file trong hệ thống
2. XML và khai báo entity
a. XML
XML là một ngôn ngữ đánh dấu mở rộng, được ứng dụng rất rộng rãi. Nó sử dụng để trao đổi dữ liệu giữa các ứng dụng. Hiện nay có rất nhiều loại tài liệu sử dụng định dạng XML như rtf, pdf, tệp hình ảnh (svg) hay các file cấu hình
b. External Entity
Cấu trúc XML được chia thành 2 phần:
- Prolog (header): Chứa các thông tin về phiên bản XML, bộ mã sử dụng và các khai báo định kiểu tài liệu (DTD) để khai báo cấu trúc và kiểu dữ liệu. Trong phần mô tả DTD có thể sử dụng các khai báo entity (giống như khai báo biến để sử dụng trong nội dung XML)
Ví dụ:
Mã:
&pwd;
Khai báo external entity chính là điểm mấu chốt trong kỹ thuật tấn công XXE
- Document Element: Đây là phần nội dung chính của tài liệu XML
3. Kỹ thuật khai thác
Kỹ thuật tấn công này dựa vào việc cho phép khai báo External Entity trong phần DTD của dữ liệu XML, attacker có thể khai báo một entity để đọc nội dung của file bất kỳ trong hệ thống nếu trình phân tích XML (parser) được cấu hình không tốt
Kịch bản cụ thể:
Attacker gửi một request với dữ liệu XML, trong phần khai báo DTD có khai báo thực thể để đọc file /etc/passwd trong hệ thống
Mã:
< demo >&pwd;
Ví dụ như trong trường hợp trên thì phần nội dung XML (trong thẻ demo) phải được hiển thị cho người dùng. Các chương trình trả về kết quả như vậy thường là các XML Validator
Kỹ thuật Out-Of-Band
Tuy nhiên trên thực tế có rất nhiều ứng dụng xử lý dữ liệu XML nhưng lại không trả về dữ liệu trực tiếp cho người dùng. Do đó cần sử dụng một kỹ thuật khác để có thể khai thác lỗ hổng này mà ứng dụng không cần trả về dữ liệu trực tiếp. Đó là kỹ thuật XML Out-of-Band Data Retrieval (được giới thiệu lần đầu tại Blackhat EU 2013)
Quá trình khai thác lỗ hổng này:
[1] Attacker khởi tạo một request có chứa dữ liệu XML (Content-Type: text/xml) và gửi đến server (có ứng dụng bị lỗi). Nội dung phần mô tả có khai báo đến một file DTD bên ngoài (nằm trên server của attacker)
Mã:
&e1;
[2] [3] Server gửi yêu cầu lấy file dtd trên server của attacker và nhận lại kết quả
Nội dung file evil.dtd:
Mã:
%p2;
[4] Khi ứng dụng thực hiện phân tích dữ liệu XML với phần DTD như trên, trình phân tích XML sẽ đọc nội dung tệp /etc/passwd trong hệ thống và gán vào biến p1. Sau đó một biến p2 khác được tạo chứa liên kết đến server attacker và giá trị của p1 (là nội dung file /etc/passwd). Sau đó nó sẽ in giá trị của p2 thông qua khai báo %p2.
Kết quả sau khi phân tích DTD ta có:
Mã:
[5] Thông tin sau quá trình phân tích chứa nội dung file /etc/passwd được gửi về cho server của attacker
4. Phòng tránh
Để tránh bị khai thác lỗ hổng này thì cần cấu trình trình phân tích XML Parser không cho phép sử dụng khai báo external entity trong phần định kiểu tài liệu DTD
Tài liệu tham khảo
http://www.w3.org/XML/
https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Processing
http://resources.infosecinstitute.com/xxe-attacks/
https://pentesterlab.com/exercises/play_xxe/course
https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf