听说,老王最近手头紧,萌生了歪念头,要对好友的银行账户「下黑手」。只见三下五除二,好友的银行账户上的「全部家当」被一扫而空,全数归到老王的囊中。

老王是怎么做到的?原来有一次,老友刚在电脑上登陆完网银查询账户余额,老王就借机以借钱为由,发给老友「伪造」的网银页面,诱骗好友点击。而实际上这是一条带有修改用户密码命令的恶意链接,银行验证通过了来自老友本地的Cookie,密码修改成功,转账就显得顺利成章了。

老王如此「高手段」,其实是用了CSRF(Cross-site Request Forgery),中文简称跨站请求伪造。简单来说,CSRF是通过第三方网站伪装成正常用户登录目标网站,并以正常用户的身份对用户账号进行操作,以达到目的。作为WEB端常见的攻击方式,需要引起安全人员的重视,否则危害难以预料。

咱们来好好地理一理,CSRF攻击原理和防护策略。

CSRF攻击流程分析

结合一个修改用户账号密码的实例进行分析。下图是CSRF攻击原理流程:

1、正常用户在自己本地浏览器上访问WEB A 服务,并且输入了自己的账号密码(如图一),此时浏览器会提示是否保存账号密码,如果用户点击保存,就会在本地生成有关账号信息的cookie,这样下次无需登录即可访问网站,这一招大大地便利了用户操作,提高了用户体验。可是,这种便利反哺了CSRF攻击,对全球WEB造成了极大的损失。

(图一)登陆页面

Cookie根据存放的位置可以分为两种,Session Cookie(内存Cookie) 和 Third-party Cookie(硬碟Cookie)。内存Cookie在进程结束后即浏览器关闭后就会失效,而硬碟Cookie则需要用户手动清除才会消失。

2、WEB A伺服器接受到正常用户的请求,对账号和密码进行验证通过,用户登录成功。

(图二)用户登录成功页面

以上两步,是用户的正常操作,也是大家访问并登录网站的基本操作。通过上面的操作,生成了用户账号信息的Cookie。

3.而就在此时,黑客可以通过在第三方网站WEB B设置一个指向WEB A的并带有恶意命令的超链接,并将它隐藏在按钮、表单等控制项上。再通过社交工程学的方式引诱用户点击,而这个链接带有的命令是可以修改用户密码。

(图三)用户看到的「正常」按钮

(图四)按钮隐藏下的修改密码的命令

4、若用户在并不知道该超链接的情况下对按钮或表单进行了点击,则用户浏览器会带著Cookie再次发出对WEB A的操作请求。若用户之前登陆的WEB A未被关闭,则浏览器会携带session Cookie。若WEB A 已被关闭,则浏览器会携带Third-party Cookie发出请求,但某些浏览器会禁止表单,按钮等标签发送第三方Cookie,如IE,从而导致CSRF失败。

5、WEB A对此次请求进行验证,由于Cookie无误,所以请求操作被通过。此时密码已经被修改,用户无法登陆。如图

(图五)用户用原密码登录失败

总结

一次CSRF攻击成功实施,至少需要4个条件:

1.被害用户已经进行过WEB身份认证,并留有Cookie

2.新提交的请求无需重新进行身份认证或确认机制

3.攻击者了解WEB请求的参数构造

4.通过社交工程学诱使用户触发攻击的指令

CSRF的「兄弟」SSRF

说到CSRF,就不得不提SSRF,一种非常相似的攻击方法。简单介绍一下:

SSRF(Server-Side Request Forgery),被称为伺服器端伪造攻击。如果把CSRF理解成客户端伪造请求攻击,其是利用用户本地的Cookie骗过伺服器端的验证达到目的。而SSRF则是利用伺服器天然能够访问内部网路的特点,进行攻击。

由此可以得出,SSRF的受害对象主要是一些伺服器所连接的一些内网设备,如内网的应用程序,通过file协议获得内部网路的资料等。SSRF攻击常见于一些允许以URL作为参数,且未对URL进行过滤的伺服器。如下图

该识图网站允许以图片URL作为参数传入图片,假如该网站伺服器和它的内网相连,且缺少对传入URL的过滤,那么就可以以其内网网址为参数传入,得到其内网网址上的内容。

如上图。若URL是正常的第三方伺服器,则URL会过滤通过。若URL是带有命令操作的伺服器端A,且绕过了伺服器端A的过滤,则伺服器端A会执行URL带有的命令,并将结果返回会客户端,由此一次SSRF攻击成功。

总结

一次成功的SSRF需要2个条件:

1.攻击者知道伺服器端的内网地址

2.伺服器端未对请求URL进行过滤或过滤不完全

从以上我们可以得出,该漏洞产生的原因是由于服务端对资源进行请求的时候对URL的验证出现了纰漏,所以我们的防护策略主要是围绕URL的过滤。

1.将URL进行解析转化成IP,并使用正则表达式表示内网网址,并以此进行URL过滤。

2.建立URL白名单,只允许白名单上内容通过过滤。

3.建立内网IP黑名单,阻止对该IP的请求。

4.对返回内容进行过滤,减少敏感内容暴露。

5.禁止不需要的协议,只允许http和https协议的请求,减少file等协议的问题。


推荐阅读:
相关文章