零基础 Web 安全笔记:文件包含 / 命令执行 / CSRF 漏洞攻防、PHP 函数与防御方案

目录

一、文件包含漏洞

[(一)靶场用到的 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())

[(二)命令执行 / 命令注入漏洞防御方式](#(二)命令执行 / 命令注入漏洞防御方式)

三、CSRF(跨站请求伪造)漏洞

[(一)靶场涉及的逻辑与相关 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.cafileopenssl.capath,最后一行是allow_url_include=On
  • 图中内容 : 该配置设为 On 时,允许通过 URL 包含远程服务器上的文件(即远程文件包含 RFI );设为 Off 时只能包含服务器本地文件(即本地文件包含 LFI)。 图中还标注了操作步骤:修改配置后需要重启 Nginx 生效。
3. PHP 伪协议:php://input
  • 对应图片 1"php://input 是 PHP 中一个只读的数据流" 的说明截图

  • 对应图片 2DVWA 地址栏传 ?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 版本、配置文件路径、已开启扩展、服务器信息等。

(二)文件包含漏洞防御方式

  1. 关闭高危配置 php.ini 中设置 allow_url_include = Offallow_url_fopen = Off,彻底禁止远程文件包含。
  2. 白名单 + 固定路径 不要直接把用户输入传给包含函数,限制只能包含指定目录下的文件,用白名单判断传入的文件名是否合法(比如只允许file1.phpfile2.php)。
  3. 过滤路径穿越字符 对用户输入中的 ../..\%00 等路径遍历、截断字符进行过滤或转义,防止跳出指定目录。
  4. 使用自动加载机制 项目中优先用 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 官方说明截图("把第一个参数作为回调函数调用")
  • 对应图片 2call_user_func("system","whoami") 示例截图
  • 图中内容 : 该函数第一个参数是要调用的函数名,后面的参数是传给该函数的参数。如果第一个参数可控,攻击者就可以传入system等命令执行函数,间接执行系统命令,常用来绕过 WAF 过滤。
3. 代码执行函数:eval()
  • 对应图片eval(call_user_func("system","whoami")) 相关的绕过示例截图
  • 作用:把字符串当作 PHP 代码执行,常和回调函数搭配,用来层层绕过过滤规则。

(二)命令执行 / 命令注入漏洞防御方式

  1. 减少命令函数使用 优先用 PHP 原生函数实现功能,尽量不调用系统命令。
  2. 严格白名单过滤 若必须使用命令函数,对用户输入做白名单限制,只允许输入数字、字母等安全字符,彻底禁止 &|;$、反引号等特殊符号。
  3. 使用官方转义函数
    • escapeshellcmd():转义整条命令中的特殊字符
    • escapeshellarg():把用户输入包裹成安全的单个命令参数 二者配合使用可以杜绝命令结构被破坏。
  4. 降权运行服务 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 漏洞防御方式

  1. Token 校验机制(最主流有效) 用户登录后,服务器生成一个随机 CSRF 令牌存在 Session 中;所有敏感操作(改密码、删数据)的表单 / 请求都必须携带这个令牌,服务器收到请求后先校验 Token 是否匹配。 攻击者的第三方页面无法获取到用户本地的 Token,因此无法伪造有效请求。

  2. 校验 Referer 请求头 验证 HTTP 请求头中的Referer字段,确保请求来自本站域名。该方法可作为辅助防御,但存在被绕过的可能。

  3. 敏感操作二次验证 修改密码、转账等高危操作,要求用户输入原密码、图形验证码或短信验证码,确保是用户本人主动操作。

  4. Cookie 设置 SameSite 属性 给 Session Cookie 设置 SameSite=StrictSameSite=Lax,限制第三方网站发起请求时自动携带 Cookie,从浏览器层面阻断 CSRF。

最后附带的安全测试规范提示 : 正如你总结的,在使用 Acunetix (AWVS) 等 Web 漏洞扫描工具时,必须在有明确授权的情况下进行扫描 。并且,扫描器报出的漏洞(高、中、危)通常存在误报,每个扫描出来的东西,你自己要去亲自验证一遍(二次验证并修改)。这是走向正规网络安全工程师非常关键的职业素养。

相关推荐
连续讨伐2 小时前
php小结
开发语言·php
paopaokaka_luck2 小时前
基于springboot3+vue3的智能文库平台(AI智能搜索、AI智能汇总、实时在线状态展示、多格式文档预览与富文本编辑、Echarts图形化分析)
前端·网络·spring boot·网络协议·echarts
RisunJan2 小时前
Linux命令-shutdown(安全关闭或重启系统)
linux·服务器·安全
2601_965798473 小时前
MTDb Movie & TV Database Script Setup, Caching, and SEO Guide
linux·服务器·数据库·php
菩提小狗3 小时前
每日安全情报报告 · 2026-07-31
网络安全·漏洞·cve·安全情报·每日安全
山东科恩光电3 小时前
如何通过安全地毯确保工业现场的人员防护?
安全
发光小北4 小时前
SG-RS232/485/422-Fiber-110 串口光纤收发器如何使用?
网络协议
小小代码狗5 小时前
PHP 常用函数与变量参考文档
开发语言·安全·php
看昭奚恤哭5 小时前
LWIP TCP滑动窗口为TCP ZeroWindow的解决方法
网络·tcp/ip·php
AC赳赳老秦5 小时前
CSDN 技术社区数据采集:OpenClaw 抓取公开技术热帖,生成领域技术热点周报
java·大数据·前端·数据库·python·php·openclaw