排查开源程序漏洞,第一步不是扫工具,而是先确认你手上这套程序的确切版本、框架类型和最近一次官方更新日期。很多站点被入侵,根源不是漏洞多隐蔽,而是管理员根本不知道自己在跑一个三年前就停止维护的开源项目。拿到版本号后,先去官方安全公告页或代码仓库的 Releases 页面核对是否存在已知CVE。如果官方已经停止维护,立即评估迁移或做隔离处理,不要幻想“没人知道我这个站”。
从文件哈希和完整性校验入手下载官方同版本源码包,对线上环境做文件比对。重点比对 index.php、config 目录、admin 目录、include 或 src 目录下的核心文件。Linux 下可以用 diff 命令快速找出被改动过的文件:
diff -rq /path/to/official/source /path/to/live/site
输出中如果出现 Only in live site 的文件,尤其是 php、aspx、jsp、py 后缀,或者在 upload、tmp、cache 目录下出现可执行文件,基本可以判定为后门或 webshell。不要只看修改时间,攻击者经常伪造时间戳。
检查入口文件和配置文件的可写权限开源程序安装完成后,很多目录和文件保留着安装时的 777 或 755 可写权限。攻击者拿到低权限漏洞后,第一件事就是往可写目录写马。重点检查 config.php、.env、database.php、settings.php 等配置文件的权限。Linux 下执行:
find /path/to/site -type f -perm -002 -o -type d -perm -002
这条命令会列出所有其他用户可写的文件和目录。配置文件建议设为 444 或 440,上传目录设为 755 且禁止执行 PHP。如果程序功能上必须允许上传目录可写,在 Nginx 或 Apache 中单独对该目录做禁止脚本执行的规则。
审计后台登录入口和弱口令开源程序后台路径是公开的,攻击者会批量扫描 /admin、/manage、/system、/login 等常见入口。排查时先确认后台是否暴露在公网,是否可以通过 IP 直接访问。然后检查管理员账号是否存在 admin、test、root 等默认用户名。数据库里执行类似查询:
SELECT username,password FROM users WHERE username IN ('admin','root','test','manager');
如果密码哈希是 MD5 且未加盐,或者直接明文存储,立即修改并升级加密方式。后台登录建议加验证码、限制登录失败次数、绑定 IP 白名单。不要用开源程序自带的默认后台路径,能改就改。
排查上传功能与文件类型校验绕过上传点是开源程序漏洞重灾区。排查时不要只看前端 JS 校验,直接测试后端是否真正限制了文件扩展名和 MIME 类型。构造一个包含 PHP 代码但扩展名为 .jpg 的文件,或者使用 .php5、.phtml、.pht、.shtml 等变种后缀上传,看是否成功。如果程序使用黑名单过滤,尝试大小写混合、双扩展名、空格和点号截断。上传目录中如果出现 .php 文件,立即删除并追溯上传时间、上传账号和来源 IP。
检查 SQL 注入与参数过滤开源程序历史版本中,搜索功能、列表排序参数、ID 参数、留言板、会员中心是最容易出现 SQL 注入的地方。排查时先看程序是否使用 PDO 预处理或参数化查询。如果仍是拼接 SQL 字符串,检查所有 GET 和 POST 参数是否经过 intval、addslashes 或框架自带的过滤函数。手动测试时在参数后加单引号、双引号、反斜杠,观察页面是否报错或返回异常。发现报错信息暴露数据库表名或路径,说明存在注入风险。修复时优先升级到官方最新版,如果无法升级,对受影响参数做强制类型转换。
审查远程文件包含与本地文件包含部分老开源程序在模板加载或语言包切换功能中存在文件包含漏洞。排查时关注 URL 中出现的 page、file、template、lang、module 等参数,尝试传入 ../../../../etc/passwd 或远程 URL。如果页面返回了系统文件内容或执行了远程脚本,说明漏洞存在。修复方法是限制参数值必须在白名单内,禁止用户输入直接拼进 include 或 require 语句。
检查后台模板编辑和插件安装功能很多开源程序后台提供模板在线编辑、插件上传安装、SQL 执行工具。这些功能一旦被攻击者拿到后台权限,可以直接写马或提权。排查时关闭不必要的在线编辑功能,删除后台的 SQL 执行入口。插件安装目录禁止 PHP 执行,或者干脆移除插件上传功能,改为手动上传并审核代码。模板目录下的 .php 文件要逐一检查,确认没有 eval、base64_decode、system、exec 等危险函数。
扫描 webshell 和可疑代码特征使用 grep 命令搜索常见后门特征:
grep -rn "eval(" /path/to/site --include="*.php"
grep -rn "base64_decode" /path/to/site --include="*.php"
grep -rn "system(" /path/to/site --include="*.php"
grep -rn "shell_exec" /path/to/site --include="*.php"
grep -rn "assert(" /path/to/site --include="*.php"
这些函数在正常程序中也可能出现,需要结合上下文判断。重点看文件头部是否有乱码、变量名是否随机、代码是否经过多层编码。如果发现一个正常文件末尾多了一段加密代码,或者图片目录下出现 PHP 文件,直接删除并做完整清理。清理后还要检查计划任务和开机启动项,防止攻击者留下持久化后门。
检查数据库中的异常账号和计划任务攻击者入侵后常会在数据库用户表中插入隐藏管理员账号,或者在系统计划任务中添加反弹 shell 脚本。排查时检查用户表是否有近期新增的高权限账号,检查 crontab 和系统服务:
crontab -l cat /etc/crontab ls /etc/cron.d/ systemctl list-timers
发现不明计划任务立即停止并删除。数据库备份文件中也要搜索可疑账号和恶意代码,防止恢复时再次中招。
修复后的验证与加固清理完漏洞和后门后,不要立即宣布安全。先做一轮黑盒测试,模拟攻击者从外部访问后台、上传点、注入点,确认漏洞已封堵。然后做白盒审计,检查核心代码中是否还有未处理的用户输入。最后更新程序到最新稳定版,删除安装目录、测试文件、备份文件。如果程序已经停止维护,考虑用 WAF 做虚拟补丁,限制危险参数和请求频率。定期做文件完整性监控,任何核心文件变动都触发告警。
开源程序漏洞排查不是一次性工作,而是持续过程。每次官方发布安全更新,第一时间评估影响并升级。备份要定期做,且备份文件不能放在网站目录下。权限最小化原则贯穿始终,数据库账号只给必要的增删改查权限,文件系统只给运行所需的最小权限。做到这些,开源程序也能跑得稳、跑得久。
