xxe_lab详解
环境搭建
php_xxe直接放在php环境下即可
前置知识
XXE全称XML External Entity Injection,也就是XML外部实体注入攻击,是对非安全的外部实体数据进行处理时引发的安全问题。要想搞懂XXE,肯定要先了解XML语法规则和外部实体的定义及调用形式。
XML语法规则如下:
-
所有的XML元素都必须有一个关闭标签
-
XML标签对大小写敏感
-
XML必须正确嵌套
-
XML属性值必须加引号””
-
实体引用(在标签属性,以及对应的位置值可能会出现<>符号,但是这些符号在对应的XML中都是有特殊含义的,这时候我们必须使用对应html的实体对应的表示,比如<符号对应的实体就是lt,>符号对应的实体就是gt)
-
在XML中,空格会被保留(案例如:
<p>
a空格B</p>
,这时候a和B之间的空格就会被保留)
<bookstore> <!--根元素-->
<book category="COOKING"> <!--bookstore的子元素,category为属性-->
<title>Everyday Italian</title> <!--book的子元素,lang为属性-->
<author>Giada De Laurentiis</author> <!--book的子元素-->
<year>2005</year> <!--book的子元素-->
<price>30.00</price> <!--book的子元素-->
</book> <!--book的结束-->
</bookstore> <!--bookstore的结束-->
以上部分转自
https://www.freebuf.com/vuls/175451.html
DTD – 实体(重要)
实体是用于定义引用普通文本或特殊字符的快捷方式的变量。
实体引用是对实体的引用。
实体可在内部或外部进行声明。
攻击套路
能发起url请求的话,就可以进行无回显的操作了
当外部实体被禁用的时候,可以使用这个来进行ssrf,
参数实体
参数实体以%开头 我们使用参数实体只需要遵循两条原则:
1.参数实体只能在DTD声明中使用。 2.参数实体中不能再引用参数实体。
在引用实体的格式中需要编码用%代替 %,由于嵌套引用外部参数实体,如果直接利用%,在引用的时候会导致找不到该参数实体名称
php_xxe
直接抓包
发现头部Accept: application/xml,
解析了xml
那我们就试试
读取后进行回显,在元素中引用外部实体参数&test
无回显就需要外带了,
注意
由于xml对格式要求严格,为了不打破他的格式,通常使用php base64
PHP://filter/read=convert.base64-encode/resource=文件
java_xxe
python_xxe
Csharp_xxe
防御
直接使用开发语言提供的禁用外部实体的方法
这样其实没法防御 xml 制造的 ssrf
PHP:
libxml_disable_entity_loader(true);
JAVA:
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
Python:
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
过滤用户提交的 xml 数据
敏感关键词: <!DOCTYPE 、 <!ENTITY、SYSTEM、PUBLIC