csrf讲解+DVWA-csrf练习

CSRF漏洞

1.原理

csrf(cross-site request forgery):跨站请求伪造

CSRF攻击利用网站对于用户浏览器的信任,攻击者挟持用户的登录信息,向网站发送一些并非用户本意的请求,执行一些操作。

csrf讲解+DVWA-csrf练习_第1张图片

在CSRF攻击中,攻击者通过控制用户浏览器发送恶意的额外请求,破坏会话完整性

为何攻击者可以控制用户浏览器?

根据浏览器的安全策略,允许当前页面发送到任何地址的请求,所以,当用户在受信任的网站中点击了攻击者的恶意链接后,就进入了攻击者构造的页面,这个页面是不受用户控制的,于是攻击者就可以通过控制自己构造的页面来控制用户的浏览器发送请求了。

产生CSRF攻击的要求:

1.用户登录了网站,能够进行网站上的正常操作

2.用户点击了攻击者的URL链接

2.csrf利用

环境:phpstudy+DVWA

1.low等级

将DVWA security修改为low

low等级核心代码

可以看到,low等级只要password_new和password_conf一致即可

例如,我们想要将密码改为777

1.方法1:直接可以在url中修改,因为此时的修改密码没有进行任何防护

2.方法2:或者写一个HTML文件 ,命名为localhost.html(这个文件要放在www文件夹下1)



    
    
    
        
    

404

not found

我们在浏览器中打开这个localhost.html文件

好了,这时候我们也完成了密码修改

2.medium等级

我们首先将dvwa security的等级修改为medium

核心代码:

可以看到,medium等级相比low等级多了一个 stripos( S E R V E R [ ′ H T T P R E F E R E R ′ ] , _SERVER[ 'HTTP_REFERER' ] , SERVER[HTTPREFERER],_SERVER[ ‘SERVER_NAME’ ]) !== false的条件

它的意思是需要验证referer中是否包含server_name参数(http请求中的host和要访问的主机名),过滤规则中表明referer中必须包含主机名这里是localhost,所以我们就使用localhost.html就可以绕过了

我们打开burpsuite,将proxy模块打开

我们继续返回到浏览器,输入newpassword=777, confirm new password=777,点击change按钮

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KVp5Osp5-1654518743200)(C:\Users\zhs\AppData\Roaming\Typora\typora-user-images\image-20220606184545305.png)]

好了,这时候我们抓到了包

然后,我们把它发送到repeater模块

我们修改repeater中的referer,原始referer为Referer: http://localhost/DVWA-master/vulnerabilities/csrf/

修改为

http://localhost/localhost.html

将它发送出去(点击send按钮)

看到reponse回应一个200 OK即修改成功了

3.high等级

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

可以看出,high等级多了一行代码checkToken( $_REQUEST[ ‘user_token’ ], $_SESSION[ ‘session_token’ ], ‘index.php’ );,

如果攻击者想要修改用户的密码,就必须获得token值(当用户访问修改密码页面,服务器会返回一个token值,然后用户向浏览器发送修改密码请求时,必须带上token值,只有token值正确,服务器才会进行接下来的操作)

由于浏览器跨域请求是不被允许的,所以这里我们不进行high等级练习

4.impossible等级

这个等级必须要知道初始密码,攻击者如果不知道,是没办法进行攻击的

3.csrf防御

1.验证码

2.referer

referer被包含在http请求中:referer的含义是表明一个请求的来源

在一些网站上的用户进行敏感操作时,我们可以设置referer,如果它不来源于同一url来源,我们直接拒绝掉这个请求

3.添加token值并验证

csrf攻击成功的实质就是:攻击者可以猜中用户的所有重要参数,而token解决了这一问题

token值是服务器为每一个用户产生的独特的值,它不放在cookie中,所以不会被攻击者利用

当用户要发送请求时,必须带上token值

而攻击者的请求中不含有token值,这种请求就会被服务器拒绝掉

你可能感兴趣的:(csrf,web安全,安全)