在 CentOS 上通过 PHP 日志定位漏洞,一般不是“直接看日志就出漏洞”,而是从日志中发现异常行为 → 反推代码/配置问题 → 确认漏洞。下面按实战流程说明。
php --ini
# 或
rpm -ql php-common | grep php.ini
常见位置:
/etc/php.ini
/etc/php.d/*.ini
关键配置:
log_errors = On
error_log = /var/log/php/php_error.log
display_errors = Off # 生产环境应关闭
/var/log/php/php_error.log
/var/log/httpd/error_log
/var/log/nginx/error.log
如果是 PHP-FPM:
/var/log/php-fpm/error.log
/var/log/php-fpm/www-error.log
grep -E "PHP Warning|PHP Fatal error" /var/log/php/php_error.log
常见可疑点:
Undefined indexinclude(): Failed openingeval()'d codepreg_replace():assert():这些本身不是漏洞,但常被漏洞利用链使用
在日志中搜索:
grep -E "eval|system|exec|shell_exec|passthru|popen|proc_open" /var/log/php/php_error.log
如果看到:
PHP Warning: system() has been disabled for security reasons
说明有人在尝试执行系统命令
tail -f /var/log/httpd/access_log
tail -f /var/log/nginx/access.log
grep -E "union select|base64_decode|/etc/passwd|php://input|eval\(" access_log
示例攻击 URL:
GET /index.php?page=../../etc/passwd
GET /uploads/shell.php
POST /admin.php HTTP/1.1
[2026-01-21 10:22:03] PHP Warning: include(../../config.php)
grep "10:22:03" /var/log/nginx/access.log
GET /view.php?file=../../config.php
include($_GET['file']);
✅ 确认:文件包含漏洞(LFI)
| 日志表现 | 可能漏洞 |
|---|---|
| include($_GET) 报错 | 文件包含 |
| system() / exec() 报错 | 命令执行 |
| SQL syntax error | SQL 注入 |
| preg_replace /e | 老版本 RCE |
| move_uploaded_file 失败 | 上传漏洞 |
| open_basedir 报错 | 目录穿越 |
log_errors = On
error_log = syslog
suhosin(老)snuffleupagus(新)grep -rn "eval(" /var/www/html
或:
lynis audit system
CentOS 上定位 PHP 漏洞 = PHP 错误日志 + Web 访问日志 + 时间戳关联 + 代码回溯
如果你愿意,可以:
我可以直接帮你分析是哪类漏洞。