目录
一、csrf漏洞原理
简单理解就是:攻击者盗用了你的身份,以你的名义去进行某种非法操作或者获取你的信息等等
CSRF(即跨站请求伪造)是指利用受害者尚未失效的身份认证信息、(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害人的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操作(转账,改密码等)
二、csrf必要的两个步骤
1、受害者登录新信任网站A,并在本地生成cookie
2、在未登出网站A的情况下,去访问恶意站点B (必须是同一个浏览器)
思考:感觉不一定要存在一个恶意网站B,因为例如在qq发送一个恶意链接(包含恶意参数的)发给受害者就可以,当然必须得不登出网站A且有cookie信息 ,感觉其实是参数可预测所以攻击成功,后面防御有一条token就是在做到参数不可预测原则
三、DVWA靶场
1、security=low
构造一个恶意链接,改密码为
pass
http://192.168.10.129:8080/vulnerabilities/csrf/?password_new=pass&password_conf=pass&Change=Change#
通过在线短链接生成器生成,包装一下:短链接,短网址在线生成 - 站长工具 (chinaz.com)
然后去访问该网址
就成功l,我们可以去登出验证一下密码是pass
总结一下就是参数可预测,如果这个改密码加一个输入原密码,且够复杂,攻击者猜测不到原密码,那么就不会攻击成功了,所以是违背了参数可预测的原则和利用了受害者未失效身份信息
2、security=medium
1)更改referer测试
先改回password,此时再去使用上一个短链接就不可以了
猜测应该是referer,看看抓包信息
先看看正常网站的包
是有referer字段的
而我们短链接生成的包中没有这个字段,加一个(复制过去,再访问)
但是实际中怎么处理呢,我们不可能去,一个恶意链接咋改referer呢,嗯
2)实际攻击中绕过referer
我们查看源码
看看该函数嘛,如果查找不到就返回false
可以看到服务端检查referer字段的逻辑是:referer字段包含server_name字段(域名吧,我们这里用的是ip)吗?所以绕过就是只要包含就可以绕过,不管是域名包含还是文件包含都可以
我们这里用phpstudy建一个站点,里面包含恶意链接
打开这个“恶意站”,发现是乱码--->乱码一般就是因为编码和解码使用的编码方式不同
我们去改一下就可以
再刷新
访问
这样就绕过了referer字段
3、security=high
(先改回密码password)
同样先试试短链接看看结果,可以看到加入了token值
这个应该要结合其他漏洞例如xss
1)先来看看这个token值
先更改密码一次
然后在当前页面右键查看源代码,可以看到有一个token值框,是隐藏的(hidden)
对比这个值和刚刚请求的token不是一个值
我们再改一次
这时可以看到这个token就是和我们刚才查看源码的token值一模一样了,说明每个token是只用一次的,且每次服务端返回的token就是下一次请求的验证的token值
2)获取这个token
思路:dom xss high级别通过多参数传入一个script标签,src指向恶意站点下存在的js文件
,该文件就是通过异步请求(原生ajax或者jQuery都可以,jQuery需要引入源)
四、csrf防御
1、验证referer字段:验证请求是不是以域名开头的(不是包含,是开头,不然就像之前那个dvwa实验还是可以攻击成功),但是不是绝对的安全也不是全部适用,例如一些用户是不愿意让浏览器获取到自己的referer值,担心泄露敏感信息
2、token值:在 HTTP 请求中以参数的形式加入一个随机产生的 token,黑客无法伪造和预测;但是通过dvwa也可以看到黑客也可以用其他漏洞去获取;似乎验证码就获取不到了,例如手机银行涉及到一些转账时,就会让我们输入验证码而不是银行卡密码,应该就是为了保证安全,但是一直让用户去手动输入验证码,使得用户体验感不好吧,所以就采取hidden框的token值的方式