XXE
XXE
全称为XML Enternal Entity Injection,中文名称:XML外部实体注入
XXE漏洞
DTD引用外部实体时导致的漏洞
解析时未对XML外部实体加以限制,攻击者可以将恶意代码注入到XML中,导致服务器加载恶意的外部实体引发文件读取,SSRF,命令执行等
特征:在HTTP的Request报文出现一下请求报文,即表明此时是采用XML进行数据传输,就可以测试是否存在XML漏洞
Content-type:text/xml application/xml
XML
什么是xml
xml(可扩展标记语言 ):用于储存,传输和重建任意数据的标记语言和文件格式
XML 是一种提供规则来定义任何数据的标记语言
表述文档信息
<?xml version="1.0" encoding="UTF-8"?>
每个XML文件都必须有一个根元素
XML注入
- 当系统对用户输入"<",">"没有做转义的处理,可以修改XML的数据格式,或者添加新的XML节点,形成攻击
注入攻击
当注册访问用户时(用户自己输入用户名)
所以攻击注入时 可构造 user1</user><user role="admin">user2
,用来拼接XML
防护
白名单:用正则 对用户的输入做严格的校验
实体引用
实体就好比变量,必须在DTD中定义申明,
DTD文档类型定义
XXE存在的地方,合法的XML文档构建模块,可以被声明在XML文档中,也可以作为一个外部的引用
1.内部DTD文档
<!DOCTYPE 根元素[定义内容]>
2.外部DTD文档
<!DOCTYPE 根元素 SYSTEM "DTD文件路径">
3.内外部DTD文档结合
<!DOCTYPE 根元素 SYSTEM "DTD文件路径" [定义内容]>
外部实体
外部实体比内部实体多一个system
%xxe执行后会加载外部实体 evil.dtd 并执行,得到的结果会放在
DTD内部引用实体值(参数),格式:%参数
实例
XXE漏洞利用
XXE同SQ类似 分有回显和无回显
有回显的情况可以直接在页面中看到payload的执行结果或现象,无回显的情况又称为 blind xxe(类似于布尔盲注、时间盲注)
文件读取
有回显
测试源码
payload
无回显
两种参考模板
利用协议 php://filter
来获取文件的内容(无法直接查看文件内容)
命令执行
php环境下安装expect扩展
payload
SSRF
SSRF的触发点通常是在ENTITY实体中
paylaod
绕过
- ENTITY、SYSTEM、file等关键词被过滤,可以采用编码的方式进行绕过,16进制等等
- 若http被过滤,可以采用data://协议、file://协议、php://filter协议等等绕过