zoukankan      html  css  js  c++  java
  • 小白日记50:kali渗透测试之Web渗透-CSRF

    CSRF

    CSRF原理:经常与XSS混淆。

    从信任的角度进行区分:XSS:利用用户对站点的信任;CSRF:利用站点对已经身份认证的信任(有一定的信任)【默认情况:站点不信任客户端】

    结合社工在身份认证会话过程中实现攻击

    场景:

    1、修改账号密码、个人信息(email、收货地址)

    2、发送伪造的业务请求(网银、购物、投票)

    3、关注他人社交账号、推送博文

    4、在用户非自愿、不知情情况下提交请求

     

    属于业务逻辑漏洞(所有请求都是正常的请求)

    关键操作(支付、提交订单等)缺少确认机制(如验证码)

    自动扫描程序无法发现此类漏洞

    漏洞利用条件

    被害用户已经完成身份认证(即已登录)

    新请求的提交(重要性的)不需要重新身份验证

    攻击者必须了解Web Application请求的参数构造

    诱使用户触发攻击的指令(社工)

    Burpsuite CSRF PoC generator

    Post/Get方法

     

    CSRF漏洞演示过程【win7为受害者,修改密码页面,kali为攻击机】

    低级别,无需输入原密码【伪造页面和链接,诱使受害者点击】

    注:GET方法:将会在页面有明显显示;POST方法:将可隐藏操作

    GET

    POST

    查看网页源代码,直接修改表单的代码,保存成页面文件,诱使用户点击【使用burpsuite截断重放】

     

    保存成html文件,伪造链接,发给受害者

    代码审计

    low

     1  <?php
     2                 
     3     if (isset($_GET['Change'])) {
     4     
     5         // Turn requests into variables
     6         $pass_new = $_GET['password_new'];
     7         $pass_conf = $_GET['password_conf'];
     8 
     9 
    10         if (($pass_new == $pass_conf)){
    11             $pass_new = mysql_real_escape_string($pass_new);
    12             $pass_new = md5($pass_new);
    13 
    14             $insert="UPDATE `users` SET password = '$pass_new' WHERE user = 'admin';";
    15             $result=mysql_query($insert) or die('<pre>' . mysql_error() . '</pre>' );
    16                         
    17             echo "<pre> Password Changed </pre>";        
    18             mysql_close();
    19         }
    20     
    21         else{        
    22             echo "<pre> Passwords did not match. </pre>";            
    23         }
    24 
    25     }
    26 ?> 

     medium【绕过referer】

     1  <?php
     2             
     3     if (isset($_GET['Change'])) {
     4     
     5         // Checks the http referer header
     6         if ( eregi ( "127.0.0.1", $_SERVER['HTTP_REFERER'] ) ){  //判断来源,限制接受本机IP的包【可将其替换或在referer中包含127.0.0.1】
     7     
     8             // Turn requests into variables
     9             $pass_new = $_GET['password_new'];
    10             $pass_conf = $_GET['password_conf'];
    11 
    12             if ($pass_new == $pass_conf){
    13                 $pass_new = mysql_real_escape_string($pass_new);
    14                 $pass_new = md5($pass_new);
    15 
    16                 $insert="UPDATE `users` SET password = '$pass_new' WHERE user = 'admin';";
    17                 $result=mysql_query($insert) or die('<pre>' . mysql_error() . '</pre>' );
    18                         
    19                 echo "<pre> Password Changed </pre>";        
    20                 mysql_close();
    21             }
    22     
    23             else{        
    24                 echo "<pre> Passwords did not match. </pre>";            
    25             }    
    26 
    27         }
    28         
    29     }
    30 ?> 

     high  【需输入原密码】

     1  <?php
     2             
     3     if (isset($_GET['Change'])) {
     4     
     5         // Turn requests into variables
     6         $pass_curr = $_GET['password_current'];
     7         $pass_new = $_GET['password_new'];
     8         $pass_conf = $_GET['password_conf'];
     9 
    10         // Sanitise current password input
    11         $pass_curr = stripslashes( $pass_curr );
    12         $pass_curr = mysql_real_escape_string( $pass_curr );
    13         $pass_curr = md5( $pass_curr );
    14         
    15         // Check that the current password is correct
    16         $qry = "SELECT password FROM `users` WHERE user='admin' AND password='$pass_curr';";
    17         $result = mysql_query($qry) or die('<pre>' . mysql_error() . '</pre>' );
    18 
    19         if (($pass_new == $pass_conf) && ( $result && mysql_num_rows( $result ) == 1 )){
    20             $pass_new = mysql_real_escape_string($pass_new);
    21             $pass_new = md5($pass_new);
    22 
    23             $insert="UPDATE `users` SET password = '$pass_new' WHERE user = 'admin';";
    24             $result=mysql_query($insert) or die('<pre>' . mysql_error() . '</pre>' );
    25                         
    26             echo "<pre> Password Changed </pre>";        
    27             mysql_close();
    28         }
    29     
    30         else{        
    31             echo "<pre> Passwords did not match or current password incorrect. </pre>";            
    32         }
    33 
    34     }
    35 ?> 

    自动扫描程序的检测方法【代码安全,确认机制角度】

    在请求和响应过程中检查是否存在anti-CSRF token

    检查服务器是否验证anti-CSRF token的名值

    检查token中可编辑的字符串

    检查referrer头是否可以伪造

     

    对策 

    Captcha

    anti-CSRF token

    Referrer头  【可绕过机率较大】

    降低会话超时时间 

     

     

     

  • 相关阅读:
    第二十三章 kubernetes 核心技术Volume
    第二十一章 kubernetes核心技术Ingress
    第十九章 kubernetes 核心技术ConfigMap
    vuejs在解析时出现闪烁的原因及防止闪烁的方法
    2020/9/5
    2021/9/3
    2021/9/7
    2021/9/2
    2021/9/4
    2021/9/6
  • 原文地址:https://www.cnblogs.com/zixuanfy/p/6076128.html
Copyright © 2011-2022 走看看