CSRF漏洞学习总结

embedded/2025/1/23 7:02:24/

一、什么是CSRF漏洞?

CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种网络攻击,它利用受害者在受信任网站上的已认证会话,来执行非预期的行动。这种攻击的核心在于,攻击者能够诱使受害者的浏览器向一个他们已经登录的网站发送恶意构造的请求,而该网站会错误地认为这个请求是用户有意发起的。

1.1原理

当用户成功登录一个网站时,服务器会返回该用户的“身份证”,也就是cookie。当用户后续进行操作时,浏览器会自动添加上这个cookie,服务器收到数据包后就会对cookie进行验证,确保是用户进行的操作。攻击者伪造一个网站,通过钓鱼等手段使受害者访问这个网站,如果受害者此时正在访问有csrf的网站,当用户点击假网站的按钮时,浏览器就会将该请求带上cookie,发送给服务端,而此时服务端认为是用户的操作。

二、实际攻击例子

场景设定

假设有一个在线银行系统 bank.example.com,它存在一个未修复的CSRF漏洞。用户可以通过访问 /updateprofile.php 页面来更新他们的个人资料,但该页面没有适当的CSRF防护机制。

攻击准备

  1. 创建恶意网站:攻击者首先创建了一个看似合法的网站,可能是模仿了银行的登录界面或提供某种“安全更新”服务的页面。
  2. 构造CSRF攻击向量:在恶意网站中嵌入一个HTML表单或者通过JavaScript自动提交的代码,就像之前讨论过的那样。这个表单的目标是银行的 /updateprofile.php,并且包含了攻击者想要更改的信息,例如用户的电子邮件地址、密码提示问题等。
  3. 伪装钓鱼邮件:攻击者设计了一封看起来像是来自银行的紧急通知邮件,告知用户有关账户的安全问题,并要求他们立即采取行动。

钓鱼邮件内容示例

