专栏首页漏斗社区代码审计| WebGoat源码审计之XXE注入

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

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>标签内容中最终显示在评论上。

<?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注入攻击。

本文分享自微信公众号 - 漏斗社区(newdooneSec),作者:reborn

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-04-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 歪?我想要一个XXE。

    0x00 背景 近期看到OWASP TOP 10 2017 版中添加了XXE的内容便对XXE的一些知识进行梳理和总结,XXE可以使用例如http,file等协...

    漏斗社区
  • 点击!AWD攻防解题技巧在此!

    背景 这周,给各位带来AWD攻防源码分析。在百越杯CTF比赛中,小学弟通过抓取访问日志得到漏洞利用的方法,于是斗哥决定拿到源码,分析题目的考点,为小伙伴们排忧...

    漏斗社区
  • 代码审计|禅道7.3SQL注入复现

    上周的zentaopms漏洞复现你们觉得还OK吗? 斗哥想要的是一个肯定。 如果你们觉得意犹未尽, 本期将进入, 代码审计的小练习。 Zentaopms v7....

    漏斗社区
  • PHP处理XML数据

    生活中我们或多或少会遇到处理 XML 的数据,比如微信开发、或者我们传递一些数据比较多的内容,XML 是个不错的选择,但是通常XML需要处理,需要我们转换成数组...

    hedeqiang
  • shiro教程3(加密)

      加密,是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已加密的信息,但因不知解密的方法,仍然无法了解信息的内容

    用户4919348
  • Phoenix Framework — 新一代的实时 Web 框架

    时见疏星
  • Struts2知识整理

    struts2简介 struts2是基于mvc开发模型的框架,属于表现层框架 核心为拦截器 struts2框架的特点 基于MVC,结构清晰 丰富的标签库,提高了...

    李家酒馆酒保
  • 破解之美:利用ECB加密缺陷突破cookie加密

    密码学诞生于古人类社会,例如古希腊斯巴达的密码棒、欧洲中世纪时期的密码栏、阿伯提发明的密码盘等。古代的密码学是一门加密隐蔽的学科,而现代密码学定义为加密与解密,...

    FB客服
  • 禁止server 2008域端口的脚本

    netsh advfirewall firewall set rule name=all protocol=TCP dir=in localport=9389 ...

    力哥聊运维与云计算
  • react全家桶 NodeJS MongoDB搭建实时聊天的app

    ? GitHub: https://github.com/majunchang/reachChatApp

    念念不忘

扫码关注云+社区

领取腾讯云代金券