CTF实战:从phpMyAdmin 4.8.1文件包含漏洞到权限提升的深度利用
在CTF竞赛和日常的渗透测试中,遇到phpMyAdmin这类数据库管理工具并不少见。很多选手看到熟悉的登录界面,第一反应往往是尝试弱口令或者SQL注入,但今天我们要探讨的是一个更为隐蔽且威力巨大的攻击向量——CVE-2018-12613。这个漏洞影响phpMyAdmin 4.8.0至4.8.1版本,允许攻击者通过精心构造的请求实现远程文件包含,进而读取服务器上的任意文件。
我第一次在实战中遇到这个漏洞是在一次内部红蓝对抗中,目标系统部署了一个看似无害的phpMyAdmin实例。当时团队已经尝试了各种常规手段无果,直到有人注意到页面底部的版本号。那个“4.8.1”就像黑暗中的灯塔,指引我们走向了一条完全不同的攻击路径。今天,我将结合多次实战经验,不仅讲解如何利用这个漏洞读取flag,更会深入探讨如何将其转化为真正的系统权限。
1. 漏洞原理深度解析:为什么这个文件包含如此特殊
CVE-2018-12613的核心问题在于phpMyAdmin的index.php文件中对target参数的处理不当。在正常流程中,这个参数用于指定要加载的页面模块,比如db_sql.php、db_datadict.php等。问题出在代码没有对用户输入进行充分的过滤和验证。
1.1 漏洞触发机制
让我们先看看漏洞的触发点。在phpMyAdmin 4.8.1的index.php中,有这样一段关键代码:
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;
}
这里的Core::checkPageValidity()函数本应确保target参数指向的是合法文件,但其实现存在缺陷。函数内部会检查目标文件是否在白名单中,但攻击者可以通过特殊构造绕过这一检查。
关键点:漏洞利用的核心在于双重编码技巧。当我们提交
db_sql.php%253f时,服务器会先进行一次URL解码,得到db_sql.php%3f,然后%3f会被解码为问号?,最终形成db_sql.php?这样的字符串。这个问号让后续的路径遍历成为可能。
1.2 路径穿越的巧妙构造
理解路径穿越的构造是掌握这个漏洞的关键。典型的payload如下:
/phpmyadmin/index.php?target=db_sql.php%253f/../../../../../../../../etc/passwd
这个payload的构造逻辑是这样的:
db_sql.php%253f→ 解码后变为db_sql.php?- 问号后的内容被当作查询字符串参数
- 但php的
include函数在遇到问号时会将其后的内容视为路径的一部分 - 通过
../实现目录穿越
为了更直观地理解这个过程,我整理了一个对比表格:
| 构造部分 | 作用 | 绕过原理 |
|---|---|---|
db_sql.php%253f |
目标文件+编码后的问号 | 绕过白名单检查,同时引入路径分隔符 |
/ |
路径分隔符 | 将问号后的内容变为路径的一部分 |
../../../../ |
目录穿越 | 向上跳转目录层级 |
etc/passwd |
目标文件 | 最终要读取的系统文件 |
在实际测试中,我发现不同系统的目录深度可能不同。Linux系统通常需要6-8个../才能到达根目录,而Windows系统由于路径结构不同,可能需要更多尝试。
2. 实战环境搭建与信息收集
在真正的CT


928

被折叠的 条评论
为什么被折叠?



