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

目录

一、CSRF Token

二、代码审计(High级别)

1、渗透准备

2、源码分析

三、渗透实战

1、渗透准备

2、修改URL重放失败

3、burpsuite尝试重放失败

4、安装CSRF Token Tracker

5、安装logger插件

6、配置CSRF Token Tracker

7、bp再次重放报文

8、查看CSRF Token Tracker效果


本系列为通过《DVWA靶场通关笔记》的CSRF关卡(low,medium,high,impossible共4关)渗透集合,通过对相应关卡源码的代码审计找到讲解渗透原理并进行渗透实践,本文为跨站请求伪造CSRF High关卡的渗透部分。

一、CSRF Token

CSRF(Cross-Site Request Forgery,跨站请求伪造)Token 是一种安全机制,用于防止恶意网站利用用户已认证的会话来执行未经授权的操作,核心原理如下所示。

  • 服务器为每个会话或表单生成唯一的随机令牌(Token)。

  • 令牌嵌入表单或HTTP请求头中。

  • 服务器在处理请求时验证令牌的有效性。

  • 令牌通常是一次性的或有时效性。

即使攻击者诱使用户访问恶意页面,由于无法获取有效Token,伪造的请求会被服务器拒绝。这种机制有效阻断了CSRF攻击链,是目前最可靠的CSRF防护方案之一。

二、代码审计(High级别)

1、渗透准备

配置security为中等High级别,如下图所示。

进入到CSRF关卡High页面,发现这是一个修改密码的页面,与Low关卡相似,没有确认旧密码的输入框,只有新密码和确认新密码的输入框,具体如下所示。

http://127.0.0.1/DVWA/vulnerabilities/csrf/

2、源码分析

进入DVWA靶场源目录,找到High.php源码,如下所示。

打开源码High.php,分析可知这段代码实现了一个不安全的密码修改功能:该代码实现了用户密码修改的功能。当检测到Change参数存在时,先验证防 CSRF 令牌的有效性。若令牌验证通过,获取用户输入的新密码和确认密码,检查两者是否匹配。若匹配,对新密码进行转义及哈希处理,构建 SQL 语句更新数据库中当前用户的密码,并向用户反馈密码修改成功;若不匹配,则反馈密码不一致的信息。最后关闭数据库连接,并生成新的防 CSRF 令牌。它通过以下步骤实现:

  1. 检查请求参数:通过 isset($_GET['Change']) 检查是否存在名为 Change 的 GET 参数,以确定是否处理密码更改请求。
  2. 验证 Anti-CSRF 令牌:调用 checkToken 函数,验证用户提交的 CSRF 令牌是否与会话中的令牌一致,防止 CSRF 攻击。
  3. 获取用户输入:从 $_GET 中获取用户输入的新密码和确认密码。
  4. 验证密码一致性:检查新密码和确认密码是否一致。
  5. 转义和加密密码:对新密码进行转义处理,防止 SQL 注入,然后使用 MD5 加密。
  6. 更新数据库:将加密后的密码更新到数据库中。
  7. 反馈用户:根据操作结果,给用户相应的提示信息。
  8. 生成新的 CSRF 令牌:调用 generateSessionToken 函数,生成新的 CSRF 令牌,用于后续的表单提交。

本关卡相对于low级别增加了token验证,相对于medium级别则是缺少refer字段校验但是增加了token验证。CSRF 令牌验证是指使用checkToken函数验证请求中的user_token与会话中的session_token是否匹配。这要求攻击者必须获取用户的有效令牌,而这在跨站请求中是无法实现的。本关卡也实现了令牌刷新机制,在每次请求后调用generateSessionToken()生成新的令牌,确保每个令牌只能使用一次,增强了安全性。详细注释后的代码如下所示。

