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.php、cmd.php、shell.php - 双后缀文件,例如
a.jpg.php - 文件内容只有一行且高度混淆
2. 按危险函数检索
PHP WebShell 常见危险函数:
1 | eval |
排查命令:
1 | grep -RniE "eval|assert|system|exec|shell_exec|passthru|base64_decode|file_put_contents|preg_replace" /var/www/html 2>/dev/null |
发现命中结果后,不要直接删除,应该先确认:
- 文件是否属于业务正常代码。
- 文件最近是否被修改。
- 是否有对应访问日志。
- 是否包含可执行命令参数,例如
cmd、pass、shell。
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 | POST /upload.php |
4. 统计异常 IP
1 | awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head |
如果某个 IP 在短时间内大量访问后台、上传目录、敏感路径,应重点分析。
六、进程排查
1. 查看异常进程
1 | ps aux --sort=-%cpu | head |
关注以下进程:
bash -incpython -cperlcurlwget- 不明路径下的二进制文件
2. 查看网络连接
1 | netstat -antp |
或:
1 | ss -antp |
关注异常外连:
- Web 服务用户发起的外连
- 连接到陌生公网 IP
- 反弹 Shell 常见端口
- 长时间保持的 ESTABLISHED 连接
3. 根据 PID 追踪文件
1 | ls -l /proc/<pid>/cwd |
如果进程工作目录位于 Web 目录或临时目录,需要重点排查。
七、计划任务和持久化排查
1. 用户计划任务
1 | crontab -l |
查看所有用户的计划任务:
1 | ls -la /var/spool/cron/ |
2. 系统计划任务
1 | cat /etc/crontab |
关注可疑命令:
curl http://... | bashwget http://... -O- | sh- 定时执行临时目录脚本
- 定时拉取远程文件
3. 启动项检查
1 | ls -la /etc/init.d/ |
如果发现陌生服务名,需要查看服务文件内容:
1 | systemctl cat 服务名 |
八、history 和账号检查
1. 命令历史
1 | history |
还可以检查其他用户目录:
1 | find /home -name ".bash_history" -exec ls -l {} \; |
2. 系统账号
1 | cat /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 | find /var/www/html -type d -exec chmod 755 {} \; |
上传目录禁止执行脚本。
2. Nginx 限制 PHP 执行
1 | location ^~ /uploads/ { |
3. 日志监控
建议监控以下行为:
- 上传目录访问 PHP 文件
- URL 中出现命令执行关键字
- 同一 IP 高频访问后台
- 大量 404 扫描
- Web 服务用户发起外连
十一、总结
WebShell 排查的核心不是只找一个可疑文件,而是还原完整攻击链:攻击者从哪里进来、写了什么文件、执行了什么命令、是否做了持久化、入口是否已经修补。
本文整理了一套 Linux WebShell 应急排查流程,覆盖文件、日志、进程、计划任务和账号检查。后续可以继续将这些命令整理成自动化巡检脚本,提高排查效率。