目录

一、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失败导致。

3burpsuite尝试重放失败

由于在地址栏直接修改失败,我们使用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部分的勾要选上,如下所示。

7bp再次重放报文

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

8、查看CSRF Token Tracker效果

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

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈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…