渗透测试基础-XXE 外部实体注入
只为对所学知识做一个简单的梳理,如果有表达存在问题的地方,麻烦帮忙指认出来。我们一起为了遇见更好的自己而努力💪!
XXE简介
(XML External Entity injection
)XML 外部实体注入漏洞,如果XML
文件在引用外部实体时候,如果通过构造恶意内容,可以导致读取任意文件,命令执行和对内网的攻击,这就是XXE漏洞。这个漏洞是基于xml
的,所以还得说一下xml
是什么
XML简介
XML
是可扩展的标记语言(Xtensible Markup Language
),设计用来进行数据的传输和存储, 结构是树形结构,有标签构成,这点与HTML语言很像。但是XML和HTML也有明显区别。
如下:
XML
被设计用来传输和存储数据。
HTML
被设计用来显示数据。
xml
预定义的语言,需要先去定义它,如1+1=2
,这里的加号和等号,是有人它们预定义了这样的能力,它们才能这样去执行。
xml
由三部分构成:XML声明,DTD,XML部分
既然是用来存储传输的,那又怎么会与渗透有关呢?这是因为xml
虽然自己什么也做不了,但是在php
中,有个函数就能将其作为对象来执行命令。simplexml_load_string()
我们来了解一下这个句子是怎么来读取文件信息的
如刚刚一样 xml
分为以上三个部分,由DTD
来做操作
<!ENTITY test SYSTEM “file:///C:/1.txt”>
system
通过file
协议调取文件C
盘下1.txt
的内容,放到了test
的实体里面
然后在<scan>&test</scan>
,再次调用test
将得到值放入变量$test
上,然后下面这个句子,放入了刚刚提到了函数中
这里的意思基本就是去执行这个xml
文件,得到的结果给变量obj
,然后在下面print
输出1.txt
内容。
可是要明白的是,正常情况下,别人的网站是不会写个print
在这的,这个没必要拿出来让所有人看到,就像sql
注入里的盲注,人家没必要把报错信息公布出来,这样也一样。那这里它既然不能自己显示出来,我们得换其他方法,看能不能将数据外带出来。
这里就需要讲另外一个东西了,XXE”炮台”,这个”炮台”由三个文件组成,1.xml
;2.php
;3.txt
,外加上我们burp
拦截之后传进去的恶意代码,这样就能实现数据的外带。
XXE外部实体注入靶场演练
靶场在进去之前告诉了我们这里XXE
炮台的地址,和flag
是什么
先看一下靶场什么样的,在最下面显示这个网站是一个CMS
。
先信息收集一下 御剑扫描看看有什么目录在。
发现了这么两个地址:
一个为数据库连接
一个为网站后台
根据上面得到的网站信息为CMS
的信息,将对应版本的网站源码下载下来看看
将源码文件放到了自己的phpstudy
上运行起来,这里能看到挺多信息,既然要管理员的密码,那我们是不是得需要知道数据库的账号密码,如果拿下了数据库,不是什么信息都有了,所有先在源码上找找看数据库的配置文件在哪
在这个目录下找到了数据库连接的配置文件,既然这个CMS网站的密码文件在这,那靶场的配置文件会不会也在这呢,去尝试一下。
发现一片空白,可这里应该高兴,因为如果没有这个文件,那是会报错的,什么信息都没有显示出来,反倒这里应该是有文件存在的,瞎输点东西验证一下。
既然这里有东西,那就先看看这里是啥 看是不是我们需要的数据库连接的配置文件。
这就需要看一下前面提到的”炮台”了,1.xml
;2.php
;3.txt
,和攻击代码,到底是什么个东西。
3.txt
,这里没啥说的,因为它就是存放的地方,空的,等下用来放我们需要的数据的
先从攻击代码来看
上下两部分直接不看了 看中间最核心的
SYSTEM
获取conn.php
里的内容,进行base64
的编码之后放入实体file
中
然后带着数据 访问下面这个地址(炮台的第一个文件)
然后file
里的数据,放到这里,然后带着这个数据去访问2.php
最前面那个函数在这里的意思是,如果没有3.txt
,那就创建一个,如果有,就将第二个参数的值写入进去,第二个参数的值,就是刚刚一路传过来的conn.php
里面的值。3.txt
就没必要讲了,就是为了存放接收到的数据。
既然有了攻击手法,就差网站给我们这个机会了,机会就是simplexml_load_string
这个函数
对源码文件进行审计,看有没有不合理的使用,比如有没有对传进来的xml
做过滤,或者使用XXE的防御函数等这样的防御手段。
经过源码的查找发现,在目录weixin/index.php
有出现
postarr
是 在file_get_contents
那传过来的,这里的意思是
读取文件内容,读取括号里php://input
传过来的所有文件,这里的php://input
可以做到,什么都能收到,且不做任何处理,比如收到的数据里面有标调符号什么的,用其他方式就有可能出问题,用这个php://input
就非常的好用。
在往上看,需要怎样才能这样使用
这里看到的是,if
条件,当signature
不为空,echostr
为空时,这个if
条件就满足了,能执行下面的句子,然后在看看这个signature
是怎么进来的
在上面看到,是能用POST
或者GET
直接传进来的,也没有发现对传进来的数据做限制。
访问weixin
目录,然后抓包将其改为POST
数据包
signature
在上面写入值,让其满足刚刚的if
条件
然后在下面插入刚刚的攻击语句
数据包改完之后发过去
然后直奔3.txt
的炮台
3.txt
成功接收到了文件的值,这个值是经过base64
编码过的,所以需要解码一下。
这里看到了数据库的连接账号密码,用开始御剑扫描的数据库网页地址去尝试连接一下。
进去之后就看到的admin
的密码,虽然是md5
的加密的样子,解密一下
漏洞总结
这里在说一下有关XXE漏洞的防护方法:
- 检查所使用的底层xml解析库,默认禁止外部实体的解析
- 使用第三方应用代码及时升级补丁
- 同时增强对系统的监控,防止此问题被人利用
还可以参考文档具体操作,具体使用方式,libxml_set_external_entity_loader
(点击进入)
《最好的防御,是明白其怎么实施的攻击》