关于xml、DTD

从0到1完全掌握XXE | Drunkbaby’s Blog (drun1baby.top)

XXE-4

image-20231123095315742

这道题是标准的xxe注入,这里不多赘述,主要看看源码探究一下漏洞是如何导致的:

这里需要补充一个知识点:

组件使用总结:使用 JAXB 实现 XML文件和java对象互转 - 掘金 (juejin.cn)

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

image-20231123102310270

这道题实际是看返回的路径中是否包含系统的敏感路径,包含则为成功,这里真正引发xxe的点在parseXml中,我们进去看一看:

image-20231123102520735

结合前面补充的知识,我们知道他进行了一次反序列化,将xml解析成java对象(这里是comment),解析过程中,就触发了我们的payload(这里是file:///读取根目录)

修复

WebGoat代码审计-05-XXE注入 | Drunkbaby’s Blog (drun1baby.top)

产生 XXE 注入是因为解析 XML 时不加任何的限制,那么我们的修复手段讲将支持外部实体和支持dtd都给禁止便可。

XXE-7

现代REST框架 在现代REST框架中,服务器可能能够接受您作为开发人员没有想到的数据格式。因此,这可能会导致JSON端点容易受到XXE攻击。 同样的练习,但尝试执行和第一次作业中相同的XML注入。

根据描述来看,这可能受到修改Content-Type导致的注入攻击,就像文件上传的一些文件格式的绕过一样.

image-20231123104701691

还是要看看源码:

image-20231123105220095

又是parseXml,倒也没什么好说的了

但是这种注入方式有一个问题:我们怎么知道目标是封装在什么类中(这里是封装在comment类中)

image-20231123105753426

我们可以看到,我们随意封装到一个对象中,是无法成功解析的,要进行这样的攻击需要了解额外的信息,在一开始的json字符中,我们能知道的仅仅是输入的内容属于“text”字段:

image-20231123110003923

XXE DDOS

Billion laughs attack - Wikipedia

XXE-11 blind

这里需要补充一些东西:

从0到1完全掌握XXE | Drunkbaby’s Blog (drun1baby.top)

参数实体:

(1)使用 % 实体名(这里面空格不能少) 在 DTD 中定义,并且只能在 DTD 中使用 %实体名; 引用

(2)只有在 DTD 文件中,参数实体的声明才能引用其他实体

(3)和通用实体一样,参数实体也可以外部引用

在某些情况下,您将看不到任何输出,因为尽管您的攻击可能已经奏效,但该字段并没有反映在页面的输出中。或者您试图读取的资源包含非法的XML字符,这会导致解析器失败。

这道题需要通过xxe读取/home/webgoat/.webgoat-8.1.0//XXE/secret.txt这个文件

还是先读一下源码吧:

image-20231123111923003

主要是一些判定语句和触发xxe的parseXml方法,然后没有抛出erro,我们看一下之前的:

image-20231123112153350

这里没有抛出异常,所以没有回显,需要盲注

eval.dtd:

<?xml version="1.0" encoding="UTF-8" ?>
<!ENTITY xxe SYSTEM "file:///home/webgoat/.webgoat-8.1.0//XXE/secret.txt">

image-20231123120256707

此时刷新页面:

image-20231123120314497

这里已经都出来了,不知道为啥回显说不对。

这里还要考虑一个问题,就是当comment也不显示的时候,此时我们需要消息外带,此时需要多个dtd协同:

但是这里主要研究代码审计,不多解释:

XXE知识总结,有这篇就够了!-CSDN博客