DVWA靶场CSRF漏洞通关教程及源码审计

news2025/1/14 23:16:59

目录标题

  • CSRF
    • low
      • 源码审计
    • medium
      • 源码审计
    • high
      • 源码审计
    • impossible
      • 源码审计

CSRF

low

先修改密码

看到地址栏

复制在另一个网页打开

成功登录

源码审计

没有任何过滤措施,很危险,并且采用了不安全的md5加密

<?php

if( isset( $_GET[ 'Change' ] ) ) { // 检查是否通过GET请求提交了"Change"参数
	// 获取输入
	$pass_new  = $_GET[ 'password_new' ]; // 获取新密码
	$pass_conf = $_GET[ 'password_conf' ]; // 获取确认密码

	// 检查密码是否一致
	if( $pass_new == $pass_conf ) { // 如果新密码和确认密码匹配
		// 匹配成功
		$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 ); // 对密码进行MD5加密

		// 更新数据库
		$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>' ); // 执行SQL查询,如果出错则显示错误信息

		// 用户反馈
		$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); // 关闭数据库连接
}
?>

medium

打开burp缺少referer头

补上重新发送

源码审计

第4行设置了请求来源防止跨站伪造请求

<?php
if( isset( $_GET[ 'Change' ] ) ) { // 检查是否通过GET请求提交了"Change"参数
	// 检查请求来源
	if( stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false ) { // 如果请求来源是当前服务器
		// 获取输入
		$pass_new  = $_GET[ 'password_new' ]; // 获取新密码
		$pass_conf = $_GET[ 'password_conf' ]; // 获取确认密码

		// 检查密码是否一致
		if( $pass_new == $pass_conf ) { // 如果新密码和确认密码匹配
			// 匹配成功
			$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 ); // 对密码进行MD5加密

			// 更新数据库
			$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>' ); // 执行SQL查询,如果出错则显示错误信息

			// 用户反馈
			$html .= "<pre>Password Changed.</pre>"; // 提示用户密码已更改
		}
		else { // 如果密码不匹配
			// 密码匹配出错
			$html .= "<pre>Passwords did not match.</pre>"; // 提示用户密码不一致
		}
	}
	else { // 如果请求不是来自受信任的来源
		// 处理不正确的请求
		$html .= "<pre>That request didn't look correct.</pre>"; // 提示请求看起来不正确
	}
	((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res); // 关闭数据库连接
}
?>

high

这一关多了token,只要保证与浏览器的token对上即可

源码审计

通过POST请求传送JSON格式的数据,也支持传统的表单提交。代码首先检查请求是否合法,并提取用户令牌、新密码和确认密码。然后验证密码是否匹配,如果匹配,则对新密码进行安全处理(转义和加密),并更新数据库中的数据

<?php
$change = false; // 初始化一个变量用于标记是否发生了更改
$request_type = "html"; // 默认请求类型为HTML
$return_message = "Request Failed"; // 默认返回信息为请求失败
// 检查请求方法是否为POST并且内容类型为JSON
if ($_SERVER['REQUEST_METHOD'] == "POST" && array_key_exists ("CONTENT_TYPE", $_SERVER) && $_SERVER['CONTENT_TYPE'] == "application/json") {
	$data = json_decode(file_get_contents('php://input'), true); // 解析JSON格式的输入数据
	$request_type = "json"; // 将请求类型设置为JSON
	// 检查请求中是否包含用户令牌、新密码、确认密码和更改请求
	if (array_key_exists("HTTP_USER_TOKEN", $_SERVER) &&
		array_key_exists("password_new", $data) &&
		array_key_exists("password_conf", $data) &&
		array_key_exists("Change", $data)) {
		$token = $_SERVER['HTTP_USER_TOKEN']; // 获取用户令牌
		$pass_new = $data["password_new"]; // 获取新密码
		$pass_conf = $data["password_conf"]; // 获取确认密码
		$change = true; // 标记为发生更改
	}
} else {
	// 如果请求不是JSON格式,检查是否通过表单提交
	if (array_key_exists("user_token", $_REQUEST) &&
		array_key_exists("password_new", $_REQUEST) &&
		array_key_exists("password_conf", $_REQUEST) &&
		array_key_exists("Change", $_REQUEST)) {
		$token = $_REQUEST["user_token"]; // 获取用户令牌
		$pass_new = $_REQUEST["password_new"]; // 获取新密码
		$pass_conf = $_REQUEST["password_conf"]; // 获取确认密码
		$change = true; // 标记为发生更改
	}
}
// 如果发生了更改
if ($change) {
	// 检查反CSRF令牌
	checkToken($token, $_SESSION['session_token'], 'index.php');

	// 检查密码是否匹配
	if ($pass_new == $pass_conf) { // 如果新密码和确认密码匹配
		// 匹配成功
		$pass_new = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new); // 对新密码进行转义处理
		$pass_new = md5($pass_new); // 对密码进行MD5加密

		// 更新数据库
		$insert = "UPDATE `users` SET password = '" . $pass_new . "' WHERE user = '" . dvwaCurrentUser() . "';"; // 创建更新密码的SQL语句
		$result = mysqli_query($GLOBALS["___mysqli_ston"], $insert); // 执行SQL查询

		// 用户反馈
		$return_message = "Password Changed."; // 提示用户密码已更改
	} else {
		// 密码不匹配
		$return_message = "Passwords did not match."; // 提示用户密码不一致
	}

	mysqli_close($GLOBALS["___mysqli_ston"]); // 关闭数据库连接
	// 根据请求类型返回不同格式的反馈
	if ($request_type == "json") {
		generateSessionToken(); // 生成新的反CSRF令牌
		header("Content-Type: application/json"); // 设置响应内容类型为JSON
		print json_encode(array("Message" => $return_message)); // 返回JSON格式的消息
		exit; // 退出脚本执行
	} else {
		$html .= "<pre>" . $return_message . "</pre>"; // 将消息添加到HTML输出中
	}
}
// 生成反CSRF令牌
generateSessionToken();
?>

