首页 > 技术文章 > Web漏洞_CSRF学习

BeatRex 2019-04-29 13:03 原文

一、原理

CSRF(Cross-site request forgery)跨站请求伪造。当受害者在与目标网站保持一个会话连接的时候,这时黑客构造了一个可以执行在目标网站相关操作(如修改密码、转账)的URL发送给受害者,受害者点击之后执行了此操作。需要注意的就是受害者必须与目标网站保持连接,这是点击链接之后才会执行操作。

二、DVWA靶机实验

Low级别

打开页面显示修改密码,需要输入新密码然后确定,当点击提交之后查看URL,显示了GET方式提交
此时如果黑客事先下载并研究了这个流程之后,可以构造一条URLhttp://192.168.1.4/vulnerabilities/csrf/?password_new=abc&password_conf=abc&Change=Change#原始用户为1337密码为charley然后发送给1337用户,当点击后显示页面
在这里插入图片描述
说明密码已经修改。这时退出登陆,通过原密码已经无法登陆,通过abc可以登陆

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();
}

?> 

查看后台源代码
通过使用eregi()函数增加了一层检查,此函数的作用就是在$_SERVER[ 'HTTP_REFERER' ] (引导用户代理到当前页的前一页的地址)中检查是否含有$_SERVER[ 'SERVER_NAME' ](当前运行脚本所在的服务器的主机名。),在这个环境下,后者即为192.168.1.4
在这里插入图片描述
即在http包中referer参数中查找host的参数

此时需要准备一台服务器,然后在服务器中创建一个名为HOST的html文件,这时在refer中去检索是否含有host的时候检索到html文件名时就会通过从而导致csrf

首先查看现在
我在vmware win7的网站根目录下创建一个文件,192.168.1.4.html,内容为:
<img src=http://192.168.1.4/vulnerabilities/csrf/?password_new=admin&password_conf=admin&Change=Change# >,然后构造URL,http://192.168.216.130/192.168.1.4.html 此时,这段URL即为refer,DVWA会在这段URL中查找是否含有192.168.1.4,由于文件名为192.168.1.4所以会通过检查

在访问这段URL之前,先查看下密码(password)
然后访问链接之后,再通过password来进行登陆已经无法登陆,尝试admin来登陆,成功登陆

说明已经产生了csrf的攻击

标签的使用

<a>标签
<iframe>标签
<img>标签
CSS层叠样式表中background:url(csrf的URL)

三、防御

1、验证码进行验证(二次验证)

2、referer check

3、anti csrf token

检测token的原理:
一般在敏感操作的时候比如修改个人信息的场景,后台程序会随机给用户当前的操作发送一个token,然后当用户提交表单的时候会将token一起发送给后台程序,此时后台程序对讲用户发来的token和后台存储的token值进行比较,如果相同则为合法操作,不同则为非法操作。
token的泄露:
①GET型泄漏:页面包含<img src="URL">时,referer中会携带token
②POST型泄漏:当网站存在XSS漏洞时,如果token包含在cookie中会通过XSS获取token从而获得用户的token。

推荐阅读