CSRF(Cross-site request forgery跨站请求伪造,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
0x01 CSRF是什么?
网站是通过cookie来识别用户的,当用户成功进行身份验证之后浏览器就会得到一个标识其身份的cookie,只要不关闭浏览器或者退出登录,以后访问这个网站会带上这个cookie。如果这期间浏览器被人控制着请求了这个网站的url,可能就会执行一些用户不想做的功能(比如修改个人资料)。因为这个不是用户真正想发出的请求,这就是所谓的请求伪造;呵呵,因为这些请求也是可以从第三方网站提交的,所以前缀跨站二字。
0x02 CSRF可以做什么?
你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账……造成的问题包括:个人隐私泄露以及财产安全。
0x03 CSRF与XSS的区别
XSS:
攻击者发现XSS漏洞——构造代码——发送给受害人——受害人打开——攻击者获取受害人的cookie——完成攻击
CSRF:
攻击者发现CSRF漏洞——构造代码——发送给受害人——受害人打开——受害人执行代码——完成攻击
CSRF少了一个 获取受害人的cookie的步骤。为什么会少了呢。因为受害人在执行代码的时候就已经完成的攻击,而攻击者并没有参与进来。
举个例子来说吧(受害者的网址是a.cn,攻击者的网址是b.cn)攻击者想要在某个网站(网站是某个开源CMS)添加上另一个管理员,但是这个网站并没有XSS漏洞。怎么办呢?这时攻击者发现了这个开源CMS后台添加管理员时并没有加入验证码或则token,只需要输入要添加的管理员账号和密码点击确定就可以添加管理员账户了。这时和我一样聪明的攻击者在自己的服务器上建立了一个html文件(假设地址是b.cn/index.html)。然后就给网站管理员发邮件等等,诱使管理员打开b.cn/index.html。当管理员打开后(这时管理员正在网站后台,或则管理员的session并没有失效的话),就可以神不知鬼不觉的在网站后台添加了一个管理员账户。
CSRF的两个侧重点:
1.csrf的攻击建立在浏览器和web服务器的会话之中
2.欺骗用户访问恶意url
0x04 CSRF实例
0x04_1 CSRF快速脱库
正常情况下,管理员备份数据库的方法是进入管理页面-管理中心-数据备份
我们现在用普通用户利用CSRF漏洞来备份网站的数据库。
第一步:建个用户,普通权限
第二步:构造备份数据库的链接
注:这个链接就是admin正常备份数据库的链接
第三步:利用普通用户发一个帖子,帖子的信息能够达到诱骗管理员访问的目的,里面的图片写上我们备份数据库的链接,宽高都是0,这样就不会看到我们的恶意代码
第四步:引诱管理员访问帖子,这里我使用两个不同的浏览器,这样就不会因为cookie而产生歧义
第五步:访问我们自己构造的路径,即可得到数据库
http://127.0.0.1:8080/discuz1.5/upload/uc_server/data/backup/xxxx/aaaa-1.sql
0x04_2 CSRF修改密码
比如某一套开源的CMS,知道改密码的链接,这样我们就可以把这些恶意代码,嵌入到某些页面,引诱管理员来访问,这样我们就改了管理员的密码。
这里用DVWA来演示实例。
这里默认账户密码为admin/password
第一步:调安全级别为低,点击csrf
第二步:构造恶意代码,嵌入到某一页面,引诱管理员访问
第三步:成功修改管理员密码,之前的密码无法登陆
0x05 CSRF防御
0x05_1 服务端的防御
1.验证HTTP Referer字段
2.请求地址中添加token并验证
3.在HTTP头中自定义属性并验证
4.在服务端严格区分好POST与GET的数据请求
5.使用验证码或者密码确认方式进行