+1

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

II. Phân tích và khai thác các lỗ hổng XXE injection (tiếp)

8. Tấn công XInclude khai thác lỗ hổng XXE

Một số trang web không trực tiếp nhận dữ liệu XML từ người dùng, mà nhúng các dữ liệu người dùng vào document XML. Điều này khiến kẻ tấn công không thể chỉnh sửa payload XML theo mong muốn.

Ví dụ khi dữ liệu do người dùng gửi được hệ thống kết hợp vào một SOAP backend request, sau đó được xử lý bởi SOAP backend. Nên chúng ta không thể thực hiện tấn công XXE theo các hình thức được đề cập phía trên do không thể kiểm soát nội dung toàn bộ document XML, dẫn đên không thể tự định nghĩa hoặc làm thay đổi tính năng DOCTYPE. XInclude là một giải pháp tốt để thay thế các phương pháp tấn công phía trên, do XInclude là một phần của đặc tả XML cho phép tạo một document XML từ các sub-documents.

Ví dụ sử dụng XInclude thực hiện bao hàm một file text license.txt, phương pháp thực hiện như sau:

<?xml version="1.0"?>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:xi="http://www.w3.org/2001/XInclude">
   <head>...</head>
   <body>
      ...
      <p><xi:include href="license.txt" parse="text"/></p>
   </body>
</html>

Payload sử dụng XIclude truy xuất nội dung file /etc/passwd:

<foo xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include parse="text" href="file:///etc/passwd"/></foo>

Lưu ý rằng chúng ta cần thêm thuộc tính parse="text" và xmlns là một XML namespaces cung cấp url là một địa chỉ chứa file Xinclude XML.

Phân tích lab Exploiting XInclude to retrieve files

image.png

Miêu tả: Chức năng "Check stock" của trang web nhúng input từ người dùng vào một server-side XML document sau đó thực hiện phân tích cú pháp. Để hoàn thành bài lab, chúng ta cần inject một XInclude statement nhằm truy xuất nội dung tệp /etc/passwd.

Quan sát request khi sử dụng tính năng Check stock:

image.png

Nhập giá trị %26 (URL encode của ký tự &) cho tham số productId:

image.png

Response trả về thông báo lỗi "Entities are not allowed for security reasons" cho thấy trang web chứa quá trình phân tích cú pháp XML.

Sử dụng kỹ thuật tấn công XInclude, payload như sau:

productId=<foo+xmlns%3axi%3d"http%3a//www.w3.org/2001/XInclude"><xi%3ainclude+parse%3d"text"+href%3d"file%3a///etc/passwd"/></foo>&storeId=1

Truy xuất nội dung tệp /etc/passwd thành công:

image.png

image.png

9. Lỗ hổng XXE trong upload file

Trong các chức năng upload có thể hệ thống thực hiện xử lý các tệp tin upload bởi người dùng. Một số định dạng tệp sử dụng XML hoặc chứa các thành phần XML như .docx hoặc ảnh .svg nếu cho phép upload có thể dẫn đến những rủi ro nhất định.

Xét trường hợp hệ thống sử dụng thư viện xử lý hình ảnh hỗ trợ định dạng ảnh SVG. Kẻ tấn công có thể chèn các payload XML vào trong hình ảnh mallicious.svg nhắm vào quá trình phân tích cú pháp trong hệ thống nhằm thực hiện các hành vi phá hoại.

Phân tích lab Exploiting XXE via image file upload

image.png

Miêu tả: Trang web sử dụng thư viện Apache Batik để xử lý hình ảnh upload từ người dùng. Để hoàn thành bài lab, chúng ta cần chèn payload khai thác lỗ hổng XXE vào hình ảnh upload để sau khi trang web thực hiện xử lý hình ảnh, chúng ta có thể đọc được nội dung tệp /etc/hostname.

Chức năng bình luận cho phép người dùng upload file với định dạng .svg

image.png

Tạo một file .svg với nội dung:

<?xml version="1.0" standalone="yes"?><!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/hostname" > ]><svg width="128px" height="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"><text font-size="16" x="0" y="16">&xxe;</text></svg>

Trong đó định nghĩa một entity xxe chứa nội dung tệp /etc/hostname và hiển thị nội dung ra ảnh với kích thước theo ý.

image.png

Truy cập ảnh vừa upload chúng ta thu được nội dung tệp /etc/hostname, submit và hoàn thành bài lab:

image.png

image.png

III. Một số phương pháp ngăn chặn lỗ hổng XXE injection

Lỗ hổng XXE xảy ra do quá trình phân tích cú pháp XML từ hệ thống thiếu các bước kiểm tra dữ liệu đầu vào. Dẫn đến kẻ tấn công có thể lợi dụng điều này tự khai báo, định nghĩa các entity, DTD hoạt động với mục đích khác. Cùng xem xét một số phương pháp phòng chống sau:

1. Thêm filter cho các ký tự &, %

Khi kẻ tấn công không được phép sử dụng các ký tự &, % thì họ cũng không thể định nghĩa các entity cũng như external DTD nguy hiểm. Nhà phát triển có thể thay thế, loại bỏ hoặc trực tiếp từ chối các request có dấu hiệu tấn công bằng cách kiểm tra các ký tự này trong dữ liệu XML. Ví dụ đoạn code sau ngăn chặn dữ liệu XML chứa các ký tự &% bằng hàm strpos()

// filter character & and %
if (strpos($xmlfile, '&') || strpos($xmlfile, '%')) {
	$result = sprintf("<result><msg>Invalid character found!</msg></result>");
        // block ...
}

2. Vô hiệu hóa external entity

Có thể phương pháp ngặn chặn các ký tự đặc biệt gây ra một số rắc rối không cần thiết trong một vài trường hợp khi dữ liệu đầu vào cần cho phép các ký tự này. Chúng ta có thể vô hiệu hóa các external entities bằng các hàm trong ngôn ngữ lập trình cụ thể. Ví dụ:

  • Hàm libxml_disable_entity_loader() trong PHP:
libxml_disable_entity_loader(true);

Trong ngôn ngữ JAVA:

DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);

.setFeature("http://apache.org/xml/features/disallow-doctype-decl",true);

.setFeature("http://xml.org/sax/features/external-general-entities",false)

.setFeature("http://xml.org/sax/features/external-parameter-entities",false);
  • etree thuộc thư viện lxml trong Python:
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

3. Không hỗ trợ XInclude

Lưu ý trong việc lựa chọn các thư viện, công nghệ có hỗ trợ XInclude.

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í