PHP漏洞被利用,怎么揪出攻击IP?

10月21日,PHP紧急发布安全更新,一次性修掉两个远程代码执行漏洞。补丁上线的消息还没传开,攻击就已经开始了,Cloudflare在补丁发布前数小时就监测到首批攻击流量。如果你的站点跑在PHP上,现在最该问的是:**日志里哪些IP是趁乱打过来的?**做一次网站ip查询,把高频段和正常访客分开,就能锁定趁火打劫的那批来源。

一、两个漏洞,一个请求就能打穿

这两个漏洞编号是CVE-2026-109618和CVE-2026-109619,CVSS评分都是9.2。前者利用内存不足时的清理逻辑,让请求内存停留在未初始化状态,进而远程执行代码;后者是全局状态在请求释放后仍指向旧内存,属于释放后使用。两个漏洞都能在未认证的情况下触发,在Apache的mod_php模式下,甚至不经过应用代码、一个请求就直接命中。触发条件都埋在PHP每次请求必经的内存管理和错误处理里,只要站点还开着PHP,就躲不开这轮风险。受影响的PHP版本从8.2到8.5,官方已给出8.2.35、8.3.36、8.4.27、8.5.12四个修复版。

二、影响面有多大

看两个数字。W3Techs统计,PHP驱动了约75%的可识别网站,而基于PHP的WordPress又占了全部网站的约43%。PHP-FPM、Apache的mod_php、php-cgi、FrankenPHP、LiteSpeed这些部署方式全都受影响,其中mod_php风险最高,因为它能在应用代码执行前就触发漏洞。这意味着互联网上相当大一块站点,底层都跑着同一套引擎。攻击者不需要针对某个具体网站,扫描全网、命中任何一个未打补丁的PHP服务就行。多国政府网站本周紧急下线避险,正是因为这条攻击链不挑目标。

三、攻击源长什么样

漏洞公开后,第一波流量几乎都是自动化扫描:攻击者用脚本批量探测存活目标,再对命中的版本发利用请求。这类流量在日志里有明显特征------来源IP集中、请求密集、路径重复。真正动手前,先按IP把访问日志聚合一遍,高频段一拎就出来。

四、代码实操:用一次网站ip查询 识别扫描段

把日志里出现次数靠前的IP交给IP数据云,查它的归属地和网络类型,扫描器藏不住:

python 复制代码
Python
import re
from collections import Counter

import requests

DC_KEYS = ("数据中心", "机房", "idc", "cloud", "hosting")

def lookup(ip):
    if not str(ip or "").strip():
        return None
    try:
        resp = requests.get(
            "https://api.ipdatacloud.com/v2/query",
            params={"ip": ip, "key": "你的KEY"},
            timeout=5,
        )
        resp.raise_for_status()
        body = resp.json()
    except (requests.RequestException, ValueError):
        return None
    if not isinstance(body, dict):
        return None
    if str(body.get("code")) != "200":
        return None
    data = body.get("data")
    if not isinstance(data, dict) or not data:
        return None
    return {
        "country": str(data.get("country") or "").strip(),
        "net_type": str(data.get("usage_type") or "").strip().lower(),
    }

def top_ips(log_lines, n=10):
    ips = []
    for line in log_lines:
        part = line.split(" ", 1)[0]
        if part.count(".") == 3:
            ips.append(part)
    return Counter(ips).most_common(n)

def scan_report(log_lines):
    report = []
    for ip, cnt in top_ips(log_lines):
        info = lookup(ip)
        if info is None:
            report.append((ip, cnt, "unknown", "查不到归属数据"))
            continue
        is_dc = any(k in info["net_type"] for k in DC_KEYS)
        tag = "机房/数据中心段" if is_dc else "家庭/移动网络"
        report.append((ip, cnt, info["country"], tag))
    return report

判断还是那一条:**高频访问落在机房或数据中心段,基本可以归为自动化扫描或攻击流量;落在家庭宽带段、请求还稀疏的,才更像正常访客。**这一轮网站ip查询的价值,就在把机房段的高频来源一次性拎出来。查不到归属数据时标unknown,别把它当正常放过。扫完把机房段的高频IP拉进临时拦截名单,配合官方补丁一起上,才是完整的处置。

五、先打补丁,再做排查

排序别反了。第一优先是升级到8.2.35 / 8.3.36 / 8.4.27 / 8.5.12并重启工作进程,这步不落,排查再细也是给下一次攻击留门。补丁一时上不了的话,可以先设memory_limit=-1、收紧请求体大小上限,给攻击路径加一道临时缓冲。补丁打完后,再用上面的方式把已经进来的扫描段清一遍,看有没有被利用成功的痕迹。

六、识别是手段,升级才是解药

一次网站ip查询把扫描源从正常流量里分出来,价值在于让你知道攻击从哪来、打过几次,但漏洞的根在引擎本身,只有升级补丁能关掉这扇门。识别能帮你快一步发现,快一步发现能帮你少漏一台机器。

数据来源:

  • CERT-EU:Security Advisory 2026-018(PHP两个远程代码执行漏洞官方公告)
  • W3Techs:网站服务器端语言使用率统计
  • Cloudflare:PHP漏洞首批攻击流量监测通报
相关推荐
2601_967980112 小时前
Python列表操作方法详解
python·数据类型·修改·列表操作·功能汇总
终端安全笔记2 小时前
一份配置管十项 AI 功能:它关的是入口,不是数据
网络安全·ios·移动设备管理
卡卡~~2 小时前
“101计划”核心课程实践教材《数据实验结构指导-C++语言版》题目集
开发语言·c++·学习·算法
Patrick在香港2 小时前
台风在变少,来香港的没有
python·数据分析·香港·开放数据·热带气旋
qq_406981033 小时前
大白话rust系列09 函数调用两次有什么错?
开发语言·python·rust
学逆向的3 小时前
C 多文件开发
c语言·开发语言·网络安全
布吉岛的石头3 小时前
Java 程序员第 50 阶段3:数据工程:预训练语料清洗与去重
java·开发语言·人工智能·深度学习·transformer
benchmark_cc3 小时前
QuantDash 安装成功后,如何验证 Python 环境可以正常导入 SDK?
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
学逆向的3 小时前
C 内存属性
c语言·开发语言·算法·网络安全