攻击原理
① 用户访问网站:用户正常登录目标网站(如银行网站)。
② 返回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有效,认为这是用户的合法操作,便成功执行了转账。
主要的防护措施
-
使用CSRF Token(最有效的方法):在用户会话中生成一个随机的、不可预测的Token(令牌)。在提交敏感请求(如表单)时,要求必须带上这个Token(通常放在表单的隐藏域中)。服务器处理请求前,校验Token的有效性。由于恶意网站B无法知道这个Token的值,因此无法伪造请求。
-
验证请求来源(Referer Header) :服务器检查请求头中的
Referer
字段,判断请求是否来自合法的源(自己的网站域名)。此方法依赖于浏览器发送的Referer信息,有时可能因隐私设置而被禁用或篡改,可作为辅助手段。 -
使用SameSite Cookie属性 :在设置Cookie时,可以加上
SameSite
属性(如SameSite=Strict
或SameSite=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>` ` <script> document.forms[0].submit(); </script> `
<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">
`
-
原理 :构建一个隐藏的表单,包含所有必要的参数(通过
<input type="hidden">
),并使用JavaScript在页面加载后自动提交这个表单。 -
特点 :这是功能最强大 的Payload,可以伪造POST请求 (比GET请求更常见),并且也无需用户交互。绝大多数CSRF攻击都采用此种方式。
防御
作为开发者,绝不能依赖请求来源(Referer)或认为POST请求就是安全的。最有效的方法是:
-
使用CSRF Token:为每个用户会话生成一个随机、不可预测的Token,并将其嵌入表单中。服务器在处理请求时,必须验证该Token的有效性。
-
设置SameSite Cookie属性 :将认证用的Cookie设置为
SameSite=Strict
或SameSite=Lax
,可以阻止浏览器在跨站请求中自动发送Cookie,从根源上 mitigating CSRF攻击。 -
声明:本篇内容基于网络安全知识体系,所学用途皆不可用于法律之外的攻击与入侵
感谢大家的观看,小编呆呆羊在这里与大家共同学习共同成长。