【CSRF】跨站请求伪造

攻击原理​

​① 用户访问网站​​:用户正常登录目标网站(如银行网站)。

​② 返回Cookie​​:网站验证通过后,向用户的浏览器返回一个包含会话标识的Cookie。此后,浏览器发往该站的所有请求都会自动携带此Cookie。

​③ 点击攻击链接​​:用户被诱骗(通过邮件、聊天、恶意广告等)访问了黑客构造的恶意页面。

​④ 发送包含恶意请求的网页​ ​:用户的浏览器加载了这个恶意页面。该页面中隐藏着一段自动提交的代码(如表单或脚本),指向目标网站的敏感操作接口(如 bank.com/transfer?to=hacker&amount=1000)。

​⑤ 利用cookie,请求服务器​ ​:浏览器在向目标网站发起这个恶意请求时,​​会自动带上第②步中存储的合法Cookie​​。服务器收到请求后,验证Cookie有效,便认为是用户本人的合法操作,从而成功执行了转账。

​核心要点

​ 攻击者完全不需要窃取你的Cookie,他只是​​利用浏览器自动发送Cookie的机制,借用了你的合法身份​​。

​攻击必要条件​​:用户已登录受信任的网站A,并且会话(Cookie)尚未过期。用户被诱骗访问了恶意网站B。

攻击场景举例

假设某银行网站A的转账接口非常简单,且使用GET请求:

用户登录了银行网站A,cookie有效。用户随后访问了恶意网站B。网站B的页面中隐藏着一句代码:<img src="http://bank-a.com/transfer?to=attacker&amount=1000">。用户的浏览器在加载该图片时,会自动携带上银行网站A的cookie去向这个地址发起GET请求。银行服务器验证cookie有效,认为这是用户的合法操作,便成功执行了转账。

主要的防护措施

  1. ​使用CSRF Token​​(最有效的方法):在用户会话中生成一个随机的、不可预测的Token(令牌)。在提交敏感请求(如表单)时,要求必须带上这个Token(通常放在表单的隐藏域中)。服务器处理请求前,校验Token的有效性。由于恶意网站B无法知道这个Token的值,因此无法伪造请求。

  2. ​验证请求来源(Referer Header)​ ​:服务器检查请求头中的 Referer字段,判断请求是否来自合法的源(自己的网站域名)。此方法依赖于浏览器发送的Referer信息,有时可能因隐私设置而被禁用或篡改,可作为辅助手段。

  3. ​使用SameSite Cookie属性​ ​:在设置Cookie时,可以加上 SameSite属性(如 SameSite=StrictSameSite=Lax)。这可以告诉浏览器,在跨站请求(即从B站发向A站的请求)时,不应自动发送此类Cookie,从而从源头上切断了CSRF攻击的凭证。

xss与csrf对比

特性 ​XSS (跨站脚本攻击)​ ​CSRF (跨站请求伪造)​
​攻击目标​ ​用户的数据和安全​​(窃取Cookie、会话,盗用身份) ​网站的业务功能​​(以用户身份执行非意愿操作,如转账、改密)
​信任关系​ 利用​​用户对网站的信任​ 利用​​网站对用户浏览器的信任​
​攻击方式​ 向网页中​​注入恶意脚本​ 伪造一个​​合法的请求​
​所需条件​ 网站存在输入漏洞,未对用户输入进行过滤 用户已登录目标网站且会话未过期

CSRF检测思路与方法

检测CSRF漏洞的核心思想是:​​验证一个已认证的请求是否可以被另一个源(网站)重复发送并成功执行。

​第一步:抓包​

使用 Burp Suite、OWASP ZAP 等代理工具,拦截浏览器发送至目标网站的​​正常请求​​(例如,一个修改邮箱或转账的HTTP请求)。这里用Burp Suite演示。登录网址按确定,开启抓包

第二步:重放请求​

工具重放​​:使用Burp Suite的 "Engager" 工具生成一个POC HTML文件,在浏览器中打开该文件以模拟"从另一个网站发起请求"的场景。

