CSRF 特点和原理
CSRF:Cross Site Request Forgery,跨站请求伪造
本质是:恶意网站把正常用户作为媒介,通过模拟正常用户的操作,攻击其登录过的站点。
它的原理如下:
- 用户访问正常站点,登录后,获取到了正常站点的令牌,以cookie的形式保存
- 用户访问恶意站点,恶意站点通过某种形式去请求了正常站点(请求伪造),迫使正常用户把令牌传递到正常站点,完成攻击
防御
cookie的SameSite
现在很多浏览器都支持禁止跨域附带的cookie,只需要把cookie设置的SameSite
设置为Strict
即可
SameSite
有以下取值:
- Strict:严格,所有跨站请求都不附带cookie,有时会导致用户体验不好
- Lax:宽松,所有跨站的超链接、GET请求的表单、预加载连接时会发送cookie,其他情况不发送
- None:无限制
这种方法非常简单,极其有效,但前提条件是:用户不能使用太旧的浏览器
验证referer和Origin
页面中的二次请求都会附带referer或Origin请求头,向服务器表示该请求来自于哪个源或页面,服务器可以通过这个头进行验证
但某些浏览器的referer是可以被用户禁止的,尽管这种情况极少
使用非cookie令牌
这种做法是要求每次请求需要在请求体或请求头中附带token
请求的时候:authorization: token
验证码
这种做法是要求每个要防止CSRF的请求都必须要附带验证码
不好的地方是容易把正常的用户逼疯
表单随机数
这种做法是服务端渲染时,生成一个随机数,客户端提交时要提交这个随机数,然后服务器端进行对比
该随机数是一次性的
流程:
- 客户端请求服务器,请求添加学生的页面,传递cookie
- 服务器
- 生成一个随机数,放到session中
- 生成页面时,表单中加入一个隐藏的表单域
<input type="hidden" name="hash" value="<%=session['key'] %>">
- 填写好信息后,提交表单,会自动提交隐藏的随机数
- 服务器
- 先拿到cookie,判断是否登录过
- 对比提交过来的随机数和之前的随机数是否一致
- 清除掉session中的随机数
二次验证
当做出敏感操作时,进行二次验证
攻击测试
第2天-CSRF跨站请求伪造攻击-课堂作业
【作业名称】
CSRF 实验环境
Xuegod63 DVWA 服务器 IP:192.168.1.63
Kali Hacker IP:192.168.1.53
Win10 被攻击方
1. 基于DVWA的 low级别实现CSRF攻击
源码中只经过了最简单的判断验证 没有过滤 只要两次输入的密码一致 就执行 并存入数据库
构造url链接
用burpsuite抓包
GET /DVWAmaster/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Ch ange HTTP/1.1 #红色部分是修改密码传递的参数。
我们将参数和完整的 URL 拼接起来。伪造一个改用户密码的请求链接,如下: http://192.168.1.63/DVWAmaster/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change
注:只要用户访问这个链接,就可以把用户的密码改为 123456
http://192.168.1.63/DVWA-master/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change
这样用户的密码就改为123456了
在用password登录就登录不起了
构建恶意链接
2. 基于DVWA的 Medium级别实现CSRF攻击
这里需要进行判断
referer 推荐人 HTTP Referer 是 header 的一部分,当浏览器向 web 服务器发送请求的时候,一般会带上 Referer,告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理。 在 PHP 中使用 $_SERVER[‘HTTP_REFERER’] 获取页面提交请求中的 Referer 值。
通过抓包 进行对比
原始:Referer: http://192.168.1.63/DVWA-master/vulnerabilities/csrf/
伪造:Referer: http://192.168.1.53/csrf.html 我们可以看到,伪造的请求并不符合代码中对 Referer 信息的过滤。在伪造的链接中找不到 $_SERVER[ ‘SERVER_NAME’ ](获取本站的ip) ,即找不到 192.168.1.63 这个 IP 地址。
$_SERVER[‘HTTP_REFERER’]这个是获取请求来源的referer
我们就需要进行绕过referer
我们通过修改网站目录结构,来让 Referer 满足过滤规则。 新建一个目录,目录的名字是: 192.168.1.63 。路径: /var/www/html/192.168.1.63
root@xuegod53:/var/www/html# mkdir 192.168.1.63
root@xuegod53:/var/www/html# mv csrf.html 192.168.1.63/
修改文件权限 root@xuegod53:/var/www/html# chown www-data:www-data 192.168.1.63/ -R
现在当用户进入这个链接http://192.168.1.53/192.168.1.63/csrf.html点击的时候 就能够被修改了