DVWA1.8全级别之CSRF

DVWA全级别之CSRF

CSRF(Cross-site request forgery)

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

下面对3种级别的代码进行分析。

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

?>

可以看到,服务器收到修改密码的请求后,会检查参数password_new与password_conf是否相同,如果相同,就会修改密码,并没有任何的防CSRF机制(当然服务器对请求的发送者是做了身份验证的,是检查的cookie,只是这里的代码没有体现= =)。

漏洞利用

1、构造链接

A) 最基础的:

http://192.168.232.130/dvwa/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change#

当受害者点击了这个链接,他的密码就会被改成password(这种攻击显得有些拙劣,链接一眼就能看出来是改密码的,而且受害者点了链接之后看到这个页面就会知道自己的密码被篡改了)

需要注意的是,CSRF最关键的是利用受害者的cookie向服务器发送伪造请求,所以如果受害者之前用Chrome浏览器登录的这个系统,而用搜狗浏览器点击这个链接,攻击是不会触发的,因为搜狗浏览器并不能利用Chrome浏览器的cookie,所以会自动跳转到登录界面。
有人会说,这个链接也太明显了吧,不会有人点的,没错,所以真正攻击场景下,我们需要对链接做一些处理。

B) 我们可以使用短链接来隐藏URL(点击短链接,会自动跳转到真实网站):
因为本地搭的环境,服务器域名是ip所以无法生成相应的短链接= =,实际攻击场景下只要目标服务器的域名不是ip,是可以生成相应短链接的。
需要提醒的是,虽然利用了短链接隐藏url,但受害者最终还是会看到密码修改成功的页面,所以这种攻击方法也并不高明。

C) 构造攻击页面

现实攻击场景下,这种方法需要事先在公网上传一个攻击页面,诱骗受害者去访问,真正能够在受害者不知情的情况下完成CSRF攻击。这里为了方便演示(才不是我租不起服务器= =),就在本地写一个test.html,下面是具体代码。

<img src="http://192.168.153.130/dvwa/vulnerabilities/csrf/?password_new=hack&password_conf=hack&Change=Change#" border="0" style="display:none;"/>

<h1>404<h1>

<h2>file not found.<h2>

当受害者访问test.html时,会误认为是自己点击的是一个失效的url,但实际上已经遭受了CSRF攻击,密码已经被修改为了hack。
在这里插入图片描述

Medium

服务器端核心代码

<?php 

if( isset( $_GET[ 'Change' ] ) ) { 
    // Checks to see where the request came from 
    if( eregi( "127.0.0.1", $_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(); 
} 

?> 

相关函数说明

int eregi(string pattern, string string)

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

可以看到,Medium级别的代码检查了保留变量 HTTP_REFERER(http包头的Referer参数的值,表示来源地址)中是否包含127.0.0.1,希望通过这种机制抵御CSRF攻击。

漏洞利用

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

High

首先在界面上就可以看到不同:这里需要管理员首先输入当前密码,然后才能重新设置密码。这就是目前非常有效的一种防御CSRF攻击的方法:二次确认。
在这里插入图片描述
所谓二次确认,就是在调用某些功能时进行二次验证,如:删除用户时,产生一个提示对话框,提示“确定删除用户吗?”。转账操作时,要求用户输入二次密码。另外,设置验证码也可以起到相同的效果。

当二次验证后,即使用户打开漏洞CSRF攻击页面,也不会直接去执行,而需要用户再次输入才可以完成攻击。这样,当用户突然收到提示后,可能会心存怀疑,就不会再乖乖地中招。

<think>好的,我现在需要回答用户关于DVWACSRF漏洞的示例和防护方法的问题。首先,我得回忆一下DVWA是什么,以及CSRF漏洞的基本概念。DVWA(Damn Vulnerable Web Application)是一个用于安训练的应用,包含多种漏洞,方便学习渗透测试和防护方法。CSRF(Cross-Site Request Forgery)跨站请求伪造,攻击者诱使用户在已认证的情况下执行非预期的操作。 接下来,用户需要具体的漏洞示例和防护方法。我应该先解释DVWA中的CSRF漏洞实例,可能是在哪个安级别下,比如Low级别可能存在未防护的CSRF,比如修改密码的功能没有验证请求来源或使用Token。然后,防护方法通常包括使用CSRF Token、验证Referer头、SameSite Cookie属性等。 需要确保回答结构清晰,分点说明。同时,用户提到参考了《磐石计划:Web安漏洞与渗透测试》的笔记,所以可能需要引用相关内容,比如在防护方法中提到相关的最佳实践。此外,生成相关问题时要与CSRFDVWA相关,可能涉及漏洞原理、不同安级别的防护措施对比,以及如何利用漏洞进行渗透测试的步骤。 还要注意使用中文,数学公式用$...$,独立公式用$$...$$,但这里可能不太需要数学公式,但如果有涉及参数或算法,可能需要使用。例如,在解释Token生成时,如果有随机数生成,可以用公式表示,如生成Token的算法:$token = hash(session\_id + secret\_key)$,不过这可能不需要,视情况而定。 需要检查是否所有行内代码和术语正确,比如CSRF的正确拼写,DVWA的各个级别设置,比如Low、Medium、High的安配置差异。例如,在Low级别下,DVWACSRF可能没有任何防护,而Medium可能检查Referer,High级别使用Token验证。 最后,生成的相关问题应围绕CSRF的扩展,比如其他防护措施、不同安级别的实现差异、实际案例等。确保问题对用户有帮助,引导深入学习。 现在整理回答结构:先介绍CSRF漏洞在DVWA中的示例,分不同安级别说明;然后详细说明防护方法,每个方法如何实施;最后生成相关问题。同时引用提供的参考内容,比如在防护措施中提到遵守国家规定,引用[^1]。</think>### DVWA中的CSRF漏洞示例及防护方法 #### 1. CSRF漏洞示例(以DVWA的Low级别为例) 在DVWA的“CSRF”模块中,Low安级别的密码修改功能未采取任何防护措施。攻击者可构造恶意链接,诱使用户点击后自动提交密码修改请求。例如,以下URL可直接修改用户密码(假设用户已登录): ``` http://localhost/dvwa/vulnerabilities/csrf/?password_new=123&password_conf=123&Change=Change# ``` 由于请求未验证来源或使用Token,用户点击后密码会被修改为`123`[^1]。 #### 2. 防护方法 - **CSRF Token验证** 服务端生成随机Token并嵌入表单,提交时验证Token有效性。例如: ```html <input type="hidden" name="token" value="<?php echo generate_token(); ?>"> ``` Token生成逻辑可设计为:$$ \text{Token} = \text{Hash}(\text{SessionID} + \text{SecretKey}) $$ - **验证Referer头** 检查请求头中的`Referer`是否来自合法域名,但需注意某些浏览器可能禁用Referer。 - **SameSite Cookie属性** 设置Cookie的`SameSite=Strict`或`Lax`,限制跨站请求携带Cookie: ```php setcookie("session_id", $value, ["samesite" => "Strict"]); ``` - **二次验证** 敏感操作(如密码修改)需用户二次输入原密码或验证码。 #### 3. DVWA不同安级别的防护差异 - **Medium级别**:检查`Referer`是否包含主机名,但仍可被绕过。 - **High级别**:强制使用CSRF Token,且Token与会话绑定,无法伪造。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值