impossible

源码审计

设置了多种验证,是很安全的方式

<?php
if( isset( $_GET[ 'Change' ] ) ) { // 检查是否存在 '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' ]; // 确认密码
	// 清理当前密码输入
	$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 ); // 对当前密码进行MD5加密
	// 检查当前密码是否正确
	$data = $db->prepare( 'SELECT password FROM users WHERE user = (:user) AND password = (:password) LIMIT 1;' ); // 准备SQL查询
	$data->bindParam( ':user', dvwaCurrentUser(), PDO::PARAM_STR ); // 绑定用户名参数
	$data->bindParam( ':password', $pass_curr, PDO::PARAM_STR ); // 绑定当前密码参数
	$data->execute(); // 执行查询

	// 检查新密码和确认密码是否匹配,以及当前密码是否正确
	if( ( $pass_new == $pass_conf ) && ( $data->rowCount() == 1 ) ) {
		// 一切正常!
		$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 ); // 对新密码进行MD5加密

		// 更新数据库中的新密码
		$data = $db->prepare( 'UPDATE users SET password = (:password) WHERE user = (:user);' ); // 准备更新SQL语句
		$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();
?>

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

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

相关文章

JVM之垃圾回收器G1概述的详细解析

G1(并发) G1 特点 G1&#xff08;Garbage-First&#xff09;是一款面向服务端应用的垃圾收集器&#xff0c;应用于新生代和老年代、采用标记-整理算法、软实时、低延迟、可设定目标&#xff08;最大 STW 停顿时间&#xff09;的垃圾回收器&#xff0c;用于代替 CMS&#xff0…

宝塔面板 申请证书后 仍然提示不安全

证书显示有效&#xff0c;但是网站显示不安全 导致的原因是引入静态文件使用的是HTTP&#xff0c;查看方法为F12打开console控制台 可以看到静态文件全部都是HTTP 网站采用wordpress搭建&#xff0c;基于问题解决&#xff0c;其他方式搭建也是一样&#xff0c;处理掉所有的H…

【1】Word:邀请函

目录 题目 文字解析 流程 题目 文字解析 考生文件夹☞Word.docx☞一定要用ms打开&#xff0c;wps打开作答无效☞作答完毕&#xff0c;F12或者手动另存为&#xff08;考生文件夹&#xff1a;路径文件名&#xff09; 注意&#xff1a;一定要检查&#xff0c;很有可能你前面步…

Docker安装和卸载(centos)

Docker安装和卸载 一&#xff0c;已安装Docker&#xff0c;卸载Docker 1.方法一 sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine​ 如果出现以下提示就证明没卸载…

JVM:ZGC详解(染色指针,内存管理,算法流程,分代ZGC)

1&#xff0c;ZGC&#xff08;JDK21之前&#xff09; ZGC 的核心是一个并发垃圾收集器&#xff0c;所有繁重的工作都在Java 线程继续执行的同时完成。这极大地降低了垃圾收集对应用程序响应时间的影响。 ZGC为了支持太字节&#xff08;TB&#xff09;级内存&#xff0c;设计了基…

ASP.NET Core - 日志记录系统(二)

ASP.NET Core - 日志记录系统&#xff08;二&#xff09; 2.4 日志提供程序2.4.1 内置日志提供程序2.4.2 源码解析 本篇接着上一篇 ASP.NET Core - 日志记录系统(一) 往下讲&#xff0c;所以目录不是从 1 开始的。 2.4 日志提供程序 2.4.1 内置日志提供程序 ASP.NET Core 包括…

无源器件-电容

电容器件的参数 基本概念由中学大学物理或电路分析内容获得&#xff0c;此处不做过多分析。 电容的产量占全球电子元器件产品的40%以上。 单位&#xff1a;法拉 F&#xff1b;1F10^6uF&#xff1b;电路中常见的104电容就是10*10^4pF100nF0.1uF C为电容&#xff0c;Rp为绝缘电…

云平台一键部署【Video-Background-Removal】视频换背景,无任何限制,随意换

