CSRF漏洞
内容为学习笔记,如有侵权,联系删除
CSRF漏洞之原理
案例:在某个网站查询余额过程中点击了网站内的窗口内链接(窗口是第三方网站一般是什么黄色链接吸引人的内容),但是实际并不是跳转到其他网站,而是在第三发起了一个本网站转账的请求(http://eg.com/index.php?nameid=1102&balance=1000 //这种链接就是向1102的用户转账100元),由于在登陆时网站保存了Cookie和session有效,所以第三方网站所有的请求本网站请求都是携带cookie和session,服务器认为是该账户的操作,导致该用户点击后在自己不知情的情况下以自己的身份将自己的钱转给了其他人。
Cross-Site Request Forgery:跨站请求伪造:攻击者通过引诱用户访问恶意网站,在用户不知情的情况下利用其已登录的身份在目标网站上执行非授权操作。
CSRF漏洞之危害
- 修改账户信息,修改绑定的手机号或者邮箱
- 利用管理员账号,上传木马文件
- 传播蠕虫病毒(点击、传播、点击……)
- 和其他攻击手段配合,实现攻击,比如XSS
CSRF漏洞之与XSS漏洞的区别
- 有没有第三方的网站,csrf存在第三方网站请求
- 能不能获取到明文cookie,csrf漏洞需获取到明文cookie
- 是否需要注入代码到别人的网站,XSS需要代码注入网站,而csrf只需要一个可跳转的接口
CSRF之与注入标签payload
<img src="http://superbank.com/bank/transfer.php?nameid=2002&balance=1000"width="0" height="0">
<a href="http://superbank.com/transfer.php?amount=1000&to=jiangang" taget="_blank">小姐姐在线视频聊天!!<a/>
<form action="http://bank.example/withdraw" method=POST>
<input type="hidden" name="account"value="xiaoming" />
<input type="hidden" name="amount"value="1000" />
<input type="hidden" name="to" value="jiangang" />
</form>
<script> document.forms[0].submit(); </script>
CSRF漏洞之漏洞挖掘
如何测试一个接口是否存在csrf漏洞,可以使用burp suite抓包后右键Send To,Enagement tools ,Generate CSRF PoC
也可以使用自动化工具:https://github.com/s0md3v/Bolt
还有各种云产品可以检测
CSRF漏洞之防御
-
代码中添加Referer头校验,Referer是引用页; 引荐; 来源页面
作用:跟踪来源,比如访问统计、广告效果
检查REFERER(referer里面是否包含了主机名(IP或域名)
if(stipos($_SERVER['HTTP_REFERER'],$_SERVER['SERVER_NAME']!=false)){ ...... }
缺点是referer可以抓包修改,我们只需要抓包把referver修改为原网站的头就可以绕过;还可以为空
-
在请求中加入一些随机字段(第三方不知道也猜不出来),让第三方网站无法伪造请求;token
-
用户使用用户名密码登录,服务端下发一个随机的token字段给客户端,并且服务端把这个字段保存在session中
session_start(); if(empty($_SESSION['token'])){ $_SESSION['token']=bin2hex(random_bytes(32)); } $token=$_SESSION['token'];
-
客户端把这个token保存起来,放到隐藏字段。
-
用户在登陆状态下,在之后访问的时候,都要携带这个token字段。
-
服务端从session中拿出token值进行对比,如果一致,说明请求合法。
if(!empty($_POST['token'])){ if(hash_equals($_SESSION['token'],$_POST['token'])){ //执行业务逻辑 }else{ //... } }
-
用户退出,session销毁,token失效。
缺点是仍可以配合xss漏洞等获取到token值
-
-
二次验证
比如修改密码界面,可以使用输入原密码进行验证,还有其他操作接口界面可以使用短信验证码,手机扫描验证,人脸识别,图片验证,如谷歌浏览器内防止机器操作的人机识别;
-
浏览器保护措施(火狐没有)
在谷歌浏览器内有一个Referrer Policy的设置,高版本默认设置是strict-origin-when-cross-origin,发现跨站请求则会把请求参数删去,这是在浏览器层面保护措施