网站被挂马大概率因PHP文件包含漏洞被利用——攻击者通过可控include/require参数加载并执行恶意代码。须从漏洞入口、落点路径、执行条件三方面同步处置:立即禁用allow_url_include、设置open_basedir、停用动态包含逻辑、清空/tmp/upload/logs/session等高危目录中的异常PHP文件或base64内容。

网站被挂马,大概率是PHP文件包含漏洞已被利用——攻击者通过可控的 include 或 require 参数,把恶意代码(比如上传的图片马、日志里注入的PHP片段、会话文件中的payload)成功加载并执行了。这不是单纯“删木马”就能解决的问题,必须从漏洞入口、落点路径、执行条件三方面同步处置。
立即止损:断开恶意执行链
先阻止正在发生的危害:
- 临时禁用危险配置:检查
php.ini,确认allow_url_include = Off(关掉远程包含)、open_basedir已设为应用根目录(限制可访问路径范围) - 停用可疑包含逻辑:定位到出问题的页面(如
index.php?page=xxx),暂时注释或删除动态include($page . '.php')这类语句,改用硬编码或白名单路由 - 清空高危落点:检查
/tmp、upload/、logs/、session.save_path目录下是否有异常PHP文件、base64编码内容、或非图片扩展名但内容含<?php的文件
溯源清理:找到挂马的完整路径
挂马不是单点行为,而是一条链路:用户输入 → 路径拼接 → 文件加载 → 代码执行。重点查这四环:
- 搜索所有
include(、require(、include_once(、require_once(调用,顺着参数往上追来源——是否来自$_GET、$_POST、$_COOKIE、$_SERVER['HTTP_USER_AGENT']等? - 检查是否用了
php://filter、data://、phar://等伪协议,这类请求不会留下常规文件,但会在日志中体现为长URL(如含php://filter/read=convert.base64-encode/resource=config.php) - 查看Web服务器访问日志和错误日志,筛选含
etc/passwd、config.php、.log、session、%00、..%2f的请求,确认攻击时间窗口和手法
彻底修复:用白名单代替过滤,从设计上堵死
别再依赖“替换 ../”“过滤 php 字样”这类黑名单方式——它们在编码绕过、大小写混淆、空字节截断面前形同虚设。真正有效的做法是解耦用户输入与文件路径:
立即学习“PHP免费学习笔记(深入)”;
- 把页面名映射成固定路径:
$pages = ['home' => 'home.php', 'about' => 'about.php']; $file = $pages[$_GET['page']] ?? 'home.php'; include($file); - 使用
realpath()+dirname(__FILE__)做路径规范化校验:确保最终路径落在允许目录内,且不跳出预期范围 - 对所有包含操作加
is_file()和is_readable()双重判断,拒绝非常规后缀(如.txt、.log)被包含
加固环境:让即使有漏洞也难利用
代码修复是核心,但配置层加固能大幅提高攻击门槛:
- 禁用高危函数:在
php.ini中设置disable_functions = system,exec,passthru,shell_exec,proc_open,popen - 限制文件操作范围:启用
open_basedir,明确指定脚本只能访问的目录树 - 关闭不必要的协议支持:除必要外,禁用
allow_url_fopen和allow_url_include - Web服务器层面限制:Nginx/Apache 配置禁止直接访问
.php以外的敏感目录(如config/、logs/)



















