网络安全 DVWA通关指南 Cross Site Request Forgery (CSRF)

DVWA Cross Site Request Forgery (CSRF)

文章目录

  • DVWA Cross Site Request Forgery (CSRF)
    • DVWA Low 级别 CSRF
    • DVWA Medium 级别 CSRF
    • DVWA High 级别 CSRF
    • DVWA Impossible 级别 CSRF

CSRF是跨站请求伪造攻击,由客户端发起,是由于没有在执行关键操作时,进行是否由用户自愿发起的确认攻击者通过用户的浏览器来注入额外的网络请求,来破坏一个网站会话的完整性。

比如某网站用户信息修改功能,没有验证Referer也没添加Token,攻击者可以用HTML构造恶意代码提交POST请求,诱骗已经登陆的受害者点击,可以直接修改用户信息

修复建议

  • 验证Referer
  • 添加token

DVWA Low 级别 CSRF

0、分析网页源代码(路径:“D:\phpstudy_pro\DVWA-master\vulnerabilities\csrf\source\low.php”)

<?php

if(isset($_GET['Change'])) { // 检查是否有请求更改密码的动作
    // 获取用户输入的新密码和确认密码
    $pass_new  = $_GET['password_new'];
    $pass_conf = $_GET['password_conf'];

    // 检查两次输入的密码是否匹配
    if ($pass_new == $pass_conf) { 
        // 密码匹配
        // 防止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加密在此处已经过时,不建议用于存储密码)
        $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);
}

?>

1、选择DVWA的CSRF,修改密码为111,提交后观察到网站链接发生变化

http://dvwa/vulnerabilities/csrf/?password_new=111&password_conf=111&Change=Change#

观察链接,认为使用get方式提交修改密码参数,只要三个参数符合就可以执行密码修改的操作

image-20240415193519864

2、打开一个新标签页,在地址栏输入http://dvwa/vulnerabilities/csrf/?password_new=111&password_conf=111&Change=Change#,回车后,进入DVWA中并提示Password Changed,修改密码成功。

image-20240415194631245

image-20240415194532633

3、可以通过将长连接转换为短链接的方法,诱使用户点击链接,通过在线工具转换

image-20240415194928196

DVWA Medium 级别 CSRF

0、分析网页源代码(路径:“D:\phpstudy_pro\DVWA-master\vulnerabilities\csrf\source\medium.php”)

<?php

