目录
[(一)靶场用到的 PHP 函数 / 配置](#(一)靶场用到的 PHP 函数 / 配置)
[1. 核心包含函数:include / include_once / require / require_once](#1. 核心包含函数:include / include_once / require / require_once)
[2. PHP 配置项:allow_url_include](#2. PHP 配置项:allow_url_include)
[3. PHP 伪协议:php://input](#3. PHP 伪协议:php://input)
[4. 验证函数:phpinfo()](#4. 验证函数:phpinfo())
[二、命令执行 / 命令注入漏洞](#二、命令执行 / 命令注入漏洞)
[(一)靶场用到的 PHP 函数](#(一)靶场用到的 PHP 函数)
[1. 系统命令执行核心函数](#1. 系统命令执行核心函数)
[2. 回调执行函数:call_user_func()](#2. 回调执行函数:call_user_func())
[3. 代码执行函数:eval()](#3. 代码执行函数:eval())
[(二)命令执行 / 命令注入漏洞防御方式](#(二)命令执行 / 命令注入漏洞防御方式)
[(一)靶场涉及的逻辑与相关 PHP 点](#(一)靶场涉及的逻辑与相关 PHP 点)
[(二)CSRF 漏洞防御方式](#(二)CSRF 漏洞防御方式)
一、文件包含漏洞
(一)靶场用到的 PHP 函数 / 配置
1. 核心包含函数:include / include_once / require / require_once

- 图中内容 : 漏洞核心代码为 include _GET['page'] / require_once _GET['page']------ 直接把用户可控的 GET 参数传给包含函数,导致任意文件都能被加载。
- 函数区别 (图下方有标注):
include:包含文件出错时只报警告,后续代码继续执行require:包含文件出错时报致命错误,直接终止脚本_once后缀:同一个文件只包含一次,避免重复定义变量 / 函数报错
- 补充特性 (对应 "改成.JPG 后" 那张图): 包含函数只解析文件里的 PHP 代码,不校验文件后缀 。所以哪怕是
.jpg的图片马,只要里面藏了 PHP 代码,被 include 后就会执行。
2. PHP 配置项:allow_url_include
- 对应图片 :

- 你文档里
php.ini配置文件截图(含openssl.cafile、openssl.capath,最后一行是allow_url_include=On) - 图中内容 : 该配置设为
On时,允许通过 URL 包含远程服务器上的文件(即远程文件包含 RFI );设为Off时只能包含服务器本地文件(即本地文件包含 LFI)。 图中还标注了操作步骤:修改配置后需要重启 Nginx 生效。
3. PHP 伪协议:php://input
-
对应图片 1 :
"php://input 是 PHP 中一个只读的数据流" 的说明截图 -
对应图片 2 :
DVWA 地址栏传 ?page=php://input的请求截图 -
图中内容 :
php://input用于读取 HTTP 请求的原始 POST 体。在文件包含漏洞中,我们可以在 POST 请求体里写 PHP 代码,当page=php://input时,POST 里的代码就会被当作 PHP 文件包含执行。

- 配套对应图 :Base64 在线编解码工具截图 配合
php://filter伪协议(php://filter/read=convert.base64-encode/resource=xxx.php)可以读取 PHP 文件的源码,再用 Base64 解码得到原文。
4. 验证函数:phpinfo()


- 对应图片:PHP Version 7.3.4 的 phpinfo 信息页截图
- 图中内容: 用来验证文件包含是否成功执行 PHP 代码,同时可以查看 PHP 版本、配置文件路径、已开启扩展、服务器信息等。
(二)文件包含漏洞防御方式
- 关闭高危配置 php.ini 中设置
allow_url_include = Off、allow_url_fopen = Off,彻底禁止远程文件包含。 - 白名单 + 固定路径 不要直接把用户输入传给包含函数,限制只能包含指定目录下的文件,用白名单判断传入的文件名是否合法(比如只允许
file1.php、file2.php)。 - 过滤路径穿越字符 对用户输入中的
../、..\、%00等路径遍历、截断字符进行过滤或转义,防止跳出指定目录。 - 使用自动加载机制 项目中优先用 PHP 的
spl_autoload_register自动加载类,减少手动写 include/require 传参的场景。
二、命令执行 / 命令注入漏洞
(一)靶场用到的 PHP 函数
1. 系统命令执行核心函数
- 对应图片:"系统命令执行漏洞相关函数" 汇总截图(列出了 system、exec、shell_exec 等)

- 图中包含的函数及作用 :
system():执行系统命令,并直接输出执行结果exec():执行命令,只返回结果的最后一行shell_exec():执行命令,返回全部输出结果passthru():执行命令并直接输出原始内容(适合输出二进制文件)popen():打开进程文件指针,可对命令进行读写操作- 反引号 `````:语法级的命令执行,效果和 shell_exec 一致
- 配套对应图 :CMD 里执行
ping 192.168.50.1 && whoami的截图 演示了命令注入的核心 ------ 用&&、||、&、|、;等连接符,在原有命令后拼接额外命令。
2. 回调执行函数:call_user_func()


- 对应图片 1:call_user_func 官方说明截图("把第一个参数作为回调函数调用")
- 对应图片 2 :
call_user_func("system","whoami")示例截图

- 图中内容 : 该函数第一个参数是要调用的函数名,后面的参数是传给该函数的参数。如果第一个参数可控,攻击者就可以传入
system等命令执行函数,间接执行系统命令,常用来绕过 WAF 过滤。
3. 代码执行函数:eval()

- 对应图片 :
eval(call_user_func("system","whoami"))相关的绕过示例截图 - 作用:把字符串当作 PHP 代码执行,常和回调函数搭配,用来层层绕过过滤规则。
(二)命令执行 / 命令注入漏洞防御方式
- 减少命令函数使用 优先用 PHP 原生函数实现功能,尽量不调用系统命令。
- 严格白名单过滤 若必须使用命令函数,对用户输入做白名单限制,只允许输入数字、字母等安全字符,彻底禁止
&、|、;、$、反引号等特殊符号。 - 使用官方转义函数
escapeshellcmd():转义整条命令中的特殊字符escapeshellarg():把用户输入包裹成安全的单个命令参数 二者配合使用可以杜绝命令结构被破坏。
- 降权运行服务 Web 服务(Nginx、PHP-FPM)以低权限用户运行,即使被注入命令,也无法执行删库、改配置等高权限操作。
三、CSRF(跨站请求伪造)漏洞
(一)靶场涉及的逻辑与相关 PHP 点
CSRF 不是由某个 PHP 函数直接产生的漏洞,本质是利用用户已登录的身份,诱导用户被动发起恶意请求。

- 对应图片 1:"诱导用户用他的电脑对平台进行攻击,前提用户对平台有登录凭证" 的原理示意图

- 对应图片 2 :本地
test.html代码截图(里面直接拼接了 DVWA 修改密码的 URL)- 图中内容:只要已登录 DVWA 的用户打开这个 HTML 页面,浏览器就会自动带上用户的 Cookie,发起修改密码的请求。服务器只验证了登录状态,没验证请求是不是用户主动发起的。
- 防御会用到的 PHP 函数 :
session_start():开启会话,存储用户身份与令牌random_bytes()/md5()/uniqid():生成随机 CSRF 令牌hash_equals():安全校验提交的令牌与会话中存储的是否一致
(二)CSRF 漏洞防御方式
-
Token 校验机制(最主流有效) 用户登录后,服务器生成一个随机 CSRF 令牌存在 Session 中;所有敏感操作(改密码、删数据)的表单 / 请求都必须携带这个令牌,服务器收到请求后先校验 Token 是否匹配。 攻击者的第三方页面无法获取到用户本地的 Token,因此无法伪造有效请求。
-
校验 Referer 请求头 验证 HTTP 请求头中的
Referer字段,确保请求来自本站域名。该方法可作为辅助防御,但存在被绕过的可能。 -
敏感操作二次验证 修改密码、转账等高危操作,要求用户输入原密码、图形验证码或短信验证码,确保是用户本人主动操作。
-
Cookie 设置 SameSite 属性 给 Session Cookie 设置
SameSite=Strict或SameSite=Lax,限制第三方网站发起请求时自动携带 Cookie,从浏览器层面阻断 CSRF。
最后附带的安全测试规范提示 : 正如你总结的,在使用 Acunetix (AWVS) 等 Web 漏洞扫描工具时,必须在有明确授权的情况下进行扫描 。并且,扫描器报出的漏洞(高、中、危)通常存在误报,每个扫描出来的东西,你自己要去亲自验证一遍(二次验证并修改)。这是走向正规网络安全工程师非常关键的职业素养。