一、CSRF漏洞概述
跨站请求伪造(英语:Cross-site request forgery),简称“CSRF”。在CSRF的攻击场景中攻击者会伪造一个请求(这个请求一般是一个链接)。然后欺骗目标用户进行点击,用户一旦点击了这个请求,整个攻击也就完成了。所以CSRF攻击也被称为“one click”攻击
例如以下场景:
如果小黑想要修改lucy的个人信息,应该怎么办?需要有lucy的权限
于是小黑将修改个人信息的请求伪造一下,然后通过聊天工具或者邮件的方式引诱lucy在登录的情况下点击,攻击成功了!
伪造以下请求:
http://192.168.112.200/ant/vulnerabbilities/csrf/csrfget/csrf_mem_edit.php?sex=女&phonenum=13888882435&add=火星村111号&email=lucy@pikachu.com&submit=submit
CSRF与XSS的区别
CSRF是借用用户的权限完成攻击,攻击者并没有拿到用户的权限,而XSS是直接盗取到了用户的权限,然后实施破坏
注:利用用户已经登录的状态,执行恶意操作
如何确认一个web系统是否有CSRF漏洞
对目标站点增删改查的地方进行标记,并观察逻辑,判断请求是否可以伪造。
-
比如修改管理员账号时,不需要验证旧密码
-
比如修改敏感信息不需要token验证
确认凭证的有效期
-
虽然退出或关闭了览器,但Cookie仍然有效,或者Session没有及时过期,导致CSRF攻击变得简单
二、CSRF漏洞测试流程
针对以上场景,为什么小黑的攻击可以成功?
条件1:XXX购物网站没有对个人信息修改的请求进行防CSRF处理,导致该请求容易被伪造
因此,我们判断一个网站是否存在CSRF漏洞,其实就是判断其对关键信息(比如密码等敏感信息)的操作(增删改)是否容易被伪造
条件2:lucy在登录了后台的情况下,点击了小黑发送的“埋伏”链接
如果lucy不在登录状态下,或者lucy根本就没有点击这个链接,则攻击不会成功
三、CSRF(get/post)实验演示和解析
CSRF(get)实验演示
第一步:打开pikachu的CSRF,进行登录(右上角的提示)
第二步:登录来到个人中心,可以看到用户grady的个人信息,直接修改其住址为beijing
修改成功
第三步:判断我们的网站是否存在CSRF漏洞:进行敏感信息的修改,通过burp抓包查看
我们发现,get请求并没有向后台发送token参数,说明后台是没有做防CSRF的措施的,同时又是get请求提交的。
攻击者会自己注册一个账号,然后登录,改一下地址,通过抓包就能拿到这个链接,当他改地址时,他通过邮件或是聊天工具发给grady
第四步:将攻击者伪造的链接引诱用户点击
127.0.0.1/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=boy&phonenum=13676765545&add=shanxi+&email=grady%40pikachu.com&submit=submit HTTP/1.1
假设这是攻击者伪造的链接发送给grady,grady目前的住址是beijing,他正是登录态的,当他收到攻击者的聊天信息,他会把这个聊天信息去访问一下,这个时候他的个人信息就已经被修改了,地址被修改为shanxi。
CSRF(post)实验演示
如果是POST型的,所有参数在请求体中提交,我们不能通过伪造URL的方式进行攻击
这里的攻击方式跟XSS中POST类型是一样的,攻击者可以搭建一个站点,在站点上做一个表单,诱导lucy点击这个链接,当用户点击时,就会自动向存在CSRF的服务器提交POST请求修改个人信息。
四、CSRF token
CSRF的主要问题是敏感操作的链接容易被伪造,那么如何让这个链接不容易被伪造?
每次请求,都增加一个随机码(需要够随机,不容易被伪造),后台每次对这个随机码进行验证!
第一步:在pikachu的csrf之token平台进行登录,并且进行抓包查看
我们发现,与前面比较,这里多了一个token。因为token是随机的,所以就无法伪造了
第二步:我们刷新页面查看,打开控制台查看,每次刷新都会出现一个新的随机的token值
五、常见CSRF防范措施
增加token验证(常用的做法):
1.对关键操作增加Token参数,token必须随机,每次都不一样
关于安全的会话管理(避免会话被利用)
1.不要在客户端保存敏感信息(比如身份验证信息)
2.退出、关闭浏览器时的会话过期机制
3.设置会话过机制,比如15分钟无操作,则自动登录超时
访问控制安全管理
1.敏感信息的修改时需要身份进行二次认证,比如修改账号密码,需要判断旧密码
2.敏感信息的修改使用POST,而不是GET
3.通过HTTP头部中的REFERER来限制原页面
增加验证码
一般在登录(防暴力破解),也可以用在其他重要信息操作的表单中(需要考虑可用性)