「黑客攻击手段」CSRF攻击,你越好奇,离你的账户越近

跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF,是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法 。
和跨网站脚本(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任 。
攻击细节

跨站请求攻击,简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并执行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品) 。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去执行 。这利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的 。
CSRF可以做什么?【「黑客攻击手段」CSRF攻击,你越好奇,离你的账户越近】你也可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求 。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包括:个人隐私泄露以及财产安全 。
CSRF原理下面一张图简单阐述了CSRF的原理
「黑客攻击手段」CSRF攻击,你越好奇,离你的账户越近

文章插图
CSRF的原理
从上图可以看出,要完成一次CSRF攻击,受害者必须依次完成以下两个步骤:
  • 登录受信任网站A,并在本地生成Cookie 。
  • 在不登出A的情况下,访问危险网站B 。
  • 看到这里,你也许会问:“如果我不满足以上两个条件中的一个,我就不会受到CSRF攻击” 。是滴,确实如此,但是你不能保证以下情况不会发生:
  • 你不能保证你登录了一个网站之后,不再打开一个tab页面并访问其它的网站(黄网) 。
  • 你不能保证你关闭浏览器之后,你本地的Cookie立刻过期,你上次的会话已经结束 。
  • 上述中所谓的攻击网站,可能就是一个钓鱼网站或者黄色网站
例子我们先假设支付宝存在CSRF漏洞,我的支付宝账号是zhx,攻击者的支付宝账号是xxx 。然后我们通过网页请求的方式
http://zhifubao.com/withdraw?account=zhx&amount=10000&for=luffy
可以把我账号zhx的10000元转到我的另外一个账号luffy上去 。
通常情况下,该请求发送到支付宝服务器后,服务器会先验证该请求是否来自一个合法的session并且该session的用户已经成功登陆 。攻击者在支付吧也有账号xxx,他知道上文中的URL可以进行转账操作,于是他自己可以发送一个请求
http://zhifubao.com/withdraw?account=zhx&amount=10000&for=xxx 到支付宝后台 。
但是这个请求是来自攻击者而不是来自我zhx,所以不能通过安全认证,因此该请求作废 。这时,攻击者xxx想到了用CSRF的方式,他自己做了个黄色网站,在网站中放了如下代码:
http://zhifubao.com/withdraw?account=zhx&amount=10000&for=xxx
并且通过黄色链接诱使我来访问他的网站 。当我禁不住诱惑时就会点了进去,上述请求就会从我自己的浏览器发送到支付宝,而且这个请求会附带我的浏览器中的cookie 。大多数情况下,该请求会失败,因为支付宝要求我的认证信息,但是我如果刚访问支付宝不久,还没有关闭支付宝页面,我的浏览器中的cookie存有我的认证信息,这个请求就会得到响应,从我的账户中转10000元到xxx账户里,而我丝毫不知情,攻击者拿到钱后逍遥法外 。所以以后一定要克制住自己,不要随便打开别人的链接 。
透过例子能够看出,攻击者并不能通过CSRF攻击来直接获取用户的账户控制权,也不能直接窃取用户的任何信息 。他们能做到的,是欺骗用户浏览器,让其以用户的名义执行操作 。
CSRF 攻击的对象在讨论如何抵御 CSRF 之前,先要明确 CSRF 攻击的对象,也就是要保护的对象 。从以上的例子可知,CSRF 攻击是黑客借助受害者的 cookie 骗取服务器的信任,但是黑客并不能拿到 cookie,也看不到 cookie 的内容 。另外,对于服务器返回的结果,由于浏览器同源策略的限制,黑客也无法进行解析 。因此,黑客无法从返回的结果中得到任何东西,他所能做的就是给服务器发送请求,以执行请求中所描述的命令,在服务器端直接改变数据的值,而非窃取服务器中的数据 。所以,我们要保护的对象是那些可以直接产生数据改变的服务,而对于读取数据的服务,则不需要进行 CSRF 的保护 。比如银行系统中转账的请求会直接改变账户的金额,会遭到 CSRF 攻击,需要保护 。而查询余额是对金额的读取操作,不会改变数据,CSRF 攻击无法解析服务器返回的结果,无需保护 。


推荐阅读