用户
搜索
  • TA的每日心情
    开心
    2018-1-2 10:27
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]偶尔看看

    i春秋-核心白帽

    Rank: 4

    68

    主题

    88

    帖子

    993

    魔法币
    收听
    0
    粉丝
    15
    注册时间
    2016-6-6
    发表于 2018-4-28 13:57:08 433794

    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实例的par**ml方法来处理。并赋给Comment类的comment实例,说明经过par**ml方法处理后的类型为comment,最后comments.addComment(comment, false);来添加评论。

    查看源码文件Comments.java在代码62~75行,描述了par**ml如何处理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文件,内容如下:

    构造xmlString 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-5-3 14:53:20
    请问是怎么实现webgoat动态调试的
    使用道具 举报 回复
    发表于 2018-5-5 19:00:55
    使用道具 举报 回复
    学习一下 辛苦
    使用道具 举报 回复
    发表于 2018-6-19 17:53:17
    remtf 发表于 2018-5-3 14:53
    请问是怎么实现webgoat动态调试的

    去github上下载项目然后直接intellij里面跑起来就行了。。反正我是这么怼的
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册