Webshell查杀脚本,批量扫描网站目录木马
当网站出现异常跳转、莫名文件或搜索引擎提示风险时,通常意味着目录中可能被上传了 Webshell。
本文围绕 Webshell查杀脚本,批量扫描网站目录木马这一需求,给出一套零基础也能照着做的脚本方案。
读完你可以完成从环境确认、脚本编写、批量扫描到结果验证的完整流程。
查杀前的环境确认与备份
动手之前先确认服务器能正常执行 Shell 脚本,并保留一份可回滚的备份,避免扫描或清理时误伤正常业务文件。
- 确认系统已安装
bash、find、grep等基础工具,绝大多数 Linux 发行版默认自带。 - 找到网站根目录,例如宝塔面板常见路径为
/www/wwwroot/你的域名,LNMP 环境可能是/home/wwwroot/你的域名。 - 执行
tar -czf /root/www_backup.tar.gz /www/wwwroot对网站目录做一次压缩备份,确认备份文件存在后再继续。 - 记录当前网站访问是否正常,方便扫描后对比验证。
这里强调一个判断条件:如果网站正在被攻击或文件持续变动,建议先临时关闭写入权限或切换维护模式,再执行扫描,否则结果可能不准确。
编写批量扫描 Webshell 的脚本
新建脚本文件,例如 /root/scan_webshell.sh,内容如下。
脚本思路是:遍历指定目录,按常见木马特征字符串和可疑文件扩展名进行匹配,输出可疑文件路径。
#!/bin/bash
# Webshell 批量扫描脚本
SCAN_DIR="/www/wwwroot"
LOG_FILE="/root/scan_result_$(date +%Y%m%d%H%M).log"
# 常见 Webshell 特征关键词
PATTERNS="eval\(|assert\(|base64_decode|gzinflate|str_rot13|\$_(POST|GET|REQUEST)\[|preg_replace.*\/e|system\(|exec\(|shell_exec\("
# 常见可疑扩展名
EXTENSIONS="php|php5|phtml|jsp|asp|aspx"
echo "扫描开始:$(date)" | tee -a "$LOG_FILE"
find "$SCAN_DIR" -type f -regextype posix-extended -regex ".*\.($EXTENSIONS)$" | while read -r file; do
if grep -Eqi "$PATTERNS" "$file"; then
echo "可疑文件:$file" | tee -a "$LOG_FILE"
fi
done
echo "扫描结束:$(date)" | tee -a "$LOG_FILE"
echo "结果已保存到 $LOG_FILE"
保存后赋予执行权限:chmod +x /root/scan_webshell.sh。
注意脚本中的 SCAN_DIR 要改成你自己的网站根目录。
执行扫描与结果确认
直接运行脚本:bash /root/scan_webshell.sh。
扫描时间取决于文件数量,几万文件的站点可能需要几分钟。
扫描完成后,用 cat /root/scan_result_*.log 查看结果。
对于列出的可疑文件,不要立刻删除,先做人工确认:
- 用
ls -l查看文件修改时间,近期被改动的文件风险更高。 - 用
head -n 20 文件路径查看开头代码,判断是否为正常业务逻辑。 - 可以搜索文件内是否包含
eval($_POST这类一句话木马特征,确认后再处理。
验证标准: 如果扫描结果为空,且网站访问正常、无异常进程,说明当前未发现明显木马;
如果发现可疑文件,建议先隔离到 /root/quarantine 目录,观察网站是否报错,再决定是否彻底删除。
避坑与后续加固
- 不要把正常使用
eval或base64_decode的框架文件误判为木马,务必人工复核。 - 扫描脚本本身不会清除木马,只负责定位,清理前一定要保留备份。
- 如果网站目录权限为
www:www,建议用sudo -u www bash 脚本执行,避免权限不足漏扫。 - 查杀后建议检查计划任务
crontab -l和异常进程ps aux,防止木马留有后门。
一个常见疑问: 扫描脚本能否替代专业安全软件?
不能完全替代,但适合快速排查和应急定位。另一个判断条件: 如果同一目录反复出现木马,需要检查上传接口和 CMS 漏洞,而不是只删文件。
完成以上步骤后,你可以定期用该脚本做批量扫描,配合权限收紧和日志审计,降低网站被再次植入木马的风险。