if( isset( $_GET[ 'Change' ] ) ) {
	// Checks to see where the request came from
    //检查$_SERVER['HTTP_REFERER'],看看请求是否来自包含当前服务器名称$_SERVER['SERVER_NAME']的地址。stripos函数用于查找HTTP_REFERER是否包含服务器名
	if( stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false ) {
		// Get input
		$pass_new  = $_GET[ 'password_new' ];
		$pass_conf = $_GET[ 'password_conf' ];

		// Do the passwords match?
		if( $pass_new == $pass_conf ) {
			// They do!
			$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 );

			// Update the database
			$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
			$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>' );

			// Feedback for the user
			$html .= "<pre>Password Changed.</pre>";
		}
		else {
			// Issue with passwords matching
			$html .= "<pre>Passwords did not match.</pre>";
		}
	}
	else {
		// Didn't come from a trusted source
		$html .= "<pre>That request didn't look correct.</pre>";
	}

	((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}

?>

1、尝试修改密码为222,修改成功,得到链接

http://dvwa/vulnerabilities/csrf/?password_new=222&password_conf=222&Change=Change#

2、打开新的标签页,使用上面的地址,出现错误提示,密码修改错误

image-20240417080206278

3、打开计算机代理,修改电脑代理服务器IP设置为127.0.0.1,端口设置为8888,BurpSuite调整代理参数与电脑代理一致

image-20240412094734133

image-20240412095237028

image-20240412094536046

4、正常修改密码的网页,使用BurpSuitePro捕获流量包,发现多出Referer属性信息

image-20240418165344132

5、而直接粘贴链接修改密码失败的报文缺少Referer属性信息,右键选择Send to Repeater

image-20240418170054026

image-20240418170418876

5、打开Repeater选项卡,给Request请求中添加Referer信息,Referer需要包括"dvwa"字段(需要符合同源策略),点击Send发送,修改密码成功

image-20240418172052977

image-20240418172120333

DVWA High 级别 CSRF

0、分析网页源代码(路径:“D:\phpstudy_pro\DVWA-master\vulnerabilities\csrf\source\high.php”)

<?php

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

	// Get input
	$pass_new  = $_GET[ 'password_new' ];
	$pass_conf = $_GET[ 'password_conf' ];

	// Do the passwords match?
	if( $pass_new == $pass_conf ) {
		// They do!
		$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 );

		// Update the database
		$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
		$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>' );

		// Feedback for the user
		$html .= "<pre>Password Changed.</pre>";
	}
	else {
		// Issue with passwords matching
		$html .= "<pre>Passwords did not match.</pre>";
	}

	((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}

// Generate Anti-CSRF token
generateSessionToken();

?>

1、正常修改密码并成功,使用BurpSuitePro捕获流量包,发现仍使用get提交方式,但多了验证参数token

image-20240418174557916

2、直接将链接复制粘贴修改密码肯定失败,提示token不正确

image-20240418180900000

有两种方法可以获得token值

方法一:利用DVWA中储存型XSS漏洞获得网页token

1、修改储存型XSS的网页脚本"D:\phpstudy_pro\DVWA-master\vulnerabilities\xss_s\index.php",加入下面两行代码(修改文件之前做好备份)

<div>Name:test<br/>Message:this is a test comment.<br/></div>
<div>Name:<iframe src='../csrf' οnlοad=alert(frames[0].document.getElementsByName('user_token')[0].value)><br/>Message:1<br/></div>

屏幕截图 2024-04-18 190045

2、保存文件,打开DVWA High级别下的储存型XSS页面,得到token值

image-20240418190907301

3、将得到的token替换,BurpSuitePro捕获流量包中原有的token

image-20240418190836711

4、发送构造好的数据包,得到响应,密码修改成功

image-20240418191317461

方法二:在BurpSuite安装插件,获取token

1、安装CSRF Token Tracker插件

image-20240418184201655

2、添加一条CSRF Token Tracker规则并勾选,再勾选"根据规则同步requests"

image-20240615214659621

3、截获修改密码请求包

屏幕截图 2024-06-15 215508

4、将抓到的包Send to Repeater,在Repeater页面修改"password_new"和"password_conf"参数,Send后发现token值发生变化,修改密码成功

image-20240615215423256

DVWA Impossible 级别 CSRF

0、分析网页源代码

<?php

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

	// Get input
	$pass_curr = $_GET[ 'password_current' ];
	$pass_new  = $_GET[ 'password_new' ];
	$pass_conf = $_GET[ 'password_conf' ];

	// Sanitise current password input
	$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 );

	// Check that the current password is correct
	$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();

	// Do both new passwords match and does the current password match the user?
	if( ( $pass_new == $pass_conf ) && ( $data->rowCount() == 1 ) ) {
		// It does!
		$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 );

		// Update database with new password
		$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();

		// Feedback for the user
		$html .= "<pre>Password Changed.</pre>";
	}
	else {
		// Issue with passwords matching
		$html .= "<pre>Passwords did not match or current password incorrect.</pre>";
	}
}

// Generate Anti-CSRF token
generateSessionToken();

?>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据分析】重仓白酒的资金,流向哪里?

内容提要 更多重仓白酒的资金向红利&#xff08;主要是银行少量的石油石化&#xff09;调仓&#xff0c;有较少部分向通信和电子调仓&#xff08;尤其是消费电子&#xff09;&#xff0c;对出海的调仓目前看并不清晰。 文章正文 近期白酒板块跌幅较大&#xff0c;催化因素在…

轨迹跟踪PID相关及前馈引入结果对比

1、前言&#xff1a; 记录下给定一段轨迹如何实现跟踪控制&#xff0c;主要使用几个经典的方法进行对比。一些讨论的部分在代码中的注释部分。 前馈控制可以在没有扰动和建模误差的理想条件下很好地跟踪期望输出&#xff0c;但在实际系统中&#xff0c;由于存在建模误差、外部扰…

网络安全入门必选:十款免费的抓包工具有哪些?

下面给大家推荐几款好用的免费的抓包工具软件&#xff0c;有需要的小伙伴们来了解一下。 1. Wireshark抓包分析工具 4.0.1 Wireshark是一款功能强大的网络协议分析器&#xff0c;可以实时检测和抓取网络通讯数据。它支持多种协议和媒体类型&#xff0c;并具备丰富的显示过滤…

汇凯金业:如何正确做黄金趋势单

炒黄金过程中&#xff0c;如何准确把握趋势并顺势而为&#xff0c;是大多数投资者面临的普遍问题。专家们经常强调顺势而为的重要性&#xff0c;但具体应如何操作&#xff0c;许多投资者仍然存在疑惑。本文将从五个关键策略入手&#xff0c;为您详细解析黄金趋势单的操作方法&a…

基于Python学生成绩管理系统详细设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;…

Flutter 小技巧之为什么推荐 Widget 使用 const

今天收到这个问题&#xff0c;本来想着简单回复下&#xff0c;但是感觉这个话题又可以稍微展开讲讲&#xff0c;干脆就整理成一篇简单的科普&#xff0c;这样也能更方便清晰地回答这个问题。 聊这个问题之前&#xff0c;我们需要把一个“老生常谈”的概念拿出来说&#xff0c;那…

