查access.log可快速定位高频404/500的ip与异常路径,需结合时间对齐error_log、记录原始输入参数、校验referer与user-agent组合,并关注含..%2f、union select等恶意特征的url。

查 access.log 里高频 404 或 500 的 IP 和路径
异常请求往往先体现在 Web 服务器访问日志里,而不是 PHP 错误日志。Apache 的 access.log 或 Nginx 的 access.log 记录了每个请求的完整上下文,比 PHP 层日志更早、更全。
- 用
grep " 404 " /var/log/apache2/access.log | awk '{print $1,$7}' | sort | uniq -c | sort -nr | head -10快速找出被反复探测的路径和 IP - 重点关注含
..%2f、.php?/、union select、base64_decode的 URL —— 这些大概率是扫描或注入尝试 - 注意时间集中性:同一 IP 在 1 秒内发起 20+ 请求,基本可判定为自动化攻击,不是业务流量
匹配 error_log 中对应时间戳的 PHP 致命错误
攻击触发后,PHP 层常因文件包含、eval 或未过滤参数抛出 Fatal error 或 Parse error。此时需把 access.log 时间和 error_log 对齐,确认是否为同一请求引发。
- 从 access.log 提取可疑请求时间(如
[05/Jul/2026:10:23:41),再用grep "05/Jul/2026:10:23" /var/log/php_errors.log搜索 PHP 日志 - 若发现
PHP Warning: include(): Failed opening 'xxx.php' for inclusion,且 xxx 来自 $_GET 参数,基本锁定文件包含漏洞 - 注意
allow_url_include=Off是否生效 —— 若没关,include($_GET['f'])可能直接拉取远程恶意脚本
用自定义日志记录可疑参数值
PHP 错误日志不记录原始请求参数,仅记录执行失败的结果。要定位“谁传了什么”,必须主动记录输入。
- 在入口或路由分发前加一段检查:
if (preg_match('/(union|select|from|insert|drop|load_file|outfile)/i', http_build_query($_REQUEST))) { error_log("Suspicious input from " . $_SERVER['REMOTE_ADDR'] . ": " . json_encode($_REQUEST), 3, "/var/log/suspicious.log"); } - 避免只记录
$_GET—— 攻击者常用 POST 或 JSON body 绕过,应统一解析file_get_contents('php://input')并检查 - 日志路径权限要设对:
chown www-data:www-data /var/log/suspicious.log,否则写入失败无声无息
别忽略 Referer 和 User-Agent 的异常组合
真实用户请求的 Referer 和 User-Agent 有明显规律;扫描器或 bot 往往缺失、固定或矛盾。
- 典型异常:
Referer为空但User-Agent是sqlmap/1.7;或Referer是某电商首页,却请求/admin/config.php - 用
awk '$11 ~ /sqlmap|dirbuster|gobuster/ || $11 == "-" && $9 != "-"' /var/log/apache2/access.log快速筛出可疑 UA - 注意伪造:攻击者可伪造字段,所以不能单靠它定性,但可作为辅助线索与 IP、路径交叉验证
Fatal error 却不知道谁、什么时候、用什么 payload 触发的 —— 审计就变成猜谜。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











