DVWA靶场通关笔记-CSRF(Impossible级别)

目录

一、查看源码

二、功能分析

三、CSRF防范分析

1、CSRF令牌验证机制

(1)核心原理

(2)防范机制

2、旧密码确认防御实现

(1)核心原理

(2)为什么旧密码确认能有效防范CSRF?


本系列为通过《DVWA靶场通关笔记》的CSRF关卡(low,medium,high,impossible共4关)渗透集合,通过对相应关卡源码的代码审计找到讲解渗透原理并进行渗透实践,本文为CSRF impossible关卡的原理分析部分,讲解相对于low、medium和high级别,为何对其进行渗透测试是Impossible的。

一、查看源码

进入DVWA靶场CSRF的源码目录,找到impossible.php源码,分析其为何能让这一关卡名为不可能实现命令执行渗透。

打开impossible.php文件,对其进行代码审计,这段PHP代码实现了一个密码修改功能,通过CSRF令牌验证防止跨站请求伪造,使用预处理语句防范SQL注入,并对用户输入的当前密码进行MD5加密验证,确保新旧密码匹配后才更新数据库。

  • 密码修改验证:处理用户发起的密码更改请求

  • CSRF防护:通过token验证防止跨站请求伪造攻击

  • 密码验证:确认当前密码正确且新密码匹配

详细注释后的impossible.php源码如下所示,主要实现密码修改功能,修复了CSRF安全风险。

<?php
// 检查是否通过 GET 方法提交了 'Change' 参数(触发密码修改操作)
if( isset( $_GET[ 'Change' ] ) ) {// 验证 CSRF 令牌,防止跨站请求伪造攻击checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );// 获取用户输入的当前密码、新密码和确认密码$pass_curr = $_GET[ 'password_current' ];$pass_new  = $_GET[ 'password_new' ];$pass_conf = $_GET[ 'password_conf' ];// 处理当前密码:// 1. 移除可能的转义字符// 2. 使用 mysqli_real_escape_string 进行 SQL 转义(尽管后续使用了预处理语句)// 3. 计算 MD5 哈希值(用于与数据库中存储的密码比较)$pass_curr = stripslashes( $pass_curr );$pass_curr = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass_curr ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));$pass_curr = md5( $pass_curr );// 查询数据库,验证当前密码是否正确// 使用 PDO 预处理语句防止 SQL 注入$data = $db->prepare( 'SELECT password FROM users WHERE user = (:user) AND password = (:password) LIMIT 1;' );$data->bindParam( ':user', dvwaCurrentUser(), PDO::PARAM_STR );$data->bindParam( ':password', $pass_curr, PDO::PARAM_STR );$data->execute();// 验证条件:// 1. 新密码和确认密码是否一致// 2. 当前密码是否与数据库中存储的密码匹配if( ( $pass_new == $pass_conf ) && ( $data->rowCount() == 1 ) ) {// 条件满足,处理新密码:// 1. 移除可能的转义字符// 2. 使用 mysqli_real_escape_string 进行 SQL 转义(尽管后续使用了预处理语句)// 3. 计算 MD5 哈希值(用于存储到数据库)$pass_new = stripslashes( $pass_new );$pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));$pass_new = md5( $pass_new );// 更新数据库中的密码// 使用 PDO 预处理语句确保安全性$data = $db->prepare( 'UPDATE users SET password = (:password) WHERE user = (:user);' );$data->bindParam( ':password', $pass_new, PDO::PARAM_STR );$data->bindParam( ':user', dvwaCurrentUser(), PDO::PARAM_STR );$data->execute();// 显示成功信息$html .= "<pre>Password Changed.</pre>";}else {// 显示失败信息(密码不匹配或当前密码错误)$html .= "<pre>Passwords did not match or current password incorrect.</pre>";}
}// 生成新的 CSRF 令牌,用于后续请求的验证
generateSessionToken();
?>

二、功能分析

