Linux WebShell 排查实践:文件、进程、日志、计划任务分析

一、项目背景

在 Web 应急响应中,WebShell 排查是非常常见的工作内容。攻击者通过文件上传、代码执行、后台弱口令、组件漏洞等入口写入 WebShell 后,可能继续执行命令、维持权限、读取配置文件或横向移动。

本文基于本地靶场和授权环境,总结一套 Linux Web 服务器上的 WebShell 排查流程,重点覆盖:

  • 异常文件排查
  • 最近修改时间分析
  • 可疑进程检查
  • Web 访问日志分析
  • 计划任务和启动项检查
  • 处置和加固建议

二、环境说明

项目 内容
系统环境 Linux
Web 服务 Nginx/Apache
Web 目录 /var/www/html
脚本语言 PHP
排查目标 定位 WebShell、判断入侵路径、清理后门

以下命令需要根据真实环境调整路径,操作前建议先备份。

三、排查思路

WebShell 排查不能只靠工具扫一遍,应该按照攻击链去看:

1
入口漏洞 -> 文件写入 -> 攻击者访问 WebShell -> 命令执行 -> 持久化 -> 清理痕迹

因此排查时要同时关注文件、日志、进程和系统持久化位置。

四、异常文件排查

1. 查看最近修改文件

如果已经知道大概入侵时间,可以优先查看近期被修改的文件:

1
find /var/www/html -type f -mtime -3 -ls

查看最近 60 分钟内修改的文件:

1
find /var/www/html -type f -mmin -60 -ls

重点关注:

  • 上传目录中新出现的 PHP 文件
  • 图片目录、缓存目录中的脚本文件
  • 文件名类似 1.phpcmd.phpshell.php
  • 双后缀文件,例如 a.jpg.php
  • 文件内容只有一行且高度混淆

2. 按危险函数检索

PHP WebShell 常见危险函数:

1
2
3
4
5
6
7
8
9
eval
assert
system
exec
shell_exec
passthru
base64_decode
file_put_contents
preg_replace

排查命令:

1
grep -RniE "eval|assert|system|exec|shell_exec|passthru|base64_decode|file_put_contents|preg_replace" /var/www/html 2>/dev/null

发现命中结果后,不要直接删除,应该先确认:

  • 文件是否属于业务正常代码。
  • 文件最近是否被修改。
  • 是否有对应访问日志。
  • 是否包含可执行命令参数,例如 cmdpassshell

3. 查找异常后缀

1
find /var/www/html -type f \( -name "*.php*" -o -name "*.phtml" -o -name "*.phar" \)

如果上传目录中出现可执行脚本,风险较高:

1
find /var/www/html/uploads -type f \( -name "*.php*" -o -name "*.phtml" -o -name "*.phar" \)

4. 查找隐藏文件

1
find /var/www/html -name ".*" -ls

攻击者有时会将 WebShell 命名为 .cache.php.config.php 等,伪装成隐藏文件。

五、日志分析

1. 定位 WebShell 访问记录

假设发现可疑文件 /var/www/html/uploads/a.php,可以在访问日志中搜索:

1
grep "uploads/a.php" /var/log/nginx/access.log

重点观察:

  • 首次访问时间
  • 访问 IP
  • 请求方法
  • URL 参数
  • 状态码
  • User-Agent

2. 查找上传行为

1
grep -Ei "upload|file|image|avatar|attachment" /var/log/nginx/access.log

如果某个 IP 先访问上传接口,再访问上传目录中的 PHP 文件,就很可能存在文件上传漏洞利用链。

3. 查找命令执行特征

1
grep -Ei "cmd=|whoami|id|uname|cat|ls|bash|curl|wget|nc|python" /var/log/nginx/access.log

常见攻击流程:

1
2
3
4
POST /upload.php
GET /uploads/shell.php?cmd=whoami
GET /uploads/shell.php?cmd=id
GET /uploads/shell.php?cmd=cat /etc/passwd

