何为XXE?
简单来说,XXE就是XML外部实体注入。当允许引用外部实体时,通过构造恶意内容,就可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等危害。
典型攻击手法:
XML又是什么呢?
XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。
XML有什么特点
XML仅仅是纯文本,他不会做任何事情。
XML可以自己发明标签(允许定义自己的标签和文档结构)
XML 无所不在。XML 是各种应用程序之间进行数据传输的最常用的工具,并且在信息存储和描述领域变得越来越流行。
既然XML是纯文本为什么还会产生注入呢
原本xml本身是没有任何作用,但是在PHP里有一个函数叫做simplexml_load_string,他的作用是把xml转化为对象。【注:其他语言也有类似函数】
XML和HTML是什么关系
XML被设计用来传输和存储数据。
HTML被设计用来显示数据。
为什么使用 DTD?
通过 DTD,您的每一个 XML 文件均可携带一个有关其自身格式的描述。
通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。
而您的应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。
您还可以使用 DTD 来验证您自身的数据。
DTD实体
DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可以内部声明或外部引用。
内部实体声明:<!ENTITY 实体名称 "实体的值"> ex:<!ENTITY eviltest "eviltest">
外部实体声明:<!ENTITY 实体名称 SYSTEM "URI">
怎么构造外部实体注入?
- 直接通过DTD外部实体声明
- 通过DTD文档引入外部DTD文档,再引入外部实体声明
- 通过DTD外部实体声明引入外部实体声明
XML外部实体攻击又是什么
XML 外部实体注入简称XXE有了XML实体,关键字SYSTEM会令XML解析器从URI中读取内容,并允许它在XML文档中被替换。因此,攻击者可以通过实体将他自定义的值发送给应用程序,然后让应用程序去呈现。 简单来说,攻击者强制XML解析器去访问攻击者指定的资源内容(可能是系统上本地文件亦或是远程系统上的文件)。
XXE在php中除了靶场用到的file协议还支持那些协议呢
file:可用 file://文件地址,来读取文件
http:可以访问 HTTP(S) 网址
FTP:访问 FTP
PHP:访问各个 输入/输出 流
zlib:压缩流
data:数据
glob:查找匹配的文件格式路径
expect:处理交互式的流,可用来执行命令,但需要先安装相应插件
为什么要进行base64编码
为了防止一些特殊字符对我们产生影响
我们炮台在xxe中具体起到什么作用呢
很多时候语言解析执行了XML后并不会给你输出,我们这个是时候可以使用一个类似与于接受的平台,然后去平台查看就可以获取到数据。
如何防御XXE呢
- 使用开发语言提供的禁用外部实体的方法
- 过滤用户提交的XML数据
XXE的真实案例
在2018年7月4日微信SDK爆出XXE漏洞,通过该漏洞,攻击者可以获取服务器中目录结构、文件内容,如代码、各种私钥等。获取这些信息以后,攻击者便可以为所欲为。
他是由于微信支付SDK的XXE漏洞产生原因都是因为使用了DocumentBuilderFactory没有限制外部查询而导致XXE
XXE如何寻找
当同学遇到传参的地方出现了XML代码格式的东西,不妨传参一些XML代码去尝试看看传参后是否有报错,页面是否显示了实体中的东西
XXE-防御
来来来,让我们进入靶场吧!!!
搭建好是这个样子,我感觉这个用的CMS是真不错
现在把靶场逛一逛,搜集搜集有用的信息
首先发现这是闪灵建站系统
还无意间搜到了长安大学的信息安全检测预警平台
但是是SQL注入和这次要求的XXE无关
发现了能在线留言的地方,尝试了一下,XSS没效果
好了回归正题,要看XXE漏洞,先要进行代码审计
有两个思路:
1.使用搭建网站的文件直接上工具审
2.要是靶场是试用的在线的话,那去找同CMS的源码,也是可以试试的
我这里是有源码,所以直接用seay去审
最后总算打开了,软件也是有小脾气的~
z不等不说建网站越好,代码越多
对源代码进行代码审计
发现一个可疑的函数、全局搜索simplexml_load_string()
函数,发现/api/notify.php
中存在该函
基本上$GLOBALS['HTTP_RAW_POST_DATA'] 和 $_POST是一样的。但是如果post过来的数据不是PHP能够识别的,你可以用 $GLOBALS['HTTP_RAW_POST_DATA']来接收,比如 text/xml 或者 soap 等等。(这段文字是从国外技术人员的描述中翻译过来的)
从网站上查该页面是否存在
没有报错,应该是存在着的
尝试获取服务器所在路径
使用burp进行抓包查看
强制性修改传参方式,目的是要以报错的方式把路径报出来
手动将get方法改为post方法,让服务器强制报错,获取服务器路径C:/phpStudy/scms/
因为无法正常的使用xxe输出,所以就要尝试去用没有输出的xxe攻击方法。靶场服务器上留下了1.xml,以及2.php还有3.txt
那么只需要读取文件然后引用1.xml,1.xml会将读取文件的内容发送给2.php。2.php会储存到3.txt,因此我们直接访问3.txt就能获得想要的内容了。
访问**/3.php,获得编码后的conn.php页面内容
按顺序访问http://5aeg8017.ia.aqlab.cn/1.xml 、 http://5aeg8017.ia.aqlab.cn/2.php 、 http://5aeg8017.ia.aqlab.cn/3.txt 最后可以得到base64码 进行解码可以得到数据库的账户名和密码、数据库名:xxe、teiwo!8#7ERe1DPC、scms
登录后台数据库http://etrh8207.ia.aqlab.cn/adminer.php ,获得加密的密码:e99d2e51cbefe75251f1d40821e07a32
进行解密得到密码admintestv1