csrf讲解+DVWA-csrf练习

本文详细介绍了CSRF(跨站请求伪造)攻击的原理,包括攻击者如何控制用户浏览器发送恶意请求,并展示了在不同安全等级下DVWA平台的CSRF漏洞利用方法。针对防御CSRF,提出了验证码、检查referer和使用token等策略。同时,强调了在高安全等级下,使用token验证的重要性。
摘要由CSDN通过智能技术生成

CSRF漏洞

1.原理

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

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

img

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

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

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

产生CSRF攻击的要求:

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

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

2.csrf利用

环境:phpstudy+DVWA

1.low等级

将DVWA security修改为low

low等级核心代码

<?php
//核心代码
if( isset( $_GET[ 'Change' ] ) ) {
    // Get input
    $pass_new  = $_GET[ 'password_new' ];    
    $pass_conf = $_GET[ 'password_conf' ];   //核心代码
      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 );

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

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

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

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

<!DOCTYPE HTML>
<html>
    <head></head>
    <title></title>
    <body>
        <img src="http://localhost/DVWA-master/vulnerabilities/csrf/?password_new=777&password_conf=777&Change=Change#"/>
    <h1> 404</h1>
    <h2>not found</h2>
    </body>
</html>

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

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

2.medium等级

我们首先将dvwa security的等级修改为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 );

可以看到,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值,这种请求就会被服务器拒绝掉

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值