这段 PHP 代码实现了一个密码修改功能,用户提交当前密码、新密码和确认密码后,系统先验证Anti-CSRF令牌防止跨站请求伪造,然后检查当前密码是否正确(通过数据库查询)以及新密码是否匹配。验证通过后,对新密码进行MD5哈希处理并更新到数据库。代码使用PDO预处理语句防止SQL注入,同时兼容性地使用mysqli_real_escape_string进行额外防护。

  • Anti-CSRF 防护
    • 使用 checkToken() 验证用户提交的 Token,防止 CSRF 攻击。
    • 每次页面加载时生成新的 TokengenerateSessionToken())。
  • 密码修改逻辑
    • 用户提交 password_current(当前密码)、password_new(新密码)、password_conf(确认密码)。
    • 检查 password_new  password_conf 是否一致。
    • 检查 password_current 是否正确(查询数据库)。
    • 如果验证通过,更新数据库中的密码。
  • 输入清理与哈希
    • 使用 stripslashes() 去除可能的反斜杠(防止魔术引号影响)。
    • 使用 mysqli_real_escape_string 防止 SQL 注入(兼容旧代码)。
    • 使用 md5() 对密码进行哈希。
  • 数据库操作
    • 使用 PDO 预处理语句(prepare + bindParam)防止 SQL 注入。
    • 查询当前密码是否正确(SELECT ... LIMIT 1)。
    • 更新密码(UPDATE users SET password = ...)。
  • 反馈信息
    • 成功时返回 Password Changed.
    • 失败时返回 Passwords did not match or current password incorrect.

三、CSRF防范分析

代码中主要使用两种方法进行防御,一个恶意请求必须同时满足以下两个条件才能成功:

  1. 携带正确且最新的CSRF Token。(第一道关卡)

  2. 携带正确的当前用户密码。(第二道关卡)

缺少任何一个,攻击都会失败。具体如下所示。

防御层机制优点局限性
第一层:CSRF Token验证请求是否来源于真正的网站表单。直接针对CSRF攻击原理,防范绝大多数自动化攻击。如果Token生成、存储或验证逻辑存在缺陷,可能被绕过。
第二层:旧密码确认验证执行敏感操作的用户是否知晓某个机密。极其强大。即使CSRF Token因某种原因失效,此层依然坚挺。攻击者几乎无法绕过。对用户体验有轻微影响(需要多输入一个字段)。

1、CSRF令牌验证机制

(1)核心原理

核心原因在于,它不仅仅验证用户的登录凭证(Session Cookie),还要求每个敏感请求(如修改密码)都必须携带一个一次性、随机的、与会话绑定的令牌

// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

(2)防范机制

