2022-03-05 04:52:04
CSRF漏洞原理CSRF(跨站请求伪造)利用受害者已登录的身份认证信息(如Cookie、Session),诱导其访问恶意页面或点击链接,在用户无感知的情况下以受害者身份向目标服务器发送非法请求,完成攻击者预设的操作(如转账、修改密码等)。其核心原理基于浏览器自动携带身份凭证的机制,具体流程如下:
1. 攻击流程分解用户登录合法网站A用户通过浏览器访问受信任的网站A(如银行),输入账号密码完成身份验证。服务器返回一个包含身份标识的Cookie(如session_id),浏览器后续访问A网站时会自动携带此Cookie。
用户未退出网站A,访问恶意网站B用户在保持网站A登录状态的情况下,被诱导访问恶意网站B(如通过钓鱼链接、广告跳转等)。此时浏览器中仍存有网站A的有效Cookie。
恶意网站B发起伪造请求网站B的页面中包含恶意代码(如隐藏的<img>或<form>标签),其请求指向网站A的敏感接口(如转账接口)。例如:
<img src="或通过JavaScript自动提交表单:
<form action="浏览器自动携带Cookie发送请求浏览器在处理恶意代码时,会自动携带网站A的Cookie(因同源策略不限制跨站请求携带Cookie),向网站A发送请求。网站A的服务器无法区分请求是用户主动操作还是恶意伪造,仅根据Cookie验证身份后执行操作(如完成转账或修改密码)。
身份凭证的自动携带浏览器对跨站请求的Cookie处理机制是CSRF漏洞的核心。即使请求来自其他网站(如B),只要目标域名(如A)的Cookie未过期,浏览器就会自动附加。
用户无感知攻击通过隐藏的HTML元素或JavaScript实现,用户无需主动点击或输入,甚至可能完全不知情。
服务器信任Cookie服务器仅依赖Cookie验证身份,未对请求的来源(Referer头)或一次性令牌(Token)进行校验,导致伪造请求被当作合法请求处理。
同步令牌(CSRF Token)服务器在表单中生成随机Token,要求客户端提交时携带该Token,并验证其有效性。由于恶意网站无法获取Token,伪造请求会被拦截。
验证Referer头检查请求的来源是否为合法域名(如仅允许bank.com的请求),但可能被绕过(如用户禁用Referer)。
SameSite Cookie属性设置Cookie的SameSite=Strict或Lax,限制跨站请求时Cookie的发送(但可能影响部分合法跨站功能)。
用户操作确认对敏感操作(如转账)增加二次验证(短信验证码、密码输入等)。
2017年,某知名论坛因CSRF漏洞导致用户被恶意关注其他账号。攻击者诱导用户访问恶意页面,页面自动提交关注请求,论坛服务器仅验证Cookie而未校验Token,导致大量用户中招。
总结:CSRF漏洞的本质是身份验证的滥用,攻击者利用浏览器自动携带Cookie的特性,伪造用户请求。防御需结合Token、SameSite Cookie及请求来源校验等多层机制。