csrf首先需要明确,CSRF指的是Cross Site Request Forgery,而很多时候会有人把CSRF与XSRF混淆,这里说明一下,XSRF是XSS & CSRF的合写,也就是借助XSS(Cross Site Scripts)漏洞,结合CSRF利用。正文会详细解释。
在此声明,如果文章里有说的不对的,请各位看官耐心指教,勿喷。
一、CSRF的本质及原因
应用的重要操作页面的所有参数都可预测。 即URL请求易被攻击者伪造,且利用cookies等登录状态,以达到无需获取用户权限,就可以伪造用户请求,对用户数据进行操作的目的。(在用户不知情的情况下,利用用户身份,提交用户请求。)
二、如何测试CSRF
对于目标站点,对一个操作进行猜测,构造一个对应用有修改操作(信息修改,帖子删除等)的请求URL(比如放在img的src里面),然后放在非此站点的站点下,然后在自己登录了此站点后(保证有了登陆态),访问放置伪造请求的站点,回到此站点,观察对应用的修改操作是否完成。如果完成,则证明有CSRF漏洞。
三、如何利用CSRF
实际上,CSRF攻击,指的是利用用户的登录态,伪造一个用户不知情的请求,在用户不知情的情况下,达到请求发起成功的效果。即:利用了网站应用对请求发起合法性的检查,本质上是无需获取用户权限,就可以模拟用户进行操作。
主要原因是,一般的网站应用对http请求的验证是,session和cookie机制,因为cookies会默认随着请求一起发送,所以一旦用户登录了某个站点,随后只要cookie不过期,或者浏览器不关闭,那么再次的请求都会携带着发送cookies验证信息。当用户在浏览器中点击了黑客伪造的链接时,同样的cookies会随着这个请求被发送到后台,后台验证身份:即cookies正确,则执行请求操作,从而,完成了一次CSRF攻击。
四、写POC验证页面是否有CSRF
这里需要注意的是,CSRF的存在前提是应用的修改操作对用户的身份有验证,如果不存在验证也就不存在CSRF了。当然,现在的网站应用应该都对重要操作有身份验证即权限要求。而被测网址一般情况下也是直接访问修改操作页面就会提示没有权限或者直接跳转到登录页面,所以一般需要先登录进去,才能进一步进行漏洞验证。
而且需要注意的是,可能修改操作页面有许多form,必须要考虑这样的情况。
当对某个form进行检测时,需要判断此form里是否有类似“token”的字样,form提交的action(没有action属性,则action提交到自身页面)有没有类似“修改”的字样。
还应判断,该form是否为登录注册的form,这样的form,里面也无需token,但是不存在CSRF漏洞。
总之,CSRF漏洞的发起需要满足3个条件:
1. 请求操作需要有身份验证
2. form表单除了cookie验证没有其他验证
3. 非注册,登录等操作,即修改信息的(注意这里的"修改")
五、如何防御CSRF
一、从开发者的角度来说,一个应用如何避免CSRF,应该有以下做法:
- 首先,尽量对修改应用的请求用post方式,也就是用form,这样黑客在浏览器的URL里就看不到具体参数,想要获取也必须抓包,增加了攻击难度。
- 其次,在多用form的前提下:利用Token,这是个附加的身份验证信息,一般会在form里的存在形式是: 一个input框,类型是hidden,比如:
<input type="hidden" value="513e45fd8d2sd" name="_tb_token">
这里的token值是从后端返回的,由后台生成,返回前台,一个安全策略是每一个请求的token都不一样, 每次请求都会发送token值,后台收到请求,不仅会比较cookies,还会比较token值,如果token值与后台(Session或者客户端cookie中)token值不相符,而且token值也没有过期,则证明此请求合法;这时,如果还有黑客想要攻击此应用,伪造请求,但他不能知道form里的token值,伪造的请求里没有此token,则请求不会得到正常响应,请求的操作也不会被执行。
当然,如果token放在cookie中,而不是服务端的session中,则会有一个问题,如果页面存在XSS漏洞,那么攻击者完全可以利用XSS将用户客户端的cookie截取后,读取其中的token,然后利用CSRF攻击。这种方式被称为XSRF,以和CSRF区分。
这里需要明白:csrf_token应该作为一个秘密,只能被服务器和用户知晓,第三者不能知晓。实际应用中,Token可以放在用户的Session,或者浏览器的Cookie中。
防御修复总结:
1. 重要操作用post,不要用get
2. 给form添加token令牌,数值随机且隐秘
3. 服务端验证HTTP Referer字段,即判断是否是从信任的域名过来的请求
六、session与cookie
1. Cookie:(2种)
- (1) Session Cookie(临时cookie): 没有设定过期时间,浏览器关闭,cookie失效
- (2)Third Party Cookie(本地(第三方)Cookie): cookie存储在本地硬盘中,设置了Expire Time(过期时间),过期时间到,才过期
2. Session:
- 存放地:服务端:一般在内存中,还可能是文件,或者DB(数据库)
- 应用:当用户第一次发起请求后,服务器在服务端记录一个相应的客户端身份信息,其中重要的一项是SessionID,标志了客户端用户信息。Token也可以生成后一份放在服务端,另一份放在修改的form里的token值里。(或者生成后,一个发送到客户端的cookie中,另一个放在form里)
2016.11.9 下午 上海
网友评论