老王是如何用TA的“身份证”,掏空TA的银行储蓄的?

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



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


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


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


CSRF 攻击流程分析


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

老王是如何用TA的“身份证”,掏空TA的银行储蓄的?

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


老王是如何用TA的“身份证”,掏空TA的银行储蓄的?

(图一) 登陆页面


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


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


老王是如何用TA的“身份证”,掏空TA的银行储蓄的?

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


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


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


老王是如何用TA的“身份证”,掏空TA的银行储蓄的?

(图三) 用户看到的 “正常” 按钮


老王是如何用TA的“身份证”,掏空TA的银行储蓄的?

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


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

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


老王是如何用TA的“身份证”,掏空TA的银行储蓄的?

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


总结


一次 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 进行过滤的服务器。如下图


老王是如何用TA的“身份证”,掏空TA的银行储蓄的?


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


老王是如何用TA的“身份证”,掏空TA的银行储蓄的?


如上图。若 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 等协议的问题。


分享到:


相關文章: