zoukankan      html  css  js  c++  java
  • 代码审计中的CSRF

    0x00 背景

    CSRF漏洞中文名为“跨站请求伪造”,英文别名为“one-click-attack”。从字面上我们就可以看出,这是一种劫持其他用户进行非法请求的攻击方式,主要用于越权操作,与XSS相比更具有危险性。本文以代码审计的形式研究CSRF的原理、挖掘形式、防御方案及缺陷。

    0x01 CSRF漏洞的产生原理

    CSRF通过伪装成受信任用户的请求来利用受信任的网站,具体案例如下:

     1 <?php 
     2 
     3 if( isset( $_GET[ 'Change' ] ) ) { 
     4     // Get input 
     5     $pass_new  = $_GET[ 'password_new' ]; 
     6     $pass_conf = $_GET[ 'password_conf' ]; 
     7 
     8     // Do the passwords match? 
     9     if( $pass_new == $pass_conf ) { 
    10         // They do! 
    11         $pass_new = mysql_real_escape_string( $pass_new ); 
    12         $pass_new = md5( $pass_new ); 
    13 
    14         // Update the database 
    15         $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';"; 
    16         $result = mysql_query( $insert ) or die( '<pre>' . mysql_error() . '</pre>' ); 
    17 
    18         // Feedback for the user 
    19         echo "<pre>Password Changed.</pre>"; 
    20     } 
    21     else { 
    22         // Issue with passwords matching 
    23         echo "<pre>Passwords did not match.</pre>"; 
    24     } 
    25 
    26     mysql_close(); 
    27 } 
    28 
    29 ?>

    这是一段密码修改的PHP程序,我们可以看出当password_new与password_conf一致时,程序就会进行修改密码的操作,这时如果我们构造这样一个URL:

    http://127.0.0.1/csrf/?password_new=password&password_conf=password&Change=Change#

    将URL发送给一个该网站的用户,当他点击了这个链接后,他的密码就会自动修改为password。在现实环境中,黑客往往会把攻击流程做得更隐秘一些,例如制作一个页面,代码如下:

    1 <img src="http://127.0.0.1/csrf/?password_new=hack&password_conf=hack&Change=Change#" border="0" style="display:none;"/>
    2 
    3 <h1>404<h1>
    4 
    5 <h2>file not found.<h2>

    这样就可以做到隐秘得进行攻击了。

    0x02 CSRF的挖掘形式

    上文提到了CSRF大多数都与越权操作相关,那么我们在代码审计的时候只需要重点关注相关功能,包括:后台管理、论坛等功能。因为现在绝大多数的网站采用token验证,在审计的过程中我们可以直接在功能的核心文件内搜索token,如果没有token验证,那么这个功能大概率会出现CSRF。

    黑盒测试的思路与代码审计基本一致,在关键功能处抓包查看有没有token验证,如果没有再次请求这个页面,删去referer,如果返回数据一致,那么大概率会出现CSRF。

    0x03 防御方案及缺陷

    防御CSRF就是避免服务器对用户的绝对信任,要对用户进行身份验证。现在我们验证用户身份的方式往往是加入Token,中文名为令牌,是一种写入Cookie或者页面的不可预测的字符串。采用token验证的程序效果往往比较明显。

    我们只需要在上面代码获取password_new之前插入

    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' ); 

    就可以有效进行防御,除非结合其他漏洞。

  • 相关阅读:
    杜马岛
    Type interface com.zhaoka.mapper.DatKcardKmMapper is not known to the MapperRegistry
    jsp实现自动登录
    Struts2中的get、set方法重要性 .
    struts2 通过前台标签name属性将值传到后台,没有name属性传值,则后台对象有默认值,不为null。
    Jsp 操作 Cookie 实现自动登录
    struts2的bean类名首字母和第二个字母都不能大写
    mybatis自动生成的ExamMapper.xml方法总结
    Mybatis插入时注意,没有主键值。所以主键一般为自增类型
    <ywaf:code code="${project.projectType}" typeCode="PROJECT_TYPE"/>
  • 原文地址:https://www.cnblogs.com/richardlee97/p/10512658.html
Copyright © 2011-2022 走看看