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

发布于:2025-06-30 ⋅ 阅读:(16) ⋅ 点赞:(0)

目录

一、CSRF

二、源码分析

1、渗透准备

2、源码分析

四、渗透实战

1、渗透准备

2、构造恶意链接

3、诱导受害者点击


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

一、CSRF

CSRF(Cross - Site Request Forgery,跨站请求伪造)指攻击者通过诱导用户在已登录目标网站的情况下访问恶意网站,从而利用用户在目标网站的身份和权限执行非用户本意的操作,如转账、修改密码、发布信息等。CSRF的攻击流程如下所示。

  • 用户登录目标网站:用户在浏览器中登录目标网站,网站通过设置 Cookie 等方式对用户进行身份认证和授权,用户处于已登录状态。
  • 攻击者构造恶意链接或页面:攻击者创建一个包含恶意请求的链接或网页,当用户访问该链接或网页时,浏览器会自动向目标网站发送请求。
  • 浏览器自动携带用户身份信息:由于用户已登录目标网站,浏览器会在发送请求时自动携带用户的 Cookie 等身份验证信息,目标网站无法区分该请求是用户的正常操作还是攻击者的恶意请求,从而执行攻击者指定的操作。

二、源码分析

1、渗透准备

配置security为低等low级别。

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

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

2、源码分析

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

打开源码low.php,分析可知这段代码实现了一个不安全的密码修改功能:用户通过GET请求提交新密码(password_new)和确认密码(password_conf),后台服务首先检查新密码(password_new)和确认新密码(password_conf)是否匹配,如果匹配,则对新密码进行转义和MD5哈希处理,然后更新数据库中的用户密码,并向用户反馈密码已更改的信息;如果密码不匹配,则提示用户密码未匹配。然而,这段代码没有采取措施防止CSRF攻击,存在安全隐患。具体如下所示。

不过代码存在CSRF(跨站请求伪造)安全风险的原因在于存攻击者可以轻易构造恶意页面诱骗已登录用户修改密码,根本原因如下所示。

  1. 1)缺少CSRF防护机制,没有使用Anti-CSRF token验证;
  2. 2)使用GET方法处理敏感操作(密码修改),使攻击者只需诱使用户访问一个包含恶意请求的链接即可完成攻击;
  3. 3)没有检查请求来源(Referer)。

详细注释后的代码如下所示。

<?php
if (isset($_GET['Change'])) {
    // 获取通过 GET 请求传递的新密码和确认密码参数
    $pass_new = $_GET['password_new'];
    $pass_conf = $_GET['password_conf'];
    // 检查新密码和确认密码是否匹配
    if ($pass_new == $pass_conf) {
        // 如果密码匹配
        // 对新密码进行转义处理(使用 mysqli_real_escape_string 函数)
        // 如果存在 $GLOBALS["___mysqli_ston"] 对象且是有效的对象,就对新密码进行转义
        // 否则会触发错误提示信息"[MySQLConverterToo] Fix the mysql_escape_string() call! code does not work."
        $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 哈希处理
        $pass_new = md5($pass_new);
        // 构造 SQL 更新语句,将新密码更新到 users 表中,用户名为 dvwaCurrentUser() 函数获取的用户名
        $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
        // 执行 SQL 语句来更新密码
        // mysqli_query 函数执行 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);
}
?>

这段 PHP 代码实现了一个密码修改功能,具体步骤如下:

  • 参数获取:检查是否存在名为 Change  GET 参数,如果存在,获取通过 GET 请求传递的新密码(password_new)和确认密码(password_conf)。
  • 密码匹配检查:比较新密码和确认密码是否相等,如果相等,继续后续操作;如果不相等,向用户显示密码不匹配的提示信息。
  • 密码处理:对匹配的新密码进行转义(使用 mysqli_real_escape_string)和 MD5 哈希处理。
  • 数据库更新:构造 SQL UPDATE 语句,将哈希后的新密码更新到 users 表中指定用户的记录上,并执行该 SQL 语句。
  • 反馈信息:根据操作结果,向用户显示密码修改成功或密码不匹配的提示信息。
  • 数据库连接关闭:最后关闭数据库连接。

四、渗透实战

1、渗透准备

进入DVWA靶场的CSRF关卡low级别,将密码由password改为123456,如下所示。

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

bp开启拦截功能,点击change后,页面URL变为如下所示,包含刚刚修改的密码和确认密码值。

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

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

使用burpsuite抓包,该报文的cookie字段说明为low级别,GET方法传入的参数password_new和password_conf,根据之前的源码分析我们知道只要两者相同且为有效的密码,即可修改成功。故而response为password changed,具体如下所示。

2、构造恶意链接

接下来使用如下参数修改URL,将两个密码均改为123,具体如下所示。

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

3、诱导受害者点击

admin账户登录后,将security设置为low后,点击恶意链接后,密码被成功修改为123,具体如下图所示。

最后,我们注销登录,使用用户名admin和密码123进行登录确认登录成功,说明密码修改成功,成功执行了CSRF攻击。 


网站公告

今日签到

点亮在社区的每一天
去签到