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

目录

一、文件包含漏洞

(一)靶场用到的 PHP 函数 / 配置

1. 核心包含函数:include / include_once / require / require_once

2. PHP 配置项:allow_url_include

3. PHP 伪协议:php://input

4. 验证函数:phpinfo()

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

二、命令执行 / 命令注入漏洞

(一)靶场用到的 PHP 函数

1. 系统命令执行核心函数

2. 回调执行函数:call_user_func()

3. 代码执行函数:eval()

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

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

(一)靶场涉及的逻辑与相关 PHP 点

(二)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 漏洞扫描工具时,必须在有明确授权的情况下进行扫描。并且,扫描器报出的漏洞(高、中、危)通常存在误报,每个扫描出来的东西,你自己要去亲自验证一遍(二次验证并修改)。这是走向正规网络安全工程师非常关键的职业素养。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Content First

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值