目录

1、级别:Low

2、级别:Medium

3、级别:High


什么是CSRF?

CSRF,跨站域请求伪造,通常攻击者会伪造一个场景(例如一条链接),来诱使用户点击,用户一旦点击,黑客的攻击目的也就达到了,他可以盗用你的身份,以你的名义发送恶意请求。CSRF攻击的关键就是利用受害者的cookie向服务器发送伪造请求。

和XSS有什么不同?

CSRF是以用户的权限去做事情,自己本身并没有获取到权限;XSS是直接盗取了用户的权限进行攻击。

放个例子更好理解一点

什么是CSRF攻击?如何防御CRSF攻击? - 知乎

参考:DVWA全级别通关笔记(三)-- CSRF(跨站请求伪造) - s1awwhy - 博客园

1、级别:Low

查看源代码:

<?phpif( 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 userecho "<pre>Password Changed.</pre>";}else {// Issue with passwords matchingecho "<pre>Passwords did not match.</pre>";}((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}?>

源代码只是对pass_new和pass_conf进行了==比较,两者相等即可

输入123和123

看一下顶上的url:

我们复制这个链接到一个新的web页面中,在新页面里修改密码为password

是可以成功修改的

退出dvwa重新用原密码进行登录,失败了,说明我们的密码已经被成功修改了。

当然啊这个新的web页面的url(也就是黑客自创的假链接)有点过于显眼了= =

于是,为了隐藏URL,可以使用生成短链接的方式来实现。

站长之家(生成短链接):https://tool.chinaz.com/Tools/dwz.aspx

 打开也是同样的界面

2、级别:Medium

源码

<?phpif( isset( $_GET[ 'Change' ] ) ) {// Checks to see where the request came fromif( 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 userecho "<pre>Password Changed.</pre>";}else {// Issue with passwords matchingecho "<pre>Passwords did not match.</pre>";}}else {// Didn't come from a trusted sourceecho "<pre>That request didn't look correct.</pre>";}((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}?>

stripos() 函数查找字符串在另一字符串中第一次出现的位置(不区分大小写)

代码检查了保留变量HTTP_REFERER (http包头部的Referer字段的值,表示来源地址)是否包含SERVER_NAME(http包头部的 Host 字段表示要访问的主机名)。

抓个包吧~这个对于本地搭建的DVWA是无效的,但是在现实场景中一般是不包含的,所以我们可以通过更改页面文件名来绕过stripos函数。绕过方法:

假如服务器地址为192.168.101.66,即为SERVER_NAME,我们只需要把我们构造的恶意页面文件名改为192.168.101.66.html,HTTP_REFERER就会包含192.168.101.66.html,就可以绕过stripos了。

3、级别:High

源码:

<?php$change = false;
$request_type = "html";
$return_message = "Request Failed";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);$request_type = "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 {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) {// Check Anti-CSRF tokencheckToken( $token, $_SESSION[ 'session_token' ], 'index.php' );// Do the passwords match?if( $pass_new == $pass_conf ) {// They do!$pass_new = mysqli_real_escape_string ($GLOBALS["___mysqli_ston"], $pass_new);$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 );// Feedback for the user$return_message = "Password Changed.";}else {// Issue with passwords matching$return_message = "Passwords did not match.";}mysqli_close($GLOBALS["___mysqli_ston"]);if ($request_type == "json") {generateSessionToken();header ("Content-Type: application/json");print json_encode (array("Message" =>$return_message));exit;} else {echo "<pre>" . $return_message . "</pre>";}
}// Generate Anti-CSRF token
generateSessionToken();?>

代码新增了token机制,用户每次访问更改密码页面时,服务器会返回一个随机的token,之后每次向服务器发起请求,服务器会优先验证token,如果token正确,那么才会处理请求。

所以我们在发起请求之前需要获取服务器返回的user_token,利用user_token绕过验证。这里我们可以使用burpsuit的CSRF Token Tracker插件可以直接绕过user_token验证。使用步骤如下:

1、安装CSRF Token Tracker插件

2、进入插件之后添加主机和名(名就是token的名字,这里是user_token),还有抓取到的token值也需要添加上去

3、再重新抓包到重放模块,这时我们会发现不管怎么修改密码,都会返回200,插件里的token值也会自动更新

还有一种方法利用了xss,我们在dvwa的反射型xss处插入下列语句,可以弹框得到当前的token值

<iframe src="../csrf/"οnlοad=alert(frames[0].document.getElementsByName('user_token')[0].value)></iframe>

复制token(不要点确认,否则又会立即更新)

修改bp请求包里的token值,密码也能成功更改

输入原密码验证,登录失败

 如何防御CSRF?

1、验证 HTTP Referer 字段

Referer 字段记录了该 HTTP 请求的来源地址,若请求来源不一致,则认为可能是 CSRF 攻击而拒绝该请求。

2、在请求地址中添加 token 并验证

在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。

但难点在于如何将oken 以参数的形式加入请求。

3、在 HTTP 头中自定义属性并验证

这种方法也是使用 token 并进行验证,和上一种方法不同的是,这里并不是把 token 以参数的形式置于 HTTP 请求之中,而是把它放到 HTTP 头中自定义的属性里。通过 XMLHttpRequest 这个类,可以一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性,并把 token 值放入其中。

4、双重Cookie验证

  • 在用户访问网站页面时,向请求域名注入一个Cookie,内容为随机字符串(例如csrfcookie=v8g9e4ksfhw)。
  • 在前端向后端发起请求时,取出Cookie,并添加到URL的参数中(接上例POST https://www.a.com/comment?csrfcookie=v8g9e4ksfhw)。
  • 后端接口验证Cookie中的字段与URL参数中的字段是否一致,不一致则拒绝。

DVWA 之 CSRF相关推荐

  1. 基于DVWA的CSRF

    1.等级为low 在改密码的时候,使用burp抓包. 会发现是GET方式进行参数传递.然后复制url 3.可以自行修改password_new=1&password_conf=1的参数.然后引 ...

  2. DVWA之CSRF攻击

    CSRF(Cross-site request forgery)跨站请求伪造:攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求. LOW 源代码 <?php if( is ...

  3. DVWA 靶场CSRF(low)

    csrf界面,点Test credentials,输入默认的账号密码,点击登录,提示密码有效.(admin,password) 修改密码界面输入新的密码两次,burp抓包,选择CSRF Poc会生成一 ...

  4. DVWA系列之17 CSRF攻击介绍与实施

    CSRF(Cross-Site Request Forgery)跨站点请求伪造,这种攻击方式的特点是:攻击者盗用你的身份,以你的名义进行某些非法操作.CSRF能够使用你的帐户发送邮件,获取你的敏感信息 ...

  5. web常见漏洞解析 注入 xss csrf 文件上传 文件包含 -dvwa演示

    注(以下环境皆是自己在本机搭建,请勿在公网真实操作) 1.注入 1.1 SQL注入: 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶 ...

  6. DVWA [CSRF] 跨站请求伪造

    CSRF 漏洞原理:攻击者在受害者未登出Web应用的情况下,诱导其点击恶意链接,达到以用户身份完成恶意攻击.简单来说,就是攻击者以用户的身份完成操作达到各种目的. Low 源代码: <?phpi ...

  7. 【CSRF02】跨站请求伪造——DVWA靶场实操(含CSRF+XSS协同攻击实验)

    目录 1 实验简介 1.1 实验目的 1.2 实验环境 2 Low难度 2.1 前戏 2.2 实验步骤 2.3 代码审计 3 Medium难度 3.1 前戏 3.2 实验思路 3.3 方法一:诱导点击 ...

  8. DVWA 之 Cross Site Request Forgery (CSRF)

    汇总链接: https://baynk.blog.csdn.net/article/details/100006641 ---------------------------------------- ...

  9. DVWA系列之21 存储型XSS分析与利用

    存储型跨站可以将XSS语句直接写入到数据库中,因而相比反射型跨站的利用价值要更大. 在DVWA中选择XSS stored,这里提供了一个类型留言本的页面. 我们首先查看low级别的代码,这里提供了$m ...

最新文章

  1. Tomcat怎样将配置文件放在外部
  2. opencv 阈值分割 — threshold()
  3. iOS 模型数组去重复
  4. [2DPIC调试笔记]parameter_antenna_radiation1013(3)
  5. linux手工迁移php,Linux+PHP+MySql网站迁移配置
  6. 产品经理专业知识50篇(十二)-抖音训练营项目实战(知识付费MVP产品模型)
  7. java 成员函数相互调用_java 深入理解内部类以及之间的调用关系
  8. Educational Codeforces Round 45 (Rated for Div. 2) G - GCD Counting
  9. HVIDB!人类病毒蛋白互作数据库介绍
  10. 【Tableau Desktop 企业日常问题28】Tableau 如何发布到public ?
  11. 解决WPS word论文英文摘要不对齐的问题
  12. python微分几何_十一年磨一剑:中科大数学教授成功证明微分几何学两大猜想
  13. SpringBoot+zxing批量生成二维码_南国
  14. linux基本权限例子,Linux-3 文件权限-基本权限
  15. 推荐系统之NFM原理与实现学习
  16. git如何在某个分支下创建分支
  17. 世峰与深圳供电局就电力发展历史虚拟现实培训系统项目展开合作
  18. SIFT特征点提取及描述论文算法详解
  19. Linux-环境变量配置
  20. 紧跟热点:爱乐活联合Qzone推出《舌尖上的中国菜》

热门文章

  1. AppCompatActivity设置为dialog弹窗主题样式,并设置半透明背景
  2. Android开机各个阶段(Android R)
  3. 唯有全程联网可拯救国产单机
  4. 如何将旧iPhone 的数据全部转移到新iPhone SE3上?
  5. 打通数据价值链,百分点数据科学基础平台实现数据到决策的价值转换 | 爱分析调研
  6. Mac下的安卓模拟器bluestacks安装apk
  7. 左手右手(13-16)
  8. phaser游戏入门4(接金币游戏2)
  9. -Djava.endorsed.dirs=D:\tomcat\apache-tomcat-9.0.8\endorsed is not supported. Endorsed standards and
  10. unity 之 物理材质(PhysicMaterial)