关键在于精准搜索webshell:聚焦web访问日志路径,用组合特征(如.php?+危险函数+参数痕迹)替代单关键词,加时间、ip、状态码等限制,并用zgrep处理压缩日志。

直接用 grep 扫全站日志查 Webshell 特征,关键不是“能不能搜”,而是“搜得准、不漏报、不卡死”。重点在特征码选得对、日志范围控得严、正则写得稳。
只扫真正可能藏 Webshell 的日志路径
别一股脑 grep -r "eval" /var/log/ —— 大量系统日志、审计日志、数据库日志根本不会记录 PHP 请求,纯属浪费 I/O 和时间。聚焦 Web 服务访问日志:
- Nginx 默认:/var/log/nginx/access.log、/var/log/nginx/access.log.*.gz(含压缩归档)
- Apache 默认:/var/log/apache2/access.log、/var/log/httpd/access_log
- 若用容器或自定义路径,先确认:
ps aux | grep -E "(nginx|httpd|apache)" | grep -oE "access_log[^ ]*"
用精准特征组合代替单关键词硬匹配
单独搜 eval 或 base64_decode 会炸出大量正常 CMS 插件、加密通信、模板引擎调用,误报极高。应匹配“PHP 脚本名 + 危险函数 + GET/POST 参数痕迹”的上下文模式:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 查疑似一句话木马入口:
grep -E '\.php\?[^\s]*[?&](cmd|exec|popen|system|passthru|shell_exec)' /var/log/nginx/access.log - 查 base64 编码参数(常见于混淆):
grep -E '\.php[^\s]*[?&][^=]+=([A-Za-z0-9+/]{20,}={0,2})' /var/log/nginx/access.log - 查高频可疑文件名(如已被上传的 Webshell):
grep -E '/(shell|c99|kacak|weevely|b374|zpanel)\.php' /var/log/nginx/access.log
加限制条件提升速度和可信度
全量日志动辄几十 GB,不加约束容易卡住终端或 OOM。务必叠加过滤:
- 限定时间范围(比如最近 7 天):
awk -v d1="$(date -d '7 days ago' +%d/%b/%Y)" -v d2="$(date +%d/%b/%Y)" '$4 ~ /\[.*d1/ || $4 ~ /\[.*d2/' /var/log/nginx/access.log | grep -E '(\.php\?.*eval|\.php\?.*base64_decode)' - 排除已知白名单 IP(如运维跳板机、监控探针):
grep -v -E '192\.168\.10\.5|10\.10\.20\.100' /var/log/nginx/access.log | grep -E '\.php.*system\(' - 只看状态码异常的请求(如 200 不代表安全,但 404 后突然 200+危险函数更可疑):
awk '$9 == 200' /var/log/nginx/access.log | grep -E '\.php.*(?:eval|assert)\('
配合 zgrep 处理压缩日志,避免手动解压
生产环境 access.log 通常每天轮转并 gzip 压缩。直接用 zgrep 省时省力:
zgrep -E '\.php\?.*base64_decode' /var/log/nginx/access.log.*.gz-
zgrep -E '/shell\.php|/x.php' /var/log/nginx/access.log.*.gz 2>/dev/null(2>/dev/null 屏蔽 zgrep 对空文件的报错)
实际排查时,建议按“高频可疑路径 → 近期压缩日志 → 状态码+参数组合”三级递进。不复杂但容易忽略细节。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










