2021年,构造一个CSRF攻击怎么那么难

2,942 阅读3分钟

前言

最近要分享下CSRF的攻防,按说这是个老掉牙的话题,不过我也遇到过非常多一知半解的同学,我自己也经常会被各种条件绕晕,毕竟安全的问题总是灵活非常,所以也算常谈常新

这里我就不讲CSRF的原理了

过程

既然分享就要写个攻防的例子来演示才比较好理解,所以我用koa和host代理加两个页面就写起来了,基本都没啥问题,直到我开始模拟攻击行为

1.get请求

作为一个演示来说,拿get请求来说事到底还是有点过不去,get请求的返回值会被浏览器拦截,但是请求还是会打到服务器,但是现在谁还用get请求来执行写操作呢?

2.post请求

我就想用post,好,先用xhr来试试,不行,浏览器会先发OPTIONS请求,OPTIONS返回的时候就会被浏览器拦住,就算服务器返回的是200 ok也没用,所以后续的POST请求发布出去,好的,我们还有form元素

3.form元素

form元素是个好东西,method可以支持get和post,enctype可以填写post的格式,但是,form不能操作请求头(反正我不知道怎么操作,有会的大佬请告诉我)

另外,在REST规范大行其道的今天,put、update、delete请求我该怎么办?form的method填写这些,在打到node以后会变成get请求。我就只能先用post应付一下吧

并且,form提交是会跳转的,我用createElement加formData的方式进行提交,不直接写form元素也是一样的结果,一个attack页面好好的,点了个按钮就跳转了不合适吧,用户肯定能发现,我记得很多年以前我试过form提交不跳转,但是我忘了怎么处理的,一定不是通过xhr,也许那个属性已经被浏览器干掉了

顺带一嘴,接收到204返回码form也是不会跳转的,但是人家的服务器怎么会给你返回204呢?

4.其他问题

我并没有使用koa-router,只是在koa里手写一个use,用if else 处理所有的请求url,如果我用koa-router,可能光url的严格匹配就能拦住一部分攻击,以及注册的请求类型(上面提到的put、update、delete等)也能拦住很多攻击

更不用说现在用的很多的csrf token和cookie的same-site这些新特性对CSRF攻击的限制了

结语

可能因为我本身不是专业研究安全的,所以对安全领域的知识还停留在很多年以前,有经验的大佬还请不吝赐教

提一句我搭的环境,避免环境不同导致的结果不一致,koa搭服务,监听两个端口,这两个端口用host代理两个域名,一个sheep.com,一个attack.com,koa-send返回两个html文件,分别作为sheep和attack的页面,sheep.com下面种cookie,模拟attack.com跨域的情况