news 2026/7/5 1:43:56

DVWA靶场——CSRF (跨站脚本伪造)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DVWA靶场——CSRF (跨站脚本伪造)

CSRF(跨站请求伪造),全称为Cross-site request forgery,简单来说,是攻击者利用受害者尚未失效的身份认证信息,诱骗受害者点击恶意链接或含有攻击代码的页面,在受害者不知情的情况下以受害者的身份像服务器发起请求,从而实现非法攻击(改密)。

low:

我们跟着指引输入我们需要更改的密码,再确定密码,可以看到直接更改成功了,并且最重要的发现是我们改的密码的明文竟然直接显示在URL中!

用更改的密码试试能不能登录第一关,成功了,我原本的密码(就是你用来登录DVWA的密码):password就用不了了。

说明这关确实没有任何验证就轻易更改了密码

经过上面的尝试发现可以成功修改密码,而且我们发现了URL那里的变化,接下来我们从URL处入手再改一下,首先先重置一下数据库,把密码改回来。

我们改成同样的元素按回车也能够更改成功。

源码分析
<?php if( isset( $_GET[ 'Change' ] ) ) { // 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 echo "<pre>Password Changed.</pre>"; } else { // Issue with passwords matching echo "<pre>Passwords did not match.</pre>"; } ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res); } ?>

我们可以看到这里通过GET方式获取两次密码,两次密码输入一致的话,就可以直接带入数据中修改密码。

Medium

我们首先抓个包,拦截正常请求 → 把密码参数改成自己的 → 保持Referer不变 → 放行。借用了合法的Referer,骗过服务器

这里可以看到虽然URL中显示的是123456,但我们发送放行的数据包是password。

这里还有第二种绕过方式需结合其他漏洞。通过文件上传漏洞植入恶意HTML → 访问该页面 → 自动提交CSRF请求。Referer自动变成127.0.0.1/xxx,包含服务器域名,检查通过。

这里就不做演示了

源码分析
<?php if( isset( $_GET[ 'Change' ] ) ) { // Checks to see where the request came from //stripos(str1, str2)检查str2在str1中出现的位置(不区分大小写),如果有返//回True,反之False //判断Host字段是否出现在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 echo "<pre>Password Changed.</pre>"; } else { // Issue with passwords matching echo "<pre>Passwords did not match.</pre>"; } } else { // Didn't come from a trusted source echo "<pre>That request didn't look correct.</pre>"; } ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res); } ?>

Medium级别的代码检查了保留变量 HTTP_REFERER(http包头的Referer参数的值,表示来源地址)中是否包含SERVER_NAME(http包头的Host参数,及要访问的主机名,这里是127.0.0.3),希望通过这种机制抵御CSRF攻击。

High


这个数据包中多了个我们熟悉的字样——token(此处是令牌的意思,并非ai领域的词元)

用token机制来防御CSRF。用户每次访问改密页面时,服务器都会返回一个随机的token,当浏览器向服务器发起请求时,需要提交token参数,而服务器在收到请求时,会优先检查token,只有token正确,才会处理客户端的请求。这里因为对请求的token进行了验证,所以比上两个等级的更加的安全。

所以主要就在于如何获取到这个一次有效期的token

第一个方法就是改包不动token的值直接放行,和medium差不多

第二就是利用XSS 注入代码,让受害者的浏览器自己帮攻击者获取 Token 并发起请求!

第三就是跟暴力破解中用 Burp 的Macro(宏)功能自动提取 Token

源码分析
<?php if( isset( $_GET[ 'Change' ] ) ) { // Check Anti-CSRF token //可以看到加入了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 echo "<pre>Password Changed.</pre>"; } else { // Issue with passwords matching echo "<pre>Passwords did not match.</pre>"; } ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res); } // Generate Anti-CSRF token generateSessionToken(); ?>

Impossible

<?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 echo "<pre>Password Changed.</pre>"; } else { // Issue with passwords matching echo "<pre>Passwords did not match or current password incorrect.</pre>"; } } // Generate Anti-CSRF token generateSessionToken(); ?>

要求我们先输入密码再修改,攻击者不知道原始密码的情况下是无法发起 CSRF 攻击的。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/5 1:42:33

第31篇 数据结构入门:顺序表

数据结构入门&#xff1a;顺序表与链表的深度解析 在编程的世界里&#xff0c;如何高效地存储和管理数据是核心问题。线性表&#xff08;Linear List&#xff09;作为最基础、最常用的数据结构&#xff0c;是我们必须掌握的第一课。 线性表在逻辑上是一条连续的直线&#xff…

作者头像 李华
网站建设 2026/7/5 1:36:19

Flexbox对齐搞错,布局全崩!

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 Flexbox对齐搞错&#xff0c;布局全崩&#xff01;手把手教你避坑 目录兄弟们&#xff0c;昨晚写个导航栏&#xff0c;Flexbox对…

作者头像 李华
网站建设 2026/7/5 1:36:04

天伟生物专利涉及圈养匹配与选址,养猪户了解技术方案要点

专利核心&#xff1a;从单一营养到系统生态平衡在探讨天伟生物的平衡养猪法专利包含哪些具体内容时&#xff0c;首先需要明确其技术底座。该项国家发明专利&#xff08;专利号&#xff1a;CN104067984A&#xff09;并非单纯的饲料配方调整&#xff0c;而是一套涵盖养殖全链条的…

作者头像 李华
网站建设 2026/7/5 1:23:29

2026年联发科嵌入式岗位高频面试题带参考答案

大厂面试做到心里有数 本套题针对联发科嵌入式开发岗(覆盖芯片适配、驱动开发、系统移植、外设控制、物联网终端等方向)整理,遵循硬件模块前置、核心能力优先的考察逻辑,兼顾基础理论与项目实战,适配校招与社招面试备考。 总计:**46道** 分模块数量明细: 一、核心项目…

作者头像 李华