跨站请求伪造(CSRF)
Cross-site request forgery简称为”CSRF“
在CSRF的攻击场景中攻击者会伪造一个请求(这个请求一般是一个链接)
然后欺骗目标用户进行点击,用户一旦点击了这个请求,整个攻击也就完成了。
所以CSRF攻击也被称为”one click“攻击。
我们判断一个网站是否存在CSRF漏洞,其实就是判断其对关键信息(比如密码等敏感信息)的操作(增删改)是否容易被伪造。
CSRF与XSS的区别:
CSRF是借用户的权限完成攻击,攻击者并没有拿到用户的权限,而XSS是直接盗取了用户的权限,然后实施破坏。
如何确认一个web系统存在CSRF漏洞:
-
对目标网站增删改的地方进行标记,并观察逻辑,判断请求是否可以伪造
——比如修改管理员账号时,并不需要验证旧密码,导致请求容易被伪造;
——比如对于敏感信息的修改并没有使用安全的token验证,导致请求容易被伪造;
-
确认凭证的有效期(这个问题会提高CSRF被利用的概率)
——虽然退出或者关闭了浏览器,但cookie仍然有效,或者session并没有及时过期,导致CSRF攻击变得简单。
CSRF(get)
我们进入CSRF(get)这关,进来以后让我们输入用户名和密码
我们点一下提示,可以获取到用户名和密码,我们这里随便用一个就行
我们登录进来以后,点击修改个人信息就可以随便修改。
那么我们如何知道这个地方是否存在CSRF漏洞呢?
这里其实是一个敏感信息的修改,我们打开burp看一下刚才的get请求
GET /pikachu-master/vul/csrf/csrfget/csrf_get_edit.php?sex=girl&phonenum=12345678922&add=taiyuan&email=lucy%40pikachu.com&submit=submit
这个get请求实际上是向后台传递了刚才的所有参数,而且我们并没有在这个提交的参数里看到csrf token,也就是说后台这里是没有做一些防CSRF的措施的,同时他又是通过get请求来提交的,如果有人相对它进行修改,他就只需要获取到这个链接,然后就可以对一些地方进行修改,然后通过邮件,聊天工具等发送给受害者,受害者点击后就会被修改信息。实际上,在lucy敲下回车键的时候,他的浏览器就会以他现在的登录态向后端发送这个请求,这样他的个人信息就被修改掉了。
get型的CSRF是比较好利用的,我们只需要伪造这个链接,然后把我们想要修改的参数修改掉,然后发送给带登录态的攻击者,他只要点击,这个请求就完成了,这个攻击也完成了。
CSRF(post)
如果是post型的CSRF呢,我们看一下:
我们还是登录去修改信息,然后提交,去burp看一下数据包:
这次的提交是通过post方式去传播的,所有的请求是在这个请求体里面去传输的,也就是说我们没办法通过url去伪造这个请求。这个时候利用方法其实和我们之前那个XSS是一样的,我们需要去布置一个自己的站点,然后在这个站点上做一个表单,然后让lucy去点我们这个恶意网站的url,去向存在csrf漏洞的这个页面提交请求。
token详解及防范措施
token是如何防止CSRF的?
CSRF的主要问题是敏感操作的链接容易被伪造,那么如何让这个链接不容易被伪造呢?
—每次请求,都增加一个随机码(需要够随机,不容易伪造),后台每次对这个随机码进行验证!
我们可以看到这个请求和我们之前的get请求基本一样,但是多了一个token值
我们通过开发者工具可以看到,点击修改按钮会访问一个token_get_edit.php这个文件,这个文件就会生成一个token,它会把这个token去echo到前端。
我们可以通过查看表单看到,这里它埋了一个token,这个是隐藏的,前端是看不到的,但是它其实是在你的源码里面,你在提交的时候,token也会被提交,后台会对这个token进行一个验证,一样才会提交,不一样的话就不允许提交。token是随机的并且是唯一的。这样别人的伪造链接的token是验证不过去的,所以token有效的防止了CSRF。
防范措施
-
增加token验证(常用的做法)
- 对关键操作增加token参数,token值必须随机,每次都不一样;
-
关于安全的会话管理(避免会话被利用)
- 不要在客户端保存敏感信息(比如身份认证信息);
- 操作完成直接关闭,退出时,要把后台登录态注释掉;
- 设置会话过期机制,比如15分钟内无操作,则自动登陆超时;
-
访问控制安全管理
- 敏感信息的修改时需要对身份进行二次认证,比如修改账号时,需要判断旧密码;
- 敏感信息的修改使用post,而不是get;
- 通过http头部中的referer来限制原页面,一定要来自本域;
-
增加验证码
一般用在登录(防暴力破解),也可以用在其他重要信息操作的表单中(需要考虑可用性);
st,而不是get;
3. 通过http头部中的referer来限制原页面,一定要来自本域;
-
增加验证码
一般用在登录(防暴力破解),也可以用在其他重要信息操作的表单中(需要考虑可用性);