Video-Background-Removal 是一款革命性的视频背景替换工具&#xff0c;旨在让用户轻松实现视频背景的快速更换。无论你是专业创作者还是普通用户&#xff0c;这款软件都能让你在几秒钟内改变背景&#xff0c;完全消除限制&#xff0c;随心所欲&#xff0c;随时随地想换就换&am…

HCIP笔记1--IP路由基础回顾、BFD单臂回声、OSPF基础

1. 路由基础回顾 概念 AS(Aotonomous System): 自治系统&#xff0c;由同一机构管理的路由器集合。LAN(Local Area Network): 局域网&#xff0c;用户所使用的网络WAN(Wideless Area Network): 广域网&#xff0c;运营商网络广播域&#xff1a;一个广播帧能在网络中到达的所有…

【Linux网络编程】数据链路层 | MAC帧 | ARP协议

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站 &#x1f308;个人主页&#xff1a; 南桥几晴秋 &#x1f308;C专栏&#xff1a; 南桥谈C &#x1f308;C语言专栏&#xff1a; C语言学习系…

微软与腾讯技术交锋,TRELLIS引领3D生成领域多格式支持新方向

去年 11 月&#xff0c;腾讯推出 Hunyuan3D 生成模型&#xff0c;是业界首个同时支持文字和图像生成 3D 的开源大模型。紧接着不到一个月&#xff0c;微软便发布了全新框架 TRELLIS&#xff0c;加入 3D 资产生成领域的竞争中。TRELLIS 支持多格式输出&#xff0c;包括辐射场、3…

【爬虫】单个网站链接爬取文献数据:标题、摘要、作者等信息

源码链接&#xff1a; https://github.com/Niceeggplant/Single—Site-Crawler.git 一、项目概述 从指定网页中提取文章关键信息的工具。通过输入文章的 URL&#xff0c;程序将自动抓取网页内容 二、技术选型与原理 requests 库&#xff1a;这是 Python 中用于发送 HTTP 请求…

设计模式-结构型-组合模式

1. 什么是组合模式&#xff1f; 组合模式&#xff08;Composite Pattern&#xff09; 是一种结构型设计模式&#xff0c;它允许将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得客户端对单个对象和组合对象的使用具有一致性。换句话说&#xff0c;组合模式允…

js:正则表达式

目录 正则表达式的语法 定义 检测 检索 元字符 边界符 量词 字符类 表单判断案例 修饰符 过滤敏感词 正则表达式是一种用于匹配和操作文本的强大工具&#xff0c;它是由一系列字符和特殊字符组成的模式&#xff0c;用于描述要匹配的文本字符组合模式 正则表达式是一…

PHP数据过滤函数详解:filter_var、filter_input、filter_has_var等函数的数据过滤技巧

PHP数据过滤函数详解&#xff1a;filter_var、filter_input、filter_has_var等函数的数据过滤技巧&#xff0c;需要具体代码示例 在 Web 开发中&#xff0c;数据过滤是非常重要的一环。过滤用户输入的数据可以保护我们的应用程序免受潜在的安全威胁。PHP 提供了一系列强大的数…

QT跨平台应用程序开发框架(1)—— 环境搭建

目录 一&#xff0c;关于QT 二&#xff0c;关于应用程序框架 三&#xff0c;环境搭建 3.1 预备 3.2 下载Qt SDK 3.3 安装Qt SDK 3.4 配置环境变量 3.5 认识一些重要工具 四&#xff0c;Qt Creator 的基本使用 4.1 创建项目 4.2 代码解释 一&#xff0c;关于QT 互联网…

【MySQL】基础架构分析

考察频率难度40%⭐⭐⭐⭐ 这道题在面试时的出现频率其实并不高&#xff0c;最起码对于笔者来说是没有遇到过。那为什么还是选择把这个问题作为 MySQL 八股文系列的第一个呢&#xff1f;其实原因也挺简单的&#xff0c;还是老规矩&#xff0c;先通过一个问题把整个知识框架来一…

【华为云开发者学堂】基于华为云 CodeArts CCE 开发微服务电商平台

实验目的 通过完成本实验&#xff0c;在 CodeArts 平台完成基于微服务的应用开发&#xff0c;构建和部署。 ● 理解微服务应用架构和微服务模块组件 ● 掌握 CCE 平台创建基于公共镜像的应用的操作 ● 掌握 CodeArts 平台编译构建微服务应用的操作 ● 掌握 CodeArts 平台部署微…

Elasticsearch ES|QL 地理空间索引加入纽约犯罪地图

可以根据地理空间数据连接两个索引。在本教程中&#xff0c;我将向你展示如何通过混合邻里多边形和 GPS 犯罪事件坐标来创建纽约市的犯罪地图。 安装 如果你还没有安装好自己的 Elasticsearch 及 Kibana 的话&#xff0c;请参考如下的链接来进行安装。 如何在 Linux&#xff0…

P10打卡——pytorch实现车牌识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 1.检查GPU from torchvision.transforms import transforms from torch.utils.data import DataLoader from torchvision import datasets import torchvisio…