Webshell 定位与清除
Webshell 是攻击者留在 Web 目录里的一个脚本入口,通过它执行命令、传文件、连数据库。清除的关键不在删除动作,而在「先找全、再删净、后验证」:只删发现的那一个,几乎一定复发。找全的方法是用三条线索交叉:文件的时间特征、脚本里的高危函数特征、以及访问日志里对可疑文件的请求。三路交叉命中的文件,误报率最低。
基本信息
| 常见形态 | 随机命名的 .php、图片目录里的可执行文件、伪装成缓存或日志的文件 |
|---|---|
| 内容特征 | eval、assert、system、shell_exec、base64_decode,以及字符拼接混淆 |
| 时间线索 | mtime 与 ctime 落在入侵窗口内,或与访问日志中的首次请求时间吻合 |
| 日志线索 | 访问日志里对同一脚本的 POST 请求,参数很长或含编码内容 |
| 复验要求 | 删除后全量复扫,并在观察期内确认没有重新生成 |
| 关联入口 | 上传接口、框架漏洞、后台弱口令,不修入口等于给攻击者留回头路 |
典型使用场景
- 安全设备告警提示 Web 目录存在可疑脚本,需要确认真伪与范围
- Web 服务器出现异常出站连接,怀疑由脚本触发
- 站点被挂马或被跳转,需要清理后门脚本
- 网站被列入黑名单,需要清理并提交复查
- 清理完成后做复扫与观察,为业务方提供可验证的收尾证据
三路交叉定位
三路交叉定位
find /www/wwwroot -type f -name '*.php' -mtime -30 -printf '%TY-%Tm-%Td %TH:%TM %s %p\n' 2>/dev/null | sort | head -n 40 # 1 时间线索
grep -RnE 'eval\(|assert\(|base64_decode\(|shell_exec\(|passthru\(' /www/wwwroot --include='*.php' -l 2>/dev/null | head -n 40 # 2 内容特征
grep -RhoE 'POST /[^ ]+\.php' /var/log/nginx/access.log 2>/dev/null | sort | uniq -c | sort -rn | head -n 20 # 3 访问日志
find /www/wwwroot -type d \( -name uploads -o -name cache -o -name data \) -exec ls -lt {} + 2>/dev/null | head -n 20判定与动作
| 命中线索 | 判定 | 动作 |
|---|---|---|
| 三路同时命中 | 几乎可确定是 webshell | 复制样本与日志片段留证,再删除并复扫 |
| 内容特征命中、时间久远 | 可能是框架正常用法 | 人工读文件,与同版本框架源码比对 |
| 仅时间线索命中 | 多为正常发布或上传 | 核对发布记录与文件内容后再决定 |
| 仅日志线索命中 | 需要定位文件本体 | 在日志中取完整路径与参数,直接查看该文件 |
| 文件被删但日志仍在请求 | 可能还有未发现的副本 | 全量复扫并检查上传目录、缓存目录 |
发现一处要按「必然还有第二处」处理:webshell 通常成组投放,分散在多个目录,还会在上传目录、缓存目录里留副本。删除后必须全量复扫,并在观察期内复查是否重新生成。
删除之前先留证:把文件内容、mtime、ctime、所在路径与访问日志中的相关请求一起复制到独立目录。这些材料既能说明攻击者如何利用,也是恢复与追责的依据。
留证、删除与复扫
留证、删除与复扫
mkdir -p /evidence/webshell
cp -a /www/wwwroot/shell.php /evidence/webshell/ # 先复制样本与属性
stat -c '%n %s %y %z' /www/wwwroot/shell.php | tee -a /evidence/webshell/meta.txt
sha256sum /evidence/webshell/shell.php | tee /evidence/webshell/sample.sha256
rm -f /www/wwwroot/shell.php # 确认样本留存后再删除
find /www/wwwroot -name '*.php' -newermt '-30 days' -exec grep -lE 'eval\(|assert\(' {} + 2>/dev/null | head -n 20 # 复扫
ls -lt /www/wwwroot/uploads /www/wwwroot/cache 2>/dev/null | head清理只解决「现在」,不解决「将来」:Webshell 的入口通常是上传校验缺失、框架已知漏洞或后台弱口令。清理完成后要一并修入口、更新组件、重置后台凭据,否则几天内会再次落地。
清理动作本身也要记录:删除了哪个文件、什么时间、依据是哪条线索、由谁执行。观察期结束后把删除清单与复扫结果一起交付业务方,清理工作才算形成闭环。