将抓到的这个请求数据包​​原封不动地​​在另一个上下文环境中重新发送。

新页面打开浏览器能看到已经转账成功

手动重放​​:直接将请求的URL(GET请求)或表单代码(POST请求)复制到一个完全无关的HTML文件中,并在浏览器中打开这个文件。

成功利用的标志​​:如果这个从"第三方"页面发出的请求​​依然被目标网站服务器接受并成功执行​​,那么就存在CSRF漏洞。

CSRF常用Payload

Payload是攻击者构造的恶意页面代码。

1. 利用 <img>标签(自动发起GET请求)

<img src="http://bank.com/transfer?to=hacker&amount=1000" width="0" height="0">

  • ​原理​ ​:浏览器会尝试加载src属性中的资源(图片),从而向该地址发起一个​​GET请求​​。将宽高设为0可以使其隐藏。

  • ​特点​ ​:​​无需用户交互​​,只要页面一加载,请求就会自动发出。适用于攻击由GET请求触发的敏感操作。

2. 利用 <a>标签(诱导点击的GET请求)

<a href="http://bank.com/transfer?amount=1000&to=hacker"> 点击领取优惠券! <!-- 用诱惑性文字诱骗用户点击 --> </a>

  • ​原理​ ​:需要​​用户交互​​(点击链接)。点击后,浏览器会向链接地址发起GET请求。

  • ​特点​​:利用社会工程学,伪装成正常链接,欺骗用户主动触发。

3. 利用隐藏的 <form>表单(自动提交POST请求)

<form action="http://bank.com/transfer" method="POST">
<input type="hidden" name="account" value="xiaoming">
<input type="hidden" name="amount" value="1000">
<input type="hidden" name="to" value="hacker">
`

</form>` ` <script> document.forms[0].submit(); </script> `
  • ​原理​ ​:构建一个隐藏的表单,包含所有必要的参数(通过<input type="hidden">),并使用JavaScript在页面加载后​​自动提交​​这个表单。

  • ​特点​ ​:这是​​功能最强大​ ​的Payload,可以伪造​​POST请求​ ​(比GET请求更常见),并且也​​无需用户交互​​。绝大多数CSRF攻击都采用此种方式。

​防御

作为开发者,绝不能依赖请求来源(Referer)或认为POST请求就是安全的。最有效的方法是:

  • ​使用CSRF Token​​:为每个用户会话生成一个随机、不可预测的Token,并将其嵌入表单中。服务器在处理请求时,必须验证该Token的有效性。

  • ​设置SameSite Cookie属性​ ​:将认证用的Cookie设置为 SameSite=StrictSameSite=Lax,可以阻止浏览器在跨站请求中自动发送Cookie,从根源上 mitigating CSRF攻击。

  • 声明:本篇内容基于网络安全知识体系,所学用途皆不可用于法律之外的攻击与入侵

    感谢大家的观看,小编呆呆羊在这里与大家共同学习共同成长。

相关推荐
折翼的恶魔2 小时前
HTML基本标签二:
前端·html
我是日安3 小时前
零到一打造 Vue3 响应式系统 Day 16 - 性能处理:LinkPool
前端·vue.js
一树山茶3 小时前
uniapp的双token
前端·javascript
正义的大古3 小时前
OpenLayers地图交互 -- 章节六:范围交互详解
前端·javascript·vue.js·openlayers
猫耳君3 小时前
汽车网络安全 CyberSecurity ISO/SAE 21434 测试之三
安全·web安全·网络安全·汽车·测试·cyber·cybersecurity
訾博ZiBo3 小时前
【文本朗读小工具】- 快速、免费的智能语音合成工具
前端
天蓝色的鱼鱼3 小时前
低代码是“未来”还是“骗局”?前端开发者有话说
前端
答案answer4 小时前
three.js着色器(Shader)实现数字孪生项目中常见的特效
前端·three.js
城管不管4 小时前
SpringBoot与反射
java·开发语言·前端