CSRF是Cross Site Request Forgery的缩写,即跨站请求伪造,CSRF攻击是借助受害者的Cookie骗取服务器的信任,以受害者名义伪造请求对服务器进行攻击,一直以来有个疑问,前后端分离使用LocalStorage存储用户令牌token是否还存在CSRF漏洞?今天我们先用Flask 搭建一个CSRF攻击简单例子来理解一下攻击过程,只有理解是如何攻击的才能做好防范。
搭建一个虚拟的银行网站,应用启动于8080端口,账号登录后就可以向其他账号进行转账,程序代码结构如下:
index.py
注:GET请求进入登录页面,POST请求获取登录页用户名密码验证通过后跳到转账页面,然后设置Cookie,用于转账时对用户进行验证。
注:GET请求进入转账页面,POST请求进行转账,转账前先验证Cookie是否有效,然后再进行转账。
login.html
transfer.html
登录成功后进入转账页面可以进行正常转账
如果没登录直接打开页面 http://127.0.0.1:8080/transfer是会被重定向到登录页,必须先登录才能进行转账页面。
另外搭建一个攻击网站,这里我们将应用启动在8081端口,代码结构如下:
index.py
index.html
注:这里action指向网站A,然后页面做得很炫,用色情或者领取优惠券等吸引眼球的效果诱导你去点击链接,如果这时你在正常网站A登录成功没有退出,然后点了恶意网站B的链接。B网站的Form表单将允许跨域提交给正常网站A的转账接口地址并且会将A网站的Cookie携带过去,这样就会执行A网站的代码进行转账。
A网站登录没有退出的情况下,在B网站点击链接
这样你用qingcai1在A网站登录然后点击了B网站的链接,qingcai1的钱就被恶意地转到qing
cai2账号去了。