CSRF漏洞
介绍:
CSRF(Cross-Site Request Forgery),中文名称:跨站请求伪造,是一种劫持用户在当前已登录的Web应用程序上执行非本意操作一种攻击.
原理:攻击者利用目标用户的身份,执行某些非法的操作 跨站点的请求:请求的来源可以是非本站 请求是伪造的:请求的发出不是用户的本意。
攻击者先让受害者登录一个需要权限验证的网站,当用户完成验证后,权限凭证会被保存到本地,下次发送请求时会一同发送到服务器作为验证信息。然后诱导受害者打开一个攻击者编写的恶意网站,这个恶意网站会发送相关请求去执行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品),利用受害者之前保存的权限凭证,绕过服务端验证,从而完成攻击。这利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。
危害
以用户的名义发邮件/发消息
转换/购买商品等;
修改密码;
删除文章等
CSRF攻击过程
满足了上面的必要条件才可以触发
当用户已经登录成功了一个网站
然后通过被诱导进了第三方网站「钓鱼网站」
跳转过去了自动提交表单,冒用受害者信息
后台则正常走逻辑将用户提交的表单信息进行处理
CSRF漏洞产生得原因:
http协议使用session在服务端保存用户个人信息,客户端浏览器用cookie标识用户身份
cookie的认证只能确保是某个用户发送的请求,但不能保证该请求是否为自愿行为
用户如果登录某个web站点,同时点击了包含CSRF恶意代码的URL,就会触发CSRF
漏洞利用条件:
用户必须登录网站A生成cookie
登录的同时访问了恶意URL
CSRF攻击类型:
GET类型:仅需一个HTTP请求
<img src="http://a.com/withdraw?amount=10000&for=hacker" >
在受害者访问含有img页面后,浏览器会自动向a.com发出一次请求
POST类型
这种类型的CSRF利用通常使用一个自动提交的表单:
<form action="http://a.com/withdraw" method=POST>
<input type="hidden" name="account" value="airing" />
<input type="hidden" name="amount" value="10000" />
<input type="hidden" name="for" value="hacker" />
</form>
<script> document.forms[0].submit(); </script>
访问该页面后,表单会自动提交,相当于模拟用户完成了一次 POST 操作。可见这种类型的 CSRF 与第一种一样,都是模拟请求,所以后端接口也不能将安全寄托在仅允许 POST 请求上。
链接类型
比起其他两种用户打开页面就中招的情况,这种需要用户点击链接才会触发,但本质上与前两种一样。这种类型通常是在论坛中发布的图片中嵌入恶意链接,或者以广告的形式诱导用户中招,攻击者通常会以比较夸张的词语诱骗用户点击,例如:
<a href="http://a.com/withdraw.php?amount=1000&for=hacker" taget="_blank">
点击就送,888代金券
<a/>
XSS和CSRF的区别:
xss攻击遵顼双向攻击模式,允许攻击者执行恶意脚本、访问响应,并将后续敏感数据发送给攻击者。
csrf攻击是一种单向攻击机制,攻击者只能发送http请求,但不能检索已发请求的响应
csrf攻击要求经过身份验证的用户处于活动会话中,而xss不需要,在xss中,只要用户登录,就可以存储和交付有效载荷
csrf攻击范围有限,仅限于用户可执行的操作,例如点击恶意链接或访问hacker的网站,xss提供执行恶意脚本来执行攻击者所选择的任何活动,扩大攻击范围
CSRF防御思路
验证Referer字段
请求地址中添加token并验证
Samesite Cookie
双重Cookie验证
当前用户打开其他用户填写的链接时,需告知风险(知乎跳转外链,等等都会告知风险)。