主题: 紧急:您的银行账户需要立即验证!亲爱的客户,我们检测到您的账户可能存在异常活动。为了确保您的账户安全,请立即点击下面的链接进行验证。[立即验证账户] (http://malicious-site.example)如果您最近没有尝试过任何更改,请尽快执行此操作以保护您的账户。感谢您对我们服务的支持。祝好,
Bank Example 客户服务团队

CSRF攻击向量(恶意网站中的HTML/JavaScript)

<html><body onload="document.getElementById('csrfForm').submit()"><form id="csrfForm" action="https://bank.example.com/updateprofile.php" method="POST"><input type="hidden" name="email" value="attacker@example.com" /><input type="hidden" name="passhint" value="What is the capital of France?" /><!-- 其他需要修改的字段 --></form><p>请稍候,正在验证您的账户...</p></body>
</html>

在这个例子中,当受害者点击了钓鱼邮件中的链接并访问了恶意网站时,页面会自动加载并提交一个指向银行服务器的表单请求。如果受害者在同一浏览器中已经登录到了真正的银行网站,那么这个请求将会携带有效的会话Cookie,从而导致银行服务器认为这是一个合法的请求,并按照提供的数据更新受害者的账户信息。

三、靶场实验

这次实验使用OWASP发行的Broken Web Application进行演示。

https://sourceforge.net/projects/owaspbwa/

点击下载,在vmware中打开虚拟机文件即可。

在浏览器访问提示的网址

选择GETBOO

点击右上角的"Log In",使用user,user登录

点击右上角的“Settings”

选择“Modify account information”功能,这里可以修改用户邮箱

开启bp抓包之后,点击"Updates",可以看到需要修改的邮箱账号

右键利用工具生成POC

修改需要绑定的邮箱,这里改为“kimjiwon”

复制生成的HTML,在桌面新建一个HTML文件,放进去

使用你打开靶场的浏览器打开(不同浏览器无法利用cookie),这个页面相当于恶意网站

点击按钮,发现无意中发送了修改邮箱的请求

到此,攻击者已经实现攻击目的了,在受害者没有察觉的情况下修改了邮箱。利用这种手段,攻击者可以执行其他操作如修改密码等。

四、防御措施

1. 使用CSRF令牌

  • 生成唯一的CSRF令牌:对于每个用户会话或表单提交,服务器应该生成一个独一无二的、不可预测的CSRF令牌。
  • 将令牌嵌入到表单中:这个令牌作为一个隐藏字段包含在每个需要保护的HTML表单中。
  • 验证令牌:当接收到来自客户端的POST请求时,服务器必须检查该请求是否包含了正确的CSRF令牌,并且它与当前用户的会话相匹配。如果不匹配,则拒绝处理该请求。

2. 设置SameSite Cookies属性

  • 启用SameSite属性:通过设置Cookies的SameSite属性为StrictLax,可以限制Cookies只在同站请求中发送。这有效地阻止了大多数类型的CSRF攻击,因为跨站请求不会附带敏感的认证信息。
    • SameSite=Strict:Cookies仅在直接导航(如用户手动输入URL或点击书签)时才会被发送。
    • SameSite=Lax:允许某些跨站顶级导航请求(如GET请求)发送Cookies,但禁止通过iframe等嵌入式上下文中的跨站请求发送Cookies。

3. 检查Referer和Origin头部

  • 验证来源:检查refer是否是第三方网站发起的。尽管不是最可靠的防御机制,因为refer的内容可以被修改,但检查HTTP请求中的RefererOrigin头部可以帮助识别潜在的CSRF攻击。合法请求通常会有正确的来源信息,而恶意请求可能会缺少或有不匹配的来源信息。

4. 使用框架内置的CSRF防护功能

  • 利用现有工具:许多现代Web开发框架(如Django、Rails、ASP.NET Core等)都内置了CSRF防护功能。确保正确配置并使用这些框架提供的安全特性。

5. 实现基于用户交互的二次确认

  • 增加额外步骤:对于特别敏感的操作,比如更改密码或电子邮件地址,要求用户提供额外的验证信息,如重新输入密码或通过短信验证码进行二次确认。


http://www.ppmy.cn/embedded/156249.html

相关文章

html、js、css实现爱心效果

好的&#xff01;我们可以进一步美化这个爱心效果&#xff0c;增加更多动态和视觉吸引力。以下是改进后的代码&#xff0c;包括以下功能&#xff1a; 1. 背景渐变&#xff1a;添加动态背景渐变效果。 2. 爱心阴影&#xff1a;为爱心添加阴影&#xff0c;使其更具立体感。 3. 随…

springboot使用Redis发布订阅(Pub/Sub)实战

一、基本介绍 Redis 发布/订阅是一种消息传模式&#xff0c;其中发送者发送消息&#xff0c;而接收者&#xff08;订阅者&#xff09;接收消息。传递消息的通道称为channel。 例如下图的工流程&#xff0c;当有新消息通过 PUBLISH 命令发送给频道 channel1 时&#xff0c; 这…

博客之星2024年度总评选—我的技术总结之旅

在踏入2024年的尾声之际&#xff0c;回望过去一年的技术探索与实践&#xff0c;心中充满了感慨与收获。作为一名技术博主&#xff0c;我深知持续学习与分享的重要性&#xff0c;因此&#xff0c;本次我选择以“技术总结类”为主题&#xff0c;来盘点我在特定技术领域——人工智…

顺序表和链表(详解)

线性表 线性表&#xff08; linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构&#xff0c;也就说是连续的一条直线。…

c++面试题,请使用STL的std::remove_if算法删除std::vector<int>容器中大于5的数字

请使用STL的std::remove_if算法删除std::vector容器中大于5的数字 在C 中&#xff0c; std::remove_if 算法并不会真正从容器中删除元素&#xff0c; 而是将满足条件的元素移动到容器末尾&#xff0c;并返回一个指向新的逻辑结束位置的迭代器。 你需要使用容器的 erase 成员函…

激光雷达和相机早期融合

通过外参和内参的标定将激光雷达的点云投影到图像上。 • 传感器标定 首先需要对激光雷达和相机&#xff08;用于获取 2D 图像&#xff09;进行外参和内参标定。这是为了确定激光雷达坐标系和相机坐标系之间的转换关系&#xff0c;包括旋转和平移。通常采用棋盘格等标定工具&…

[CTF/网络安全] 攻防世界 Web_php_unserialize 解题详析

代码审计 这段代码首先定义了一个名为 Demo 的类&#xff0c;包含了一个私有变量 $file 和三个魔术方法 __construct()、__destruct() 和 __wakeup()。其中&#xff1a; __construce()方法用于初始化 $file 变量__destruce方法用于输出文件内容__wakeup() 方法检查当前对象的…

SQLmap 注入 -04-cookies

1: firefox 先下载cookies 插件: 点击" 附加组件管理器", 然后进去输入cookies, 搜索&#xff0c; 下面这个安装的是 cookie Quick manager 下面看一下&#xff1a; 2下面进行测试: 注意&#xff1a; PHPSESSID 后面是 下面是例子: 上面运行的结果: 好&#xff…