前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >代码审计| WebGoat源码审计之XXE注入

代码审计| WebGoat源码审计之XXE注入

作者头像
漏斗社区
发布2018-05-15 14:48:14
3.5K0
发布2018-05-15 14:48:14
举报
文章被收录于专栏:漏斗社区

WebGoat是一个基于java写的开源漏洞靶场,本期带来WebGoat的XXE注入攻击例子及相对应的JAVA源码审计。

上一期带来的是WebGoat关于SQL注入的审计文章。我们知道所谓的注入就是用户的输入被当成了代码或者是命令来执行或解析。同理,XXE注入是因为用户的输入被程序当成XML语言解析。

0x01 关于XXE注入

注入产生的危害取决于所注入的语言能做什么样的事情。那XML能做什么事情能产生何种危害?

1. 关于XML

XML 是指可扩展标记语言 (eXtensible Markup Language),允许用户自定义标签。我们比较熟知的HTML一般用来显示数据,而XML通常用来表示数据,在实际项目中,XML经常被用作于程序的配置文件和数据的存储文件。

2.关于约束XML书写的DTD

虽然XML允许用户自定义标签,但是XML中只要出现小小的书写错误,程序就不能正确地获取文件内容而报错,所以需要有一个文档来规范XML的书写规范,这个文档被称之为约束。

常用的XML约束技术有 XML DTD(文档类型定义),XML Schema等。 下面是DTD定义XML实体(entity)的一个例子:

当在XML或DTD中引用实体&js;,解析器都会将实体中定义的值替换它。

当XML的DTD用户可控,就可以通过DTD定义XML实体实施攻击。

0x02 WebGoat上的XXE注入

WebGoat有处功能允许用户对图片发出自己的评论,要求我们利用XXE注入漏洞列出该服务器的root目录。

填写一段评论test a comment并且提交:

可以发现,请求的地址为/WebGoat/xxe/simple ,POST 请求的正文是一个标准格式的XML:

<?xml version="1.0"?><comment><text>test a comment</text></comment>

既然这边的XML可以通过BURP来自定义,那么我们结合DTD构造一个可以读取文件的XML。

读取/etc/passwd文件,&reborn为构造的实体,取值后会返回在<text></text>标签内容中最终显示在评论上。

代码语言:javascript
复制
<?xml version='1.0'?>
<!DOCTYPE any[<!ENTITY reborn SYSTEM "file:///etc/passwd">]>
<comment>
<text>&reborn;</text>
</comment>

查看评论:

在JAVA中,file://协议不仅可以读取文件,还可以列目录。

查看评论:

0x03 WebGoat上的XXE注入代码分析

1. Spring Boot框架了解

WebGoat采用的是Spring Boot的微服务框架。所以处理各种请求时,是通过里面的注解。

查看源码文件WebGoat\webgoat-lessons\xxe\src\main\java\org\owasp\webgoat\plugin\SimpleXXE.java代码中的第53~79行,处理了我们发往/WebGoat/xxe/simple 的POST 请求。

其中的类似@Xxxx 的是各种注解,如: @AssignmentPath("xxe/simple") 接收并处理发往xxe/simple的HTTP请求。 @Autowired 控制如何完成自动连接或加载。 @RequestMapping(method = POST, consumes = ALL_VALUE, produces = APPLICATION_JSON_VALUE)配置url映射。 @ResponseBody表示该方法的返回结果直接写入 HTTP返回包的正文中。 (@RequestBody String commentStr)表示将请求中的数据写入到commentStr这个String对象中。

2. 代码执行流程分析

可以发现,首先是在第63行代码,加载了一个Comments类的实例comments,该类文件为:WebGoat\webgoat-lessons\xxe\src\main\java\org\owasp\webgoat\plugin\Comments.java

在第67行代码,createNewComment实例中,接收POST请求正文中的内容赋值给commentStr这个字符串对象。

在第70行代码,将commentStr交给comments实例的parseXml方法来处理。并赋给Comment类的comment实例,说明经过parseXml方法处理后的类型为comment,最后comments.addComment(comment, false);来添加评论。

查看源码文件Comments.java:在代码62~75行,描述了parseXml如何处理commentStr。

3. xml字符串被解析分析 那么我们此处是有XXE注入的,哪个位置解析了XML呢? 在代码的72~74行,此处创建一个Unmarshaller对象。返回的值是xml经过unmarshal方法处理的值。由于unmarshal在执行过程中解析了XML,导致XXE注入。此处设置到JAXB的相关知识,可以了解一下。

0x04 JAXB将XML转成对象时导致XXE注入

JAXB是什么?简单来说,JAXB提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。

1. JDK中JAXB相关的重要Class和Interface: JAXBContext是应用的入口,用于管理XML/JAVA绑定信息。 Marshaller接口,将Java对象序列化为XML数据。 Unmarshaller接口,将XML数据反序列化为Java对象。

2. Unmarshaller接口将XML数据范序列化为Java对象的例子

斗哥这里在IDE里建立了一个名为jaxb_test的java项目,在jaxb包下,分别写了两个Java类,一个是Comments.java,另一个是Comment.java。

在Comments.java文件做了3件事情:

1.获取一个JAXBContext的实例名为jc。

2.JAXBContext创建一个Unmarshaller对象。

3.执行unmarshaller方法得到comment。

newInstance里面传入的是一个class,也就是Comment这个类。 unmarshaller里面传入的是一个xml的字符串,也就是xml。 这个xml目前为: String xml = "<?xml version='1.0'?><comment><text>a test comment!!</text></comment>"; 打印comment.text结果为:

在桌面建立一个passwd.txt文件,内容如下:

构造xml为String xml = "<?xml version='1.0'?><!DOCTYPE any[<!ENTITY reborn SYSTEM 'file:///C:/Users/Administrator/Desktop/passwd.txt'>]><comment><text>&reborn;</text></comment>";

打印comment.text结果为:

当把xml格式的字符串传递给Unmarshaller接口转变成Java对象时,会解析一遍xml,如果传入的值可控就会导致XXE注入攻击。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-04-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 漏斗社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云代码分析
腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档