CSRF漏洞概述
Cross-site request forgery简称为“CSRF”。 在CSRF的攻击场景中攻击者通过伪造用户的请求,使用户在不知情的情况下执行恶意操作。(这个请求一般是一个链接),然后欺骗目标用户进行点击,用户一旦点击了这个请求,整个攻击也就完成了。所以CSRF攻击也被称为为"one click"攻击。
攻击过程
-
用户登录受信任的网站A,并在该网站上获取一个认证凭证(如Cookie)。
-
用户在不登出网站A的情况下,访问恶意网站B。
-
恶意网站B中的恶意代码会自动向受信任网站A发送请求,其中包含了用户在网站A上的认证凭证。
-
受信任网站A接收到请求后,由于认证凭证的存在,会误以为是用户的合法请求,并执行相应的操作,如修改密码、发表言论等。
攻击利用受害者在被攻击网站的登录凭证,冒充受害者提交操作;而不是直接窃取数据,整个过程攻击者并不能获取到受害者的登录凭证,仅仅是“冒用”。
攻击手段:
-
链接欺骗:攻击者通过诱导用户点击恶意链接来触发CSRF攻击。
-
图片欺骗:攻击者将恶意请求嵌入到图片中,当用户浏览网页时,图片会自动向受信任网站发送请求。
-
Flash欺骗:攻击者通过Flash应用程序发送恶意请求,利用Flash的跨域特性绕过浏览器的同源策略。
-
自动提交表单:攻击者通过自动提交表单的方式来触发CSRF攻击
以下是一些常见的CSRF攻击手段的示例代码:
-
链接欺骗:
<!-- 恶意链接 --> <a href="http://victim.com/transfer?amount=1000">点击领取奖励</a>
-
图片欺骗:
<!-- 恶意图片 --> <img src="http://victim.com/transfer?amount=1000" alt="恶意图片">
-
Flash欺骗:
<!-- 恶意Flash应用程序 --> <embed src="http://victim.com/transfer?amount=1000">
-
自动提交表单:
<!-- 自动提交表单 --> <form action="http://victim.com/transfer" method="POST"> <input type="hidden" name="amount" value="1000"> <input type="submit" value="点击领取奖励"> </form> <script> document.forms[0].submit(); </script>
-
CSRF与XSS的区别
如果小黑事先在x网的首页如果发现了一个XSS漏洞,则小黑可能会这样做:1,欺骗lucy访问埋伏了XSS脚本(盗取cookie的脚本)的页面;如果小黑事先在x网的首页如果发现了一个xss漏洞,则小黑可能会这样做:
-
欺骗Lucy访问埋伏了脚本(盗取Cookie的脚本)的页面;
-
lucy中招,小黑盗取到到lucy的cookie ;露西中招,小黑盗取到到露西的Cookie;
-
小黑顺利登录到lucy的后台,小黑自己修改lucy的相关信息;小黑顺利登录到露西的后台,小黑自己修改露西的相关信息;
所以跟上面比一下,就可以看出CSRF与XSS的区别:所以跟上面比一下,就可以看出csrf与xss的区别: CSRF是借用户的权限完成攻击,攻击者并没有拿到用户的权限,而XSS是直接盗取到了用户的权限,然后实施破坏
如何确认一个web系统存在CSRF漏洞
-
对目标网站增删改的地方进行标记,并观察其逻辑,判断请求是否可以被伪造---比如修改管理员账号时,并不需要验证旧密码,导致请求容易被伪造;
比如对于敏感信息的修改并没有使用安全的token验证,导致请求容易被伪造;
-
确认凭证的有效期(这个问题会提高CSRF被利用的概率)
虽然退出或者关闭了浏览器,但cookie仍然有效,或者session并没有及时过期,导致CSRF攻击变的简单
变种攻击总结:
-
双重CSRF攻击:攻击者通过在恶意网站中嵌入一个隐藏的iframe,该iframe会加载一个受信任网站的页面,从而在用户不知情的情况下进行CSRF攻击。
-
JSONP劫持:攻击者通过劫持受信任网站的JSONP请求,将恶意代码注入到响应中,从而实现CSRF攻击。
-
CSRF利用GET请求:通常CSRF攻击利用的是POST请求,但也可以利用GET请求进行攻击,只需将恶意请求的参数放在URL中即可。
-
CSRF利用AJAX请求:攻击者可以通过AJAX请求发送恶意请求,利用浏览器的同源策略,将请求发送到受信任网站上。
防御CSRF漏洞的措施
-
使用CSRF令牌:在每个表单或请求中添加一个随机生成的CSRF令牌,验证请求是否合法。
-
验证来源:服务器端对请求的来源进行验证,只接受来自受信任网站的请求。
-
同源检测:浏览器端通过检测请求的来源是否与当前页面的域名一致来防止CSRF攻击。
-
防止跨域请求:限制网站对外的接口,防止其他域名的请求访问敏感接口。
-
限制敏感操作:对于一些敏感操作,如修改密码、删除账号等,要求用户进行额外的身份验证,如输入密码、短信验证码等。
参考文章
web 安全问题(一):CSRF 攻击 - dosir - 博客园 (cnblogs.com)
前端安全之 CSRF 攻击原理和防护方法 - 掘金 (juejin.cn)