关于CSRF

上次被面试官问到这个问题,然后自己也把自己说得懵逼了,后面就恶补了一下这方面的知识。

CSRF全称叫做跨站请求伪造,攻击过程就是攻击者利用用户的Cookie向服务端发出一个请求,而这个请求并不是用户自己想要发出的请求。与XSS不同的是:XSS目的是获取用户cookie,CSRF目的是通过用户cookie完成一次精心构造的请求。

关于CSRF,按请求来分:GET型Post型。若按攻击方式来分,可以分为:HTML CSRF攻击、JSON Hijacking攻击和Flash CSRF等。

假设某论坛存在CSRF的漏洞,他删除帖子的功能是用GET请求来实现的,假设网站www.a.cn/?del=1为删除id为1的url,当用户在登陆的情况下,访问了含有www.a.cn/?del=999请求的连接,那么这个用户将会在不知情的情况下删除id为999的文章。在HTML中能设置src/href的都能发起一个GET请求。如果这样的事件发生在有金钱的交易过程中,则损失是巨大的。

我在本地也搭建了一个POST型的CSRF,通过诱骗管理员点击构造的CSRF页面,增加管理员账户。这里用到的工具是 CSRFTester

管理员后台添加用户界面



点击下载的CSRFTester文件夹下的run.bat就是启动这个工具,他会弹出一个CMD窗口表示正在监听端口,我们在浏览器上设置代理就能抓到包了。点击添加管理员,对抓到的包进行分析。


我们添加的管理员账号密码为admin123,发现没有Token,我们把他们的值都改成admin666,点击Generate HTML生成CSRF的页面。此时生成之后再访问生成的CSRF的页面


这时候admin666就已经添加上去了。在实际过程中,我们就把生成的CSRF页面放到一个用户可以访问的地址上。如果没有同源策略(同端口,同域,同协议),用户将会带着他的cookie访问CSRF的页面,服务端则会接受请求。分析生成的CSRF页面代码


在这里form表单的方式为POST。再使用JS代码提交这个POST请求。

在上面的攻击过程很容易暴露。管理员很容易发现。所以CSRF+XSS就很强大了。利用XSS来加载我们的CSRF代码就会显得攻击更加隐蔽。

防御CSRF的方案:

1.检查HTTP Referer字段是否同域

2.限制Seesion Cookie的生命周期

3.使用验证码

4.使用一次性token


2017-05-13  /   

评论