<?php
if( isset( $_GET[ 'Change' ] ) ) {// 检查Change参数是否存在,确认用户提交了密码修改请求// 验证CSRF令牌:检查请求中的user_token与会话中的session_token是否匹配// 第三个参数是验证失败时的跳转页面checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );// 从GET参数获取新密码和确认密码$pass_new  = $_GET[ 'password_new' ];$pass_conf = $_GET[ 'password_conf' ];// 验证两次输入的密码是否一致if( $pass_new == $pass_conf ) {// 密码匹配,准备更新数据库// 使用mysqli_real_escape_string防止SQL注入// 注意:此函数仅对字符串中的特殊字符进行转义$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)) ? "" : ""));// 使用md5哈希密码(注意:md5已不安全,建议使用更安全的哈希算法如password_hash)$pass_new = md5( $pass_new );// 构建SQL查询更新用户密码// dvwaCurrentUser()函数获取当前用户名$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";// 执行SQL查询并处理可能的错误$result = mysqli_query($GLOBALS["___mysqli_ston"],  $insert ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );// 显示密码修改成功的消息$html .= "<pre>Password Changed.</pre>";}else {// 密码不匹配,显示错误消息$html .= "<pre>Passwords did not match.</pre>";}// 关闭数据库连接((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
// 生成新的CSRF令牌并存储在会话中
// 用于下次请求时验证
generateSessionToken();
?>

三、渗透实战

1、渗透准备

进入DVWA靶场的CSRF关卡High级别,将密码改为admin,如下所示。

bp开启拦截功能,点击change后,页面URL变为如下所示,包含刚刚修改的密码和确认密码值,还包含了一个新的参数token值,这与我们之前代码分析一致,本关卡还会验证token值。

http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=mooyuan&password_conf=mooyuan&Change=Change&user_token=a6257416ef53bed0a1d1ad062a1d0465#

同时页面信息也发生改变提示修改密码成功(Password changed),如下图红框所示。

bp拦截报文后,在http history中找到这个报文,计划右键将报文发送到repeater模块,具体的效果如下所示。

将报文发送到repeater模块,尝试是否可以进行CSRF攻击伪造,具体效果如下所示。

2、修改URL重放失败

修改URL参数的密码,将新密码和确认密码均修改为000000,完整的URL如下所示。

http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=000000&password_conf=000000&Change=Change&user_token=a6257416ef53bed0a1d1ad062a1d0465#

将URL输入到hackbar的地址栏中并点击执行后修改密码失败,提示“CSRF token is incorrect”,如下所示。

这是因为使用token验证后,此时token发生变化校验token失败导致。

3、burpsuite尝试重放失败

由于在地址栏直接修改失败,我们使用bp的CSRF token Tracer来尝试渗透。为了对比CSRF token Tracer的效果,首先展示没有使用CSRF token Tracer的情况下修改密码效果。

在第一步的bp repeater中修改密码,将GET参数中的新密码和确认密码均修改为000000,修改后GET部分内容如下所示。

GET /dvwa/vulnerabilities/csrf/?password_new=000000&password_conf=000000&Change=Change&user_token=a6257416ef53bed0a1d1ad062a1d0465 HTTP/1.1

如下所示,这次http返回的状态值为302,HTTP/1.1 302 Moved Temporarily。故而点击follow redirection如下图左上角的红框所示。

点击follow redirection后,重定向返回结果为CSRF token is incorrect,具体如下所示。

4、安装CSRF Token Tracker

在 Burp Suite 的 BApp Store 中直接安装 CSRF Token Tracker 插件,如下所示。

CSRF Token Tracker 是一款用于渗透测试的 Burp Suite 插件,主要用于自动获取和更新 CSRF Token,从而绕过网站的 CSRF 防护机制。CSRF Token 是一种常见的防御机制,通过在每个请求中添加一个唯一的令牌来验证请求的合法性。CSRF Token Tracker的主要功能如下所示。

  1. 自动获取 CSRF Token:插件能够自动从服务器响应中提取 CSRF Token,并将其添加到后续的请求中。
  2. 自动更新 Token:在多次请求中,Token 会自动更新,确保每次请求都使用最新的 Token。
  3. 绕过 CSRF 防护:通过自动处理 Token,该插件可以帮助测试人员绕过网站的 CSRF 防护,进行诸如暴力破解、数据包重放等测试。

5、安装logger插件

Logger++ 是 Burp Suite 中一款功能强大的日志记录和分析插件,提供了比 Burp 自带日志更强大的记录、过滤和搜索功能,可以记录所有经过 Burp 的 HTTP/HTTPS 流量,为查看repeater修改密码后的报文,安装logger插件,效果如下所示。

6、配置CSRF Token Tracker

当前访问host为127.0.0.1,token参数名为user_token,把包中的user_token值复制到CSRF Token Tracker中实现自动识别token值。特别注意 sync requests based on the following rules部分的勾要选上,如下所示。

7、bp再次重放报文

再次重放3.3部分的报文,为确保是csrf-token tracer自动获取到token值,配置完成后,第一次重放需要点击两次send,第二次即可修改成功。在Logger中找到这个报文,查看token如下所示。

8、查看CSRF Token Tracker效果

查看CSRF Token Tracker自动识别到的user_token值,之后每次提交的重放都会自动识别并填充token值来实现绕过的目的。如下所示,user_token 已经更改为最新的token值。

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

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

相关文章

Redis实战:数据安全与性能保障

数据安全 持久化策略 RDB持久化&#xff1a;通过创建快照将内存中的数据写入到磁盘上的RDB文件中。可以在配置文件中设置save参数来指定在多少秒内有多少次写操作时触发快照保存。例如&#xff0c;save 900 1表示900秒内至少有1次写操作时保存快照。 AOF持久化&#xff1a;将每…

人脸活体识别3:C/C++实现实时眨眼、张嘴、点头、摇头检测

> 当AI能识破照片与真人的区别,我们才真正跨入生物识别安全时代 --- ### 一、活体检测:数字世界的守门人 **传统人脸识别的致命缺陷**: - 高清照片欺骗成功率 > 85% - 视频回放攻击成本 < $50 - 3D面具破解率高达72% **我们的解决方案**: ```mermaid graph …

【Linux】AlmaLinux 无法使用root用户登录cockpit控制台问题解决

在虚拟机安装AlmaLinux 9.6&#xff0c;安装过程中需要允许使用root用户和SSH协议登录服务器。但是&#xff0c;在使用root用户登录cockpit管理后台时&#xff0c;系统提示“权限被拒绝”。 经过查询资料&#xff0c;可以通过下面的方法来解决此问题。 编辑 /etc/cockpit/disa…

【Java面试】讲讲HashMap的常用方法,以及底层实现?

1. 底层数据结构 数组链表红黑树&#xff08;JDK 1.8&#xff09;&#xff1a; 数组&#xff08;Node[] table&#xff09;存储桶&#xff08;bucket&#xff09;&#xff0c;每个桶是链表或红黑树的头节点。链表解决哈希冲突&#xff0c;当链表长度 ≥ 8 且数组容量 ≥ 64 时…

ToT:思维树:借助大语言模型进行审慎的问题求解

摘要 语言模型正日益被部署于广泛任务中的通用问题求解&#xff0c;但在推理阶段仍受限于 token 级、从左到右的决策过程。这意味着在需要探索、战略前瞻&#xff0c;或初始决策起关键作用的任务中&#xff0c;语言模型可能表现不佳。为克服这些挑战&#xff0c;我们提出了一种…

Web3 + RWA 餐饮数字化解决方案白皮书(试点版)

一、背景&#xff1a;从“用户”到“共创股东”&#xff0c;重构本地生活新逻辑 ✨ 項目愿景&#xff1a; “用一顿饭&#xff0c;链接一个社群&#xff1b;用一次消费&#xff0c;绑定一份权益”。 传统商业以“交易”为中心&#xff0c;未来商业则以“关系 价值流转”为核…

MCU的模拟输入ADC引脚如何实现采样时间与阻抗匹配

在MCU的模拟输入ADC引脚中&#xff0c;实现采样时间与阻抗匹配是关键的设计环节&#xff0c;直接影响采样精度。以下是分步说明&#xff1a; 【】理解信号源阻抗与采样时间的关系 • 信号源阻抗&#xff08;Rs&#xff09;&#xff1a;外部信号源的输出阻抗&#xff08;如传感器…

等价矩阵 线性代数

所谓等价矩阵&#xff0c;就是说其秩相同的矩阵。 例题 A和B等价就是求A和B的秩&#xff0c;其实就是要求B的秩了&#xff0c;因为目标已经告诉你了A和B的秩是一样的。那么怎么求B的秩呢&#xff1f;我们现在只有一种方法求其秩&#xff0c;就是通过把其经过初等变换之后符合标…

30.设计模式的优缺点

原文地址:设计模式的优缺点 更多内容请关注&#xff1a;智想天开 一、设计模式的优点 1. 提高代码复用性与可维护性 复用性&#xff1a; 设计模式提供的是抽象的解决方案&#xff0c;可以在多个项目中重复应用&#xff0c;避免重复造轮子。例如&#xff0c;工厂模式封装了对象…

Python 爬虫实战 | 国家医保

一、国家医保 1、目标网站 网址&#xff1a;https://fuwu.nhsa.gov.cn/nationalHallSt/#/search/drug-directory目标数据&#xff1a;获取药品信息 2、网站特点 服务端返回加密数据&#xff0c;客户端发送请求携带的载荷也是加密的 3、定位解密入口 可以通过关键字encDa…

OpenCV CUDA模块设备层----计算向量的平方根函数sqrt

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 OpenCV 的 CUDA 设备函数&#xff08;device function&#xff09;&#xff0c;用于在 GPU 上计算一个 uchar4 类型向量的平方根&#xff0c;并返…

鸿蒙应用开发:HTTP访问网络

一、HTTP概述 在许多场景下&#xff0c;我们的应用需要从服务端获取数据&#xff0c;例如&#xff0c;天气应用需要从天气服务器获取天气数据。新闻应用需要从新闻服务器获取最新的新闻咨询&#xff0c;通过HTTP数据请求&#xff0c;我们可以将互联网上的信息展示在应用中&…

【Elasticsearch】refresh与提交

在Elasticsearch中&#xff0c;Translog日志的提交确实涉及到与刷新&#xff08;Refresh&#xff09;时写入Lucene段的数据进行合并&#xff0c;并最终写入磁盘。以下是详细的步骤和解释&#xff1a; 一、Translog日志的提交过程 1. 刷新&#xff08;Refresh&#xff09;操作 …

服务器异常宕机或重启导致 RabbitMQ 启动失败问题分析与解决方案

服务器异常宕机或重启导致 RabbitMQ 启动失败问题分析与解决方案 一、深度故障诊断与解决方案1. 权限配置不当故障2. 端口占用故障3. 数据目录残留故障 二、故障类型对比与诊断矩阵三、完整恢复流程&#xff08;10步法&#xff09;四、风险规避与最佳实践&#x1f6e1;️ 数据保…

车载以太网都有什么协议?

目录 一、物理层协议(Physical Layer)二、数据链路层协议(Data Link Layer)三、网络层协议(Network Layer)四、传输层协议(Transport Layer)五、应用层协议(Application Layer)六、车载网络融合协议七、标准化组织八、协议分层总结表九、趋势与未来协议车载以太网涉及…

设计模式之外观模式:简化复杂系统的优雅之道

设计模式之外观模式&#xff1a;简化复杂系统的优雅之道 今天我们来深入探讨设计模式中的外观模式&#xff08;Facade Pattern&#xff09;。想象一下&#xff0c;你走进一家高档餐厅&#xff0c;只需要告诉服务员"我要一份A套餐"&#xff0c;而不需要关心厨房里厨师…

《Python 架构之美:三大设计模式实战指南》

《Python 架构之美:三大设计模式实战指南》 在软件世界中,设计模式是经验的结晶,它为开发者提供了解决重复问题的通用模板。尤其在 Python 这种灵活而强大的语言中,设计模式并非“死规矩”,而更像“编程哲学”,为我们解构复杂系统、提升代码可维护性提供了宝贵思路。 本…

力扣打卡第十八天 判定平衡二叉树

110. 平衡二叉树 给定一个二叉树&#xff0c;判断它是否是 平衡二叉树 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,3,3,null,null,4,4] 输出&#xff1a;false示例 3&#xf…

Python 物联网(IoT)与边缘计算开发实战(1)

Python 物联网(IoT)与边缘计算开发实战 https://www.python.org/static/community_logos/python-logo-master-v3-TM.png 物联网基础与硬件交互 Raspberry Pi GPIO控制 python import RPi.GPIO as GPIO import time # 设置GPIO模式 GPIO.setmode(GPIO.BCM) GPIO.setwarnings(F…

高通SG882G平台(移远):1、编译脚本

文档提供的编译&#xff0c;有点问题。所以我重新整理了脚本。 build-lib.sh #!/bin/bashfunction prepare_build() {if [ ! -d download ]; thenmkdir downloadfilocal MODIFIED_DIRfile-replacelocal FILE_NAMEset_bb_env.shcp ${MODIFIED_DIR}/${FILE_NAME} \poky/qti-con…