URL redirection/URL重定向
1、相关背景介绍
由于应用越来越多的需要和其他的第三方应用交互,以及在自身应用内部根据不同的逻辑将用户引向到不同的页面,譬如一个典型的登录接口就经常需要在认证成功之后将用户引导到登录之前的页面,整个过程中如果实现不好就可能导致一些安全问题,特定条件下可能引起严重的安全漏洞。
2、成因
对于URL跳转的实现一般会有几种实现方式:
- META标签内跳转
- javascript跳转
- header头跳转
通过以GET或者POST的方式接收将要跳转的URL,然后通过上面的几种方式的其中一种来跳转到目标URL。一方面,由于用户的输入会进入Meta,javascript,http头所以都可能发生相应上下文的漏洞,如xss等等,但是同时,即使只是对于URL跳转本身功能方面就存在一个缺陷,因为会将用户浏览器从可信的站点导向到不可信的站点,同时如果跳转的时候带有敏感数据一样可能将敏感数据泄漏给不可信的第三方。
譬如一个典型的登录跳转如下:
<?php $url=$_GET['jumpto']; header("Location: $url"); ?>
如果jumpto没有任何限制,所以恶意用户可以提交
http://wiki.wooyun.org/login.php?jumpto=http://www.evil.com
来生成自己的恶意链接,安全意识较低的用户很可能会以为该链接展现的内容是wiki.wooyun.org从而可能产生欺诈行为,同时由于QQ,淘宝旺旺等在线IM都是基于URL的过滤,同时对一些站点会一白名单的方式放过,所以导致恶意URL在IM里可以传播,从而产生危害,譬如这里IM会认为wiki.wooyun.org都是可信的,但是通过在IM里点击上述链接将导致用户最终访问evil.com。
此外,由于底层操作类库支持多种协议,如未做过滤或过滤不周也会产生安全漏洞。如:
http://wiki.wooyun.org/login.php?link=file:///etc/passwd
利用file协议即可成功读取服务器的/etc/passwd
文件。
当已经针对url做了协议控制(只允许http访问)时还能做什么呢?:尝试下访问内网吧:
http://wiki.wooyun.org/login.php?url=http%3A%2F%2Foa.wooyun.org%2F
这种问题就是由于对URL过滤不周而导致的。
3、攻击方式及危害
利用URL跳转漏洞可以绕过一些常见的基于白名单的安全机制。如:
- 传统IM里对于URL的传播会进行安全校验,但是对于大公司的域名及URL将直接允许通过并且显示为可信的URL,而一旦该URL里包含一些跳转漏洞将可能导致安全限制被绕过。恶意用户可以通过这种方式将用户引入恶意页面进行钓鱼、诈骗等。
- 常见的一些应用允许引入可信站点(如youku.com)的视频,而判定视频来源是否可信的方式往往是通过检查URL是否是youku.com来实现,如果youku.com内含一个url跳转漏洞,将导致最终引入的资源属于不可信的第三方资源或者恶意站点,最终导致安全问题。
URL跳转漏洞的危害并不只会影响到用户或其他网站。
当底层操作类库支持其他协议时,URL跳转漏洞可能导致本地的读取或网络信息被侦测等问题。如:
- curl库支持一些其他的协议,如不做限制,可使用file协议读取本地文件,使用telnet探测端口信息等。
即使底层库不支持其他协议或者已对其他协议做了限制,如未限制网络边界也可能会产生问题。如:
- 可以利用http协议进行内网漫游等。
4、实际案例
结界师:WooYun-2010-00198:http://www.wooyun.org/bugs/wooyun-2010-0198
该漏洞借助未验证的URL跳转,成功的将应用程序内部敏感的数据传递到了不安全的第三方区域。
kEvin1986:WooYun-2010-00012:http://www.wooyun.org/bugs/wooyun-2010-012
由于curl支持file、ftp、telnet等协议,导致了未正确过滤URL的地方可以被用来读取内网信息。
结界师:WooYun-2013-26212:http://www.wooyun.org/bugs/wooyun-2013-026212
该漏洞虽然限制了使用的协议,但是未对网络边界进行限制,导致利用http协议成功实现了内网的漫游。
5、修复方案
理论上讲,url跳转属于CSRF的一种,我们需要对传入的URL做有效性的认证,保证该URL来自于正确的地方,限制的方式同防止csrf一样可以包括:
- 加入referer的限制,保证该URL的有效性,避免恶意用户自己生成跳转链接。
- 加入有效性验证Token,避免用户生成自己的恶意链接从而被利用(但是如果功能本身要求比较开放,可能会产生一定的限制)。
- 设置严格白名单及网络边界:功能要求比较开放的情况下,需要严格限定协议以及可访问的网络。
6、漏洞扫描与发现
测试URL重定向漏洞以灰盒测试为主,因其主要发生在如javascript中的window.location
这类地方,在审查代码时如果发现window.location的地址是用户可控(可输入)的,就要重点检查是否验证了该地址的合法性并进行了相应的过滤。
7、相关其他安全问题
未知