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漏洞首批攻击流量监测通报
相关推荐
§ꦿCFོ༉7 小时前
嵌入式八股文—C语言入门学习(四)
c语言·开发语言·学习
投图匠7 小时前
十种不同风格的 CTP接口 框架
开发语言·python
2601_967980119 小时前
深入理解词向量算法及其在Python中的实践
python·word2vec·glove·fasttext·词向量
129Lab9 小时前
电池循环测试数据自动化分析:用Python+AI工具构建一键式寿命评估流水线
python·数据分析·电池测试·数据自动化·寿命评估
treasure1409 小时前
【复古】浅尝Django前后端不分离
前端·css·python·django·bootstrap·html·web
Dmz丶10 小时前
前端转 AI 100 天 Day 44:前端集成实战——用 React 给 Agent 做个正式界面
python
jay神10 小时前
基于 YOLOv8 的手势识别系统(Web 版)
前端·人工智能·python·深度学习·yolo·计算机视觉·计算机毕业设计
DeepVisionary10 小时前
阿里云上线旗舰多模态新模型,不公布跑分且限时14天退役
python·自动化
东莞市云毅网络有限公司10 小时前
FAQ 覆盖度打分:TF-IDF 与向量嵌入双路召回的 Python 实现
python·数据清洗·rag·企业知识库·文档解析
爱笑的k1111 小时前
nano-vllm 源码剖析:千行 Python 手写离线推理引擎的调度、显存与并行时序
开发语言·python·vllm