安宝特方案 | AR眼镜+手套式扫码枪,智能化仓储创新应用

新扫码设备形态&#xff0c;提升工作效率 传统的仓储工作通常依赖人工操作和纸质记录&#xff0c;这不仅耗时又容易出错。 引入穿戴式AR设备和手套式扫码枪后&#xff0c;AR眼镜可以将数字信息直接叠加在视野中&#xff0c;仓储工人只需佩戴设备即可看到货物位置、库存数量和任…

3. 向索引库中导入数据

1. 准备数据库对象 import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstr…

高校外卖点餐系统

摘 要 随着互联网的快速发展&#xff0c;外卖点餐已经成为人们生活中的一部分。为了满足高校学生的需求&#xff0c;本文设计和实现了一个基于Java Web的高校外卖点餐系统。该系统采用B/S架构&#xff0c;使用Java语言和SSM框架进行开发&#xff0c;前端使用Vue框架进行设计。…

idea中使用springboot进行开发时遇到的工程结构问题汇总

idea中的工程结构和eclipse中不同&#xff0c;但是配置的内容都是一样的。 IDEA中也就是这个页面&#xff0c;快捷键ctrlaltshifts 如果在eclipse中&#xff0c;经常会遇到jre和jdk不正确的情况&#xff0c;但IDEA中这个问题很少&#xff0c;但是IDEA中会经常由于未正常配置根…

基于SpringBoot音乐网站与分享平台详细设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; Java精品实战案例《600套》 2023-2025年最值得选择的Java毕业设计选题大全&#xff1…

浅谈逻辑控制器之仅一次控制器

浅谈逻辑控制器之仅一次控制器 “仅一次控制器”(Once Only Controller) 是一个非常实用的组件&#xff0c;它允许用户控制测试计划中的某些操作仅执行一次&#xff0c;无论其所在的线程组或父级控制器设置了多少次循环。本指南将详细介绍“仅一次控制器”的功能、使用场景及配…

RSA非对称加密-openssl命令及C语言实现

RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。本文介绍如何使用openssl命令和C代码实现基础的RSA加/解密和签名/验签功能。 一、openssl命令实现RSA加解密 1、生成私钥和公钥 生成私钥 openssl genrsa -out private.key 2048 #…

『Z-Workshop』 6月22日线下ALCOVE分享活动

2024 求是创新 ZJUBCA Sponsored by the ALCOVE Community TIME&#xff1a;2024/06/22 ADD&#xff1a;浙江大学紫金港校区 --- Alcove 是 Aptos 公链与 Alibaba Cloud 共同打造的亚洲首个 Move 开发者社区&#xff0c;致力于支持开发者使用 Move 语言构建下一代 Web3 应用&am…

UE4_材质_水涟漪、水深制作_Ben教程

学习笔记&#xff0c;不喜勿喷&#xff01;侵权立删&#xff0c;祝愿生活越来越好&#xff01; 效果图如下&#xff1a; 创建水材质的教程&#xff0c;首先需要外出收集一些参考&#xff0c;看一看你将要做的事情很重要&#xff0c;确定将要模仿物体的关键属性&#xff0c;从这…

Java网络编程(JavaWeb的基础)

Java网络编程&#xff08;JavaWeb的基础&#xff09; 文章目录 Java网络编程&#xff08;JavaWeb的基础&#xff09;前言一、网络编程概述1.1 软件架构&网络基础1.2 网络通信要素:IP/端口/通信协议1.3 传输层协议:tcp/udp 二、网络编程API2.1 InetAddress类2.2 Socket类&am…

第三届人工智能、物联网与云计算技术国际会议(AIoTC 2024)

第三届人工智能、物联网与云计算技术国际会议(AIoTC 2024)将于2024年9月13日-15日在中国武汉举行。本次会议由华中师范大学伍伦贡联合研究院与南京大学联合主办、江苏省大数据区块链与智能信息专委会承办、江苏省概率统计学会、江苏省应用统计学会、Sir Forum、南京理工大学、南…

如何找到正确的网络钓鱼目标

在深入研究联系人收集之前&#xff0c;我们希望确保对可用的攻击面有一个清晰的了解。我见过许多渗透测试者只获取客户端提供的主域&#xff0c;通过 theHarvester、linkedInt、maltego 等运行它&#xff0c;并将输出称为目标列表。在这样做的过程中&#xff0c;这些渗透测试机…

云效BizDevOps上手亲测

云效BizDevOps上手亲测 什么是云效项目协作Projex配置2023业务空间原始诉求字段原始诉求工作流创建原始诉求配置2023产品空间创建主题业务原始诉求关联主题配置2023研发空间新建需求需求关联主题 与传统区别云效开发流程传统开发流程云效BizDevOps 操作体验 什么是云效 在说到…

203. 移除链表元素【链表】【C++】

题目描述 题目描述 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5] 示例 2&#x…