CSRF

CSRF概念:

CSRF跨站点请求伪造(Cross—Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,你可以这样来理解:
攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等。
由于目标站无 token 或 referer 防御,导致用户的敏感操作的每一个参数都可以被攻击者获知,攻击者即可以伪造一个完全一样的请求以用户的身份达到恶意目的。
例子:让你访问http://passport.bilibili.com/login/exit/,你的b站登陆就下掉了。然后我伪装一下,伪装成一个黄色网站诱导你进来,网址也换一个让你转账的网址。这就进行了csrf攻击。

GET类型的CSRF
这种类型的CSRF一般是由于程序员安全意识不强造成的。GET类型的CSRF利用非常简单,只需要一个HTTP请求,所以,一般会这样利用:

<img src=http://wooyun.org/csrf?xx=11 />

在访问含有这个img的页面后,成功向http://wooyun.org/csrf?xx=11 发出了一次HTTP请求。

所以,如果将该网址替换为存在GET型CSRF的地址,就能完成攻击了。

POST类型的CSRF
这种类型的CSRF危害没有GET型的大,利用起来通常使用的是一个自动提交的表单,如:

<form action=http://wooyun.org/csrf.php method=POST>
<input type="text" name="xx" value="11" />
</form>
<script> document.forms[0].submit(); </script>

访问该页面后,表单会自动提交,相当于模拟用户完成了一次POST操作。

防御方法

验证码¶
验证码强制用户必须与应用进行交互,才能完成最终请求。

Referer Check¶
检查请求是否来自合法的源。但服务器并非什么时候都能取得 Referer。

Token¶
CSRF 能够攻击成功的本质原因是重要操作的所有参数都可以被攻击者猜测得到。

保持原参数不变,新增一个参数 Token,值是随机的,在实际应用中,Token 可以放在用户的 Session 中,或浏览器的 Cookies 中。

Token 一定要足够随机。此外,Token 的目的不是为了防止重复提交,所以为了使用方便,可以允许在一个用户的有效生命周期内,在 Token 消耗掉之前都使用同一个 Token,但如果用户已经提交了表单,则这个 Token 已经消耗掉,应该重新生成 Token。

Token 还应注意其保密性,如果 Token 出现在 URL 中,则可能会通过 Referer 泄露,应尽量把 Token 放在表单中,把敏感操作由 GET 改为 POST,以表单或 AJAX 的形式提交,避免 Token 泄露。

Q:token和referer做横向对比,谁安全等级高?

A:token安全等级更高,因为并不是任何服务器都可以取得referer,如果从HTTPS跳到HTTP,也不会发送referer。并且FLASH一些版本中可以自定义referer。但是token的话,要保证其足够随机且不可泄露。(不可预测性原则)

Q:对referer的验证,从什么角度去做?如果做,怎么杜绝问题

A:对header中的referer的验证,一个是空referer,一个是referer过滤或者检测不完善。为了杜绝这种问题,在验证的白名单中,正则规则应当写完善。

Q:针对token,对token测试会注意哪方面内容,会对token的哪方面进行测试?

A:针对token的攻击,一是对它本身的攻击,重放测试一次性、分析加密规则、校验方式是否正确等,二是结合信息泄露漏洞对它的获取,结合着发起组合攻击。
信息泄露有可能是缓存、日志、get,也有可能是利用跨站,很多跳转登录的都依赖token,有一个跳转漏洞加反射型跨站就可以组合成登录劫持了,另外也可以结合着其它业务来描述token的安全性及设计不好怎么被绕过比如抢红包业务之类的

原文地址:https://www.cnblogs.com/vstar-o/p/13823799.html