xxe漏洞
1.XXE漏洞基本介绍
XML外部实体注入(XML External Entity)简称XXE漏洞,XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。当允许引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。XXE漏洞触发的点往往是可以上传XML文件的位置,没有对上传的XML文件进行过滤,导致可上传恶意XML文件。
2.XML文档简单了解
跟HTML文档一样,XML文档的内容结构有一下几个部分构成:
·元素
·属性
·实体
.PCDATA 会被解析器解析的文本
.CDATA 不会被解析器解析的文本
3.DTD(文档类型定义)基础
DTD(文档类型定义)的作用是定义XML文档的合法构建模块。DTD可以在XML文档内声明,也可以外部引用。
1. DTD实体
DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可以内部声明或外部引用。
●实体又分为一般实体和参数实体
o—般实体的声明语法:引用实体的方式︰&实体名;
。参数实体只能在DTD中使用,参数实体的声明格式:引用实体的方式∶%实体名;展示如下
2.支持的协议
4.漏洞利用
1.读取普通文件
这里是bp抓了一个登录的包,发现是xml格式,这里没有验证是否有xxe漏洞,我们直接使用对应的payload读取了文件,但是这里如果文件里是特殊字符的话就读取不成功了。
2.读取包含特殊字符文件
下面这里是演示。对了这里有个不知道为什么的玄学问题,如果不在&前面加数字的话,就是读取不出来文件的内容。我真的哭死。这里提醒一下一定要注意那个文件的路径,因为第三个演示部分使用的地址有点和这里不一样。
3.读取php文件
演示过程。这里注意一下我们读取出来的文件经过伪协议php://filter/read=convert.base64-encode/resoure=文件路径 加密的,要用base64解密一次才行。我这里直接在bp上解密的。
4.无回显的XXE漏洞利用
简单来说就是你直接在bp发送请求包,只能得到基本信息,body部分什么也没有。这里我们用到的是日志检测,简单来说利用日志去显示文件的内容,先提个醒,一定要注意是从谁发到谁去。谁去开启日志服务,还有就是注意格式问题qaq。
1)下面是案列,是在一台机器上开启服务同时又发包
构建payload
真实环境是需要云服务器的,在这里我就直接使用虚拟机完成,无回显需要查看服务器的访问日志,当存在访问日志了,那么就可以证明是支持外部实体的,若不存在日志,则证明不支持外部实体,或者被安全设备拦截。
1.在显示文件内容的机器上输入:python3 -m http.server 80
2.这里是测试能不能发送的payload
3.bp发包
4.查看是否收到包。说明可以发送。感觉也可以直接ping一下对应的ip地址。
5.这里就是发包显示对应的文件内容了。
2)这里是我自己做的演示。我的是本机发包,然后虚拟机kali开启日志。
这里有几个注意事项要说一说。一定要注意ip和端口,然后注意格式,我朋友好像就是ip多了个空格导致一直接收不到包,然后搞清楚是谁给谁发包,也就是dtd文件内容的ip端口,还有bp请求包中的ip也一定要对。然后就是还有一个注意事项,就是dtd文件内容里面读取的文件一定要存在,不存在的话也是不会有日志内容出现。
这里我是本机查询本机的文件内容,然后将结果发送到虚拟机查看。我有个想法是本机发包到虚拟机,然后虚拟机kali解析dtd文件,然后虚拟机kali根据dtd文件查询的路径然后将kali上的文件内容读取,然后再显示到kali开始的日志服务上面,但是好像失败了。我猜测有两种可能性,第一种是
kali解析不了dtd文件,第二种是应该通过服务器去弄。因为我下面的演示利用的是phpstudy搭建的服务器下面的文件去解析dtd文件,然后再发包到kali去查看。不确定是不是。好像是因为开启的路径有问题。如果在kali下解析dtd的话,要注意dtd文件放的位置。