同步令牌模式:服务器为每个会话生成一个随机、不可预测的令牌(Token),并将其同时存储在服务器端(Session)和客户端(表单隐藏域)。当客户端提交请求时,必须带回此令牌。服务器通过比对两者是否一致来验证请求是否来源于真实的网站页面,从而拒绝伪造的跨站请求。

  • 生成令牌 (Generate):在用户访问包含表单的页面时(如第一次访问密码修改页面),服务器端会调用 generateSessionToken() 函数生成一个随机令牌,并将其存储在用户的会话($_SESSION)中。

  • 分发令牌 (Distribute):服务器将这个令牌值嵌入到返回给用户的HTML表单中,作为一个隐藏字段(hidden field)。

  • 提交令牌 (Submit):当用户提交表单时,浏览器会自动将这个隐藏字段的值连同其他表单数据一并提交到服务器。

  • 验证令牌 (Verify):服务器接收到请求后,首先调用 checkToken() 函数,比对用户提交的令牌($_REQUEST['user_token'])和存储在服务器端会话中的令牌($_SESSION['session_token'])是否完全一致

    • 一致:请求被认为是合法的,继续执行密码修改逻辑。

    • 不一致或缺失:请求被认为是伪造的,立即终止,并将用户重定向到首页('index.php'

2、旧密码确认防御实现

(1)核心原理

权限复核(Re-authentication):要求用户在执行极高权限操作(如修改密码、邮箱)时,再次提供一项只有本人才知道的机密信息(当前密码)。这确保了即使是已经通过Cookie认证的用户会话,也必须证明操作者确实知道密码,而不仅仅是持有会话ID。这有效防御了CSRF、会话劫持以及在已登录设备上离开后的未授权操作。

(2)为什么旧密码确认能有效防范CSRF?

CSRF攻击的核心是 “借刀杀人” :利用用户浏览器中已有的身份凭证(如Session Cookie)来执行非用户本意的操作。这里特别强调非本意,即用户根部不知道要点击这个链接会直接导致什么后果。

旧密码确认能防御CSRF,并不是因为它是一个“明显的确认步骤”来提醒用户(虽然这算是一个次要的副作用),而是因为它在服务器端的技术层面,为执行敏感操作增加了一个攻击者无法提供的、必须验证通过的必要参数。

它将请求从 “有Cookie就能执行” 变成了 “有Cookie且知道密码才能执行” ,从而从根本上破坏了CSRF攻击成立的条件。这是一种非常强大且根本的防御措施。

  • 未知的“秘密”:用户的当前密码是一个只有用户自己知道的秘密。攻击者可以伪造请求的URL和参数,但他们无法伪造用户当前的密码

  • 攻击请求必然失败:攻击者构造的CSRF恶意链接中,password_current 参数只能是一个猜测值(如 123456password 等常见密码)或空值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/95012.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/95012.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深层语义在自然语言处理中的理论框架与技术融合研究

摘要本文章系统阐述了深层语义在自然语言处理&#xff08;NLP&#xff09;领域的定义、特征及其与知识图谱和大型预训练语言模型的融合方法。基于截至2025年8月的最新研究成果&#xff0c;报告深入分析了深层语义的多维度特性、技术实现路径以及面临的挑战&#xff0c;为研究人…

深入解析HarmonyOS:UIAbility与Page的生命周期协同

深入解析HarmonyOS&#xff1a;UIAbility与Page的生命周期协同 在HarmonyOS应用开发中&#xff0c;理解UIAbility和Page的生命周期是构建高质量应用的关键。本文将深入探讨这两大核心概念的生命周期及其协同工作机制&#xff0c;帮助开发者更好地管理应用资源、优化用户体验。…

规律作息 + 养成好的习惯 + 考研倒计时 111 天 + 线面积分入门 1 下半部分

文章目录前言杂进度10.4空间直线一般式方程对称式方程 点向式方程参数式方程转换位置关系10.510.610.7平面束方程10.810.9总结前言 规律作息&#xff01; 杂 欲买桂花同载酒&#xff0c;终不似&#xff0c;少年游。 进度 向量代数和空间解析几何。 10.4 这题就是算一个…

序列容器(vector,deque,list)

STL 序列式容器&#xff08;vector、deque、list、array、forward_list&#xff09;的核心特征是按插入顺序存储元素&#xff08;元素的逻辑顺序与物理存储顺序一致&#xff09; vector 下图是底层原理 具体点击链接vector介绍 deque(双端队列) 在 C STL 中&#xff0c;deque…

Time-MOE添加MLP分类头进行分类任务

文章目录一、背景&#xff1a;Time-MoE 的 4096 长度限制二、数据准备&#xff08;以帕金森二分类为例&#xff09;三、标签对齐&#xff08;弱监督&#xff09;四、类别不平衡 & 数据划分五、模型微调&#xff08;冻结 backbone&#xff0c;只训 MLP 头&#xff09;六、评…

朴素贝叶斯:用 “概率思维” 解决分类问题的经典算法

一、贝叶斯&#xff1a;从 “逆概” 问题走来的数学家要理解朴素贝叶斯&#xff0c;得先回到它的 “源头”—— 贝叶斯公式&#xff0c;以及它要解决的核心问题&#xff1a;逆概问题。1. 贝叶斯的 “生不逢时”托马斯・贝叶斯&#xff08;Thomas Bayes&#xff0c;约 1701-1761…

Qt/C++开发监控GB28181系统/视频点播主码流子码流/动态切换码流/支持海康大华/全网唯一

一、前言说明 目前市面上的国标监控系统&#xff0c;没有看到可以切换码流的&#xff0c;都是默认主码流&#xff0c;包括easynvr、livegbs、wvp等&#xff0c;很是奇怪为什么他们不做呢&#xff1f;难道没有用户反馈需要这个&#xff1f;我这就遇到过一些用户需要能够切换主码…

【 MYSQL | 基础篇 四大SQL语句 】资料位于文章末尾

摘要&#xff1a;本文先介绍数据库 SQL 的核心概念&#xff0c;接着阐述 SQL 通用语法与 DDL、DML、DQL、DCL 四大分类&#xff0c;随后详细讲解各类语句操作&#xff0c;包括 DDL 的数据库与表操作及数据类型&#xff0c;DML 的数据增删改&#xff0c;DQL 的查询语法与功能&am…

Webrtc支持FFMPEG硬解码之Intel

Intel QSV下载编译git clone https://github.com/lu-zero/mfx_dispatch.git1.使用CMake生产VS工程编译生成libmfx.lib文件 头文件为mfx文件夹libmfx---include---mfx---lib---libmfx.libWebrtc中ffmpeg的修改因为Webrtc中的ffmpeg是使用gn进行编译的&#xff0c;所以这里先找到…

【二叉树(DFS) - LeetCode】437. 路径总和 III

437. 路径总和 III 题解&#xff1a;DFS /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullp…

【Python】shutil.make_archive() 方法详解

文章目录功能概述函数签名核心参数详解1. base_name2. format3. root_dir4. base_dir使用示例将 /home/user/project/data 目录打包为 data.tar.gz&#xff0c;并保存到 /home/user/backups/打包当前工作目录下的 docs 文件夹为 zip 文件替代方案总结shutil.make_archive() 是 …

CAN总线(Controller Area Network Bus)控制器局域网总线(二)

6、错误帧 总线上所有设备都会监督总线的数据&#xff0c;一旦发现“位错误”或“填充错误”或“CRC错误”或“格式错误”或“应答错误” &#xff0c;这些设备便会发出错误帧来破坏数据&#xff0c;同时终止当前的发送设备。7、过载帧 当接收方收到大量数据而无法处理时&#…

LeetCode 317 离建筑物最近的距离

LeetCode 317 题的详细题目信息如下&#xff1a;题目名称Shortest Distance from All Buildings&#xff08;中文译名&#xff1a;离建筑物最近的距离&#xff09;题目描述给你一个由 0、1 和 2 组成的二维网格&#xff0c;其中&#xff1a;0 代表空地1 代表建筑物2 代表障碍物…

AI之CodeTool之Kode:Kode(claude_code风格)的简介、安装和使用方法、案例应用之详细攻略

AI之CodeTool之Kode&#xff1a;Kode(claude_code风格)的简介、安装和使用方法、案例应用之详细攻略 目录 相关文章 LLMs之PE之SystemPrompt&#xff1a;analysis_claude_code的简介、使用方法、案例应用之详细攻略 AI之CodeTool之Kode&#xff1a;Kode(claude_code风格)的简…

网络请求优化:用 Retrofit 拦截器玩转日志、重试与缓存,OkHttp 和 Volley 谁更香?

目录 1. 拦截器:Retrofit 的“超级管理员” 拦截器的本质 为什么用拦截器? 2. 日志拦截器:让请求和响应“现原形” 引入日志拦截器 实现日志拦截器 日志输出示例 生产环境注意事项 3. 重试拦截器:网络不稳定也能稳如狗 设计重试逻辑 集成到 Retrofit 优化重试策…

LeetCode - 283. 移动零

题目 283. 移动零 - 力扣&#xff08;LeetCode&#xff09; 思路 我们使用左右两个指针&#xff1a;左指针left指向已处理好的非零元素的末尾位置&#xff0c;右指针right用于遍历数组。 算法步骤&#xff1a; 初始化left为-1&#xff08;表示还没有处理任何非零元素&…

Redis不同场景下的注意事项

Redis常见的 使用场景&#xff1a; 缓存系统(核心场景) 存储热点数据&#xff0c;减少数据库访问压力。提升接口响应速度。技术点&#xff1a; 用String/Hash 存储结构化数据结合过期时间&#xff08;TTL&#xff09;和缓存淘汰策略(如LRU)管理内存。解决缓存问题&#xff1a;穿…

【完整源码+数据集+部署教程】高速公路施工区域物体检测系统源码和数据集:改进yolo11-RepNCSPELAN

背景意义 随着城市化进程的加快&#xff0c;高速公路建设与维护工作日益频繁&#xff0c;施工区域的安全管理成为亟待解决的重要问题。在高速公路施工区域&#xff0c;工人和设备的安全是首要考虑因素&#xff0c;而有效的物体检测系统能够显著提高施工现场的安全性与工作效率。…

如何在FastAPI中玩转全链路追踪,让分布式系统故障无处遁形?

url: /posts/30e1d2fbf1ad8123eaf0e1e0dbe7c675/ title: 全链路追踪如何让FastAPI微服务架构的每个请求都无所遁形? date: 2025-08-28T23:40:47+08:00 lastmod: 2025-08-28T23:40:47+08:00 author: cmdragon summary: 全链路追踪是现代微服务架构中监控系统行为的核心技术,通…

Win11 压缩实测:Win11 的压缩软件的最佳配置和使用方式

文章目录测试环境机器配置被压缩文件WinRAR7zipLinux子系统准备极限压缩减小字典的极限压缩7zipWin11准备极限压缩7zip系统内置右键压缩菜单极限压缩总结&#xff1a;Win11 的压缩软件的最佳配置和使用方式测试环境 机器配置 Win11系统 16GB内存 8核CPU 被压缩文件 文件夹内…