关于xml、DTD
从0到1完全掌握XXE | Drunkbaby’s Blog (drun1baby.top)
XXE-4
这道题是标准的xxe注入,这里不多赘述,主要看看源码探究一下漏洞是如何导致的:
这里需要补充一个知识点:
组件使用总结:使用 JAXB 实现 XML文件和java对象互转 - 掘金 (juejin.cn)
关键点就是:当把 XML 格式的字符串传递给 Unmarshaller 接口转变成 Java 对象时,会解析一遍 XML,如果传入的值可控就会导致 XXE 注入攻击。
这道题实际是看返回的路径中是否包含系统的敏感路径,包含则为成功,这里真正引发xxe的点在parseXml中,我们进去看一看:
结合前面补充的知识,我们知道他进行了一次反序列化,将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导致的注入攻击,就像文件上传的一些文件格式的绕过一样.
还是要看看源码:
又是parseXml,倒也没什么好说的了
但是这种注入方式有一个问题:我们怎么知道目标是封装在什么类中(这里是封装在comment类中)
我们可以看到,我们随意封装到一个对象中,是无法成功解析的,要进行这样的攻击需要了解额外的信息,在一开始的json字符中,我们能知道的仅仅是输入的内容属于“text”字段:
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
这个文件
还是先读一下源码吧:
主要是一些判定语句和触发xxe的parseXml方法,然后没有抛出erro,我们看一下之前的:
这里没有抛出异常,所以没有回显,需要盲注
eval.dtd:
<?xml version="1.0" encoding="UTF-8" ?>
<!ENTITY xxe SYSTEM "file:///home/webgoat/.webgoat-8.1.0//XXE/secret.txt">
此时刷新页面:
这里已经都出来了,不知道为啥回显说不对。
这里还要考虑一个问题,就是当comment也不显示的时候,此时我们需要消息外带,此时需要多个dtd协同:
但是这里主要研究代码审计,不多解释: