DVWA——CSRF 跨站请求伪造

CSRF简介:

CSRF(跨站请求伪造),全称Cross-site request forgery,翻译过来就是跨站请求伪造,是指利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害者的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操作(如转账、改密等)。CSRF与XSS最大的区别就在于,CSRF并没有盗取cookie而是直接利用。

Low级:

源代码

<?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>密码已更改.</pre>";
    }
    else {
        // Issue with passwords matching
        echo "<pre>密码不匹配.</pre>";
    }

    ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}

?> 

可以通过分析关键代码得到,服务器只检查参数password_new与password_conf是否相同,如果相同,就可以进行修改密码的操作,整个过程中并没有任何的防CSRF机制(cookie、会话等)

方法一:构造链接

当我们改密码时候,修改完会得到下面这个链接,这个时候只要有人点开了这个链接,他的密码就会改成123。这种方法过于简单直接,一看就全都明白了。。

http://192.168.35.132/DVWA-master/vulnerabilities/csrf/?password_new=123&password_conf=123&Change=Change#

方法二:使用短链接来隐藏 URL

为了更加隐蔽,可以生成短网址链接,点击短链接,会自动跳转到真实网站:

这上面这个只是举个例子,因为本地搭的环境,服务器域名是ip所以无法生成相应的短链接,实际攻击场景下只要目标服务器的域名不是ip,是可以生成相应短链接的。

虽然我们利用了短链接隐藏了url,但是被改密码的人还是会看到被修改成功的页面,所以这样还是不太好。

方法三:构造攻击页面

通过img标签中的src属性来加载CSRF攻击利用的URL,并进行布局隐藏,实现了受害者点击链接则会将密码修改。

构造的页面如下,然后将test.html文件放在攻击者自己准备的网站上。

<img src="http://192.168.35.132/dvwa/vulnerabilities/csrf/?password_new=123&password_conf=123&Change=Change#" border="0" style="display:none;"/> <h1>404<h1><h2>file not found.<h2>

当受害者正在使用自己的网站(浏览器中还保存着session值)时,访问攻击者诱惑点击的此链接:http://192.168.35.132/GJ/test.html

误认为是自己点击的是一个失效的url,但实际上已经遭受了CSRF攻击,密码已经被修改为123

Medium级:

<?php 

if( isset( $_GET[ ‘Change‘ ] ) ) {
    // Checks to see where the request came from
    if( eregi( $_SERVER[ ‘SERVER_NAME‘ ], $_SERVER[ ‘HTTP_REFERER‘ ] ) ) {
        // 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 = mysql_real_escape_string( $pass_new );
            $pass_new = md5( $pass_new ); 

            // Update the database
            $insert = "UPDATE `users` SET password = ‘$pass_new‘ WHERE user = ‘" . dvwaCurrentUser() . "‘;";
            $result = mysql_query( $insert ) or die( ‘<pre>‘ . mysql_error() . ‘</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>";
    } 

    mysql_close();
} 

?> 

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

eregi(string pattern, string string):检查string中是否含有pattern(不区分大小写),如果有返回True,反之False。

Medium级别的代码引入了eregi函数,Eregi函数的原理是用来检验第二个参数中是否含有第一个参数,并且Eregi不区分大小写,在此处的代码中,该函数起到的作用

为检查HTTP_REFERER中是否包含SERVER_NAME,如果包含,则符合条件,继续进行接下来的操作。代码希望通过这种机制来抵御CSRF攻击。一开始就调用

eregi()函数来判断HTTP头的referer字段里是不是包含“192.168.35.132”字符串,即发送请求的是不是本机,如果是则继续后面代码的执行。

过滤规则是http包头的Referer参数的值中必须包含主机名(这里是192.168.35.132)我们可以将攻击页面命名为192.168.35.132.html(页面被放置在攻击者的服务器里)就可以绕过了

这里就是我们改的密码。123了

High级:

<?php 

if( isset( $_GET[ ‘Change‘ ] ) ) {
    // Check Anti-CSRF 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 = mysql_real_escape_string( $pass_new );
        $pass_new = md5( $pass_new ); 

        // Update the database
        $insert = "UPDATE `users` SET password = ‘$pass_new‘ WHERE user = ‘" . dvwaCurrentUser() . "‘;";
        $result = mysql_query( $insert ) or die( ‘<pre>‘ . mysql_error() . ‘</pre>‘ ); 

        // Feedback for the user
        echo "<pre>Password Changed.</pre>";
    }
    else {
        // Issue with passwords matching
        echo "<pre>Passwords did not match.</pre>";
    } 

    mysql_close();
} 

// Generate Anti-CSRF token
generateSessionToken(); 

?> 

通过观察代码发现,High级别的带入引入了Anti-CSRF token,每次修改密码服务器会通过generateSessionToken()随机生成一个token,

只有客户端提交的token参数与服务器端一致时,服务器端才会处理客户端的响应。

这里的Name存在XSS漏洞,我们抓包,改参数,因为XSS里面的name中有长度限制

name:<iframe src="../csrf" onload=alert(frames[0].document.getElementsByName(‘user_token‘)[0].value)>

message:111

然后把它发送到repeaer模块去,修改参数

成功拿到token。

impossible级:

利用PDO技术防御SQL注入;

至于防护CSRF,则要求用户输入原始密码(简单粗暴);

这样在不知道原始密码的情况下,无论如何都无法进行CSRF攻击。

原文地址:https://www.cnblogs.com/qi-yuan/p/12408055.html

时间: 2024-10-01 02:03:28

DVWA——CSRF 跨站请求伪造的相关文章

安全性测试入门 (三):CSRF 跨站请求伪造攻击和防御

安全性测试入门 (三):CSRF 跨站请求伪造攻击和防御 本篇继续对于安全性测试话题,结合DVWA进行研习. CSRF(Cross-site request forgery):跨站请求伪造 1. 跨站请求伪造攻击 CSRF则通过伪装成受信任用户的请求来利用受信任的网站,诱使用户使用攻击性网站,从而达到直接劫持用户会话的目的. 由于现在的主流浏览器比如火狐和谷歌,都倾向于使用单个进程来管理用户会话(比如我们在FF和Chrome中,当要访问一个新页面时,通常是通过新增浏览器页面来达到的,而不是新开一

理解CSRF(跨站请求伪造)

理解CSRF(跨站请求伪造) 原文出处Understanding CSRF 对于Express团队的csrf模块和csurf模块的加密函数的用法我们经常有一些在意. 这些在意是莫须有的,因为他们不了解CSRF token是如何工作的. 下面快速过一遍! 读过后还有疑问?希望告诉我们错误?请开一个issue! 一个CSRF攻击是如何工作的? 在他们的钓鱼站点,攻击者可以通过创建一个AJAX按钮或者表单来针对你的网站创建一个请求: <form action="https://my.site.c

Ajax--参数,csrf跨站请求伪造,serialize(),上传文件formdata

https://cdn.bootcss.com/jquery-cookie/1.4.1/jquery.cookie.js. 一:参数,processData,contentType,traditional,dataType ######################------------data---------################ data: 当前ajax请求要携带的数据,是一个json的object对象,ajax方法就会默认地把它编码成某种格式 (urlencoded:?a=

ajax向Django前后端提交请求和CSRF跨站请求伪造

1.ajax登录示例 urls.py from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^login_ajax/$', views.login_ajax, name='login_ajax'), url(r'^index/$', views.index, n

Django框架 之 基于Ajax中csrf跨站请求伪造

ajax中csrf跨站请求伪造 方式一 1 2 3 $.ajaxSetup({     data: {csrfmiddlewaretoken: '{{ csrf_token }}' }, }); 方式二 1 2 3 4 5 <form> {% csrf_token %} </form><br><br><br>$.ajax({<br>...<br>data:{ "csrfmiddlewaretoken":

Django框架(十六)-- 中间件、CSRF跨站请求伪造

一.什么是中间件 中间件是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出 二.中间件的作用 如果你想修改请求,例如被传送到view中的HttpRequest对象. 或者你想修改view返回的HttpResponse对象,这些都可以通过中间件来实现. 可能你还想在view执行之前做一些操作,这种情况就可以用 middleware来实现. Django默认的中间件:(在django项目的settings模块中,有一个 MIDDLE

Django框架之中间件、CSRF跨站请求伪造

一.中间件 1.什么是中间件 中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Django的输入和输出.每个中间件组件都负责做一些特定的功能. 中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作,它本质上就是一个自定义类,类中定义了几个方法,Django框架会在请求的特定的时间去执行这些方法. 2.Django中的中间件 django默认有7个中间件 MIDDLEWARE = [ 'django.middlewar

Python Django 生命周期 中间键 csrf跨站请求伪造 auth认证模块 settings功能插拔式源码

一 django 生命周期 二 django中间键 1.什么是中间键 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Django的输入和输出.每个中间件组件都负责做一些特定的功能. 简单来说就相当于django门户,保安:它本质上就是一个自定义类,类中定义了几个方法. 请求的时候需要先经过中间件才能到达django后端(urls,views,templates,models): 响应走的时候也需要经过中间件才能到达w

☆Django☆---中间件 csrf跨站请求伪造 auth模块 settings功能插拔式源码

Django中间件 django生命周期图 中间件: 概念: Django中间件就类似于 django的保安   请求 的时候需要先经过中间件才能到达django后端(urls, views)   响应 走的时候也需要经过中间件才能到达web服务网关接口 django默认的七个中间件 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.Session