4. 统计异常 IP

1
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head

如果某个 IP 在短时间内大量访问后台、上传目录、敏感路径,应重点分析。

六、进程排查

1. 查看异常进程

1
2
ps aux --sort=-%cpu | head
ps aux --sort=-%mem | head

关注以下进程:

  • bash -i
  • nc
  • python -c
  • perl
  • curl
  • wget
  • 不明路径下的二进制文件

2. 查看网络连接

1
netstat -antp

或:

1
ss -antp

关注异常外连:

  • Web 服务用户发起的外连
  • 连接到陌生公网 IP
  • 反弹 Shell 常见端口
  • 长时间保持的 ESTABLISHED 连接

3. 根据 PID 追踪文件

1
2
3
ls -l /proc/<pid>/cwd
ls -l /proc/<pid>/exe
cat /proc/<pid>/cmdline

如果进程工作目录位于 Web 目录或临时目录,需要重点排查。

七、计划任务和持久化排查

1. 用户计划任务

1
crontab -l

查看所有用户的计划任务:

1
2
ls -la /var/spool/cron/
ls -la /var/spool/cron/crontabs/

2. 系统计划任务

1
2
3
4
cat /etc/crontab
ls -la /etc/cron.d/
ls -la /etc/cron.hourly/
ls -la /etc/cron.daily/

关注可疑命令:

  • curl http://... | bash
  • wget http://... -O- | sh
  • 定时执行临时目录脚本
  • 定时拉取远程文件

3. 启动项检查

1
2
ls -la /etc/init.d/
systemctl list-unit-files | grep enabled

如果发现陌生服务名,需要查看服务文件内容:

1
systemctl cat 服务名

八、history 和账号检查

1. 命令历史

1
2
history
cat ~/.bash_history

还可以检查其他用户目录:

1
find /home -name ".bash_history" -exec ls -l {} \;

2. 系统账号

1
2
cat /etc/passwd
awk -F: '$3==0 {print $1}' /etc/passwd

如果出现非 root 用户 UID 为 0,说明存在高危后门账号。

3. SSH 公钥

1
find /root /home -name "authorized_keys" -exec ls -l {} \;

查看是否被写入陌生公钥。

九、处置流程

建议按以下顺序处理:

1
隔离主机 -> 备份证据 -> 定位入口 -> 清理 WebShell -> 修补漏洞 -> 修改密码 -> 排查持久化 -> 恢复服务 -> 持续监控

具体动作:

  • 先备份可疑文件和日志,不要直接删除证据。
  • 封禁攻击 IP 或限制访问入口。
  • 删除确认后的 WebShell。
  • 修补上传、注入、命令执行、后台弱口令等入口。
  • 修改数据库、后台、SSH 等密码。
  • 检查计划任务、启动项、SSH 公钥。
  • 重启 Web 服务并观察日志。

十、加固建议

1. Web 目录权限

1
2
find /var/www/html -type d -exec chmod 755 {} \;
find /var/www/html -type f -exec chmod 644 {} \;

上传目录禁止执行脚本。

2. Nginx 限制 PHP 执行

1
2
3
4
5
location ^~ /uploads/ {
location ~ \.php$ {
return 403;
}
}

3. 日志监控

建议监控以下行为:

  • 上传目录访问 PHP 文件
  • URL 中出现命令执行关键字
  • 同一 IP 高频访问后台
  • 大量 404 扫描
  • Web 服务用户发起外连

十一、总结

WebShell 排查的核心不是只找一个可疑文件,而是还原完整攻击链:攻击者从哪里进来、写了什么文件、执行了什么命令、是否做了持久化、入口是否已经修补。

本文整理了一套 Linux WebShell 应急排查流程,覆盖文件、日志、进程、计划任务和账号检查。后续可以继续将这些命令整理成自动化巡检脚本,提高排查效率。