web漏洞之URL跳转漏洞

漏洞描述

服务端未对传入的跳转url变量进行检查可控制,可能导致恶意构造任意恶意地址,网站接收用户输入的链接,诱导用户跳转到恶意网站,盗取用户的个人信息等

由于应用越来越多的需要和其他的第三方应用交互,以及在自身应用内部根据不同逻辑将用户引向到不同的页面,比如一个典型的登录接口就经常需要认证成功之后将用户引导到登陆之前的页面,整个过程中如果实现不好就可能导致一些安全问题

成因

漏洞发生的场景:

  1. 用户登录、统一身份认证处,认证完后会跳转
  2. 用户分享、收藏内容过后,会跳转
  3. 跨站点认证、授权后,会跳转
  4. 站内点击其它网址链接时,会跳转

对于URL跳转的实现一般会有几种方式:

  1. META标签内跳转
  2. javascript跳转
  3. header头跳转

通过GET或POST的方式接受将要跳转的URL,然后通过上面几种方法的其中一种来跳转到目标URL。一方面,由于用户的输入会进入Meta,javascript,http头所以都可能发生相应上下文的漏洞,如XSS等,但同时,即使只是对于URL跳转本身功能方面就存在一个缺陷,因为会将用户浏览器从可信的站点导向到不可信的站点,同时如果跳转的时候带有敏感数据一样可能将敏感数据泄露给不可信的第三方

demo
假设源域名为:www.landgrey.me 要跳转过去的域为:www.evil.com

1
2
3
<?php
$url = $_GET['jump'];
?>

如果jump没有限制,那么恶意用户可以提交:

1
http://www.landgrey.me/login.php?jump=http://www.evil.com

如果一个网站对一些站点如www.landgrey.me 以白名单的方式放过,突破IM的安全校验,导致恶意URL在网站中传播,产生危害,使用户最终访问www.evil.com

绕过URL跳转限制

利用问号绕过

例:http://www.a.com/abc?url=http://login.a.com, 这是一个跳转到二级域名得跳转链接,将问号放到它自身域名前也就是想要跳转到的域名的后面,如:http://www.a.com/abc?url=http://b.com?login.a.com ,那么它将会跳转到b.com这个任意域名,而b.com后必须带上它自身的域名,否则辅助用而?这个特性跳转到指定域名。跳转后,问号和问号后面的内容会变为这样:http://www.b.com/?login.a.com

利用正反斜杠绕过限制

http://www.a.com/abc?url=http://login.a.com

  1. 正斜杠
    在它本身域名钱加上正斜杠,然后正斜杠前面跟上要跳转的域名地址
    http://www.a.com/acb?url=http://b.com/login.a.com
  2. 反斜杠
    1. 两个反斜杠绕过方法
      http://www.a.com/abc?url=http://b.com\\login.a.com
    2. 一个反斜杠绕过方法
      http://www.a.com/abc?url=http://b.com\login.a.com
    3. 一个反斜杠一个点绕过方法
      http://www.a.com/abc?url=http://b.com\.login.a.com

利用@符绕过url限制

http://www.a.com/acb?url=http://login.a.com@b.com
后面的b.com就是要跳转到的域名,前面的域名都是用来辅助以绕过限制的

利用#号绕过url限制

http://www.a.com/acb?url=http://b.com#login.a.com

利用白名单缺陷绕过限制

有的白名单限制不全,比如如果想利用一个跳转,而这个跳转是通用的,在这个公司网站很多子域名等都可以跳转。
当跳转的域名包含这个网站下的所有域名,比如:http://www.a.com/abc?url=http://login.a.com ,这个login.a.com也可以改成a.com,同样可以跳转,因为白名单里只要检查到包含有这个域名(a.com),就可以成功跳转。那么,当在url=http://ba.com 时,白名单里会检查到含有a.com这个域名,直接跳转,并不会检查这个域名的整个信息,然后可以利用这个问题,直接注册一个ba.com这个域名就可以利用这个跳转。

多重验证&跳转绕过限制

什么是多重验证?比如登录账户后进入给手机发送验证码的页面,输入验证码进行验证时,这儿的url可能存在任意跳转的问题。
多重跳转的问题导致可绕过url限制:
http://www.a.com/abc/?url=http://login.a.com/abc?url=http://login.a.com
当然,还有更多重的,这个结构的多重跳转,修改最后面的url就可以达到任意url跳转,中间的url就没必要动。

点击触发达到绕过url跳转限制

在很多登录页面的地方,其url是一个跳转的url,如:http://www.a.com/abc/?url=http://test.com ,直接修改后面的任意url,胆汁仍停留在原地,似乎没什么问题,但是,当输入账号和密码后点击登录按钮后,就会触发跳转,此时的账号密码不一定是对的,

利用超链接绕过可信站点限制

一个URL,它是可以直接跳转的,但是一般测试跳转时大家习惯用www.baidu.com 或qq.com这样的可信站点进行测试,但是有些网站是可以跳转这些网站的,只要是可信站点且常用,基本都可以跳转,那么这就属于正常的业务逻辑了。
难道就这样错失一个URL跳转漏洞了?其实不然,只要你的URL被百度收录过,那么直接搜索你的域名,site:xxx.xxx 因为你在百度里点击你的域名,它会先是一个302跳转,而这个302跳转就是百度下的302跳转,那么这样就可以绕过可信站点的限制,从而达到跳转到指定URL,当然,百度这个302有点长,你给它进行加密就行。

POST参数中的URL跳转

当然,这个影响就很小了,比如当你填什么表格或者需要填写什么的,当你上传图片,点击下一步的时候,通常下一步就是预览你填写的信息,最后才是提交,当你上传了图片后点击下一步抓包,如果过滤不严,你会看到图片的完整地址包含在POST参数里,你就可以直接修改这个地址为任意URL,然后到达下一步,这时是确定信息也就是预览自己填写的信息的正确还是不正确,由于你刚刚修改了图片地址,这里是没有显示出来的,图像会是一个小XX,当点击图片右键选择查看图像时,就会触发URL跳转问题,其实这个也可以利用来进行钓鱼,钓后台审核员的信息,为什么呢,比如审核看到图片无法加载,一般都会点击查看图片,然后跳转,如果安全意识不知就会造成安全影响。

当然,如果POST参数里就只是URL跳转参数,那么你可以给它转成GET方式,然后进行跳转就可以了,只要网站支持这样的GET方式就行,在Burp Suite里可以一键转换提交方式,右键选择Change request method就可以!

利用xip.io绕过

请求是http://www.127.0.0.1.xip.io 这个绕过是在SSRF场景中的绕过,比如SSRF要读取内网地址,一般都做了限制,可以尝试用这方法进行绕过限制,从而访问到内网。

另外,URL跳转涉及的安全问题,大家常见的就是钓鱼,那么利用这个思路也可达成一个钓鱼问题,如,http://www.qq.com.220.181.57.217.xip.io ,当你访问qq这个域名时,其实这个链接已经被解析到后面这个ip地址上了,那么实际访问的就是后面这个IP地址。

漏洞修复的方法

  1. 若跳转的URL事先是可以确定的,包括url和参数的值,则可以在后台先配置好,url参数只需传对应url的索引即可,通过索引找到对应具体url再进行跳转;
  2. 若跳转的URL事先不确定,但其输入是由后台生成的(不是用户通过参数传人),则可以先生成好跳转链接然后进行签名,而跳转cg首先需要进行验证签名通过才能进行跳转;
  3. 若1和2都不满足,url事先无法确定,只能通过前端参数传入,则必须在跳转的时候对url进行按规则校验:即控制url是否是你们公司授权的白名单或者是符合规定的url:

    1
    2
    3
    function checkURL ( sURL) {
    return (/^(https?:\/\/)?[\w-.]+.(yourDomainA|yourDomainB|yourDomainC).com($|\/|\)/i).test(sUrl)||(/^[\w][\w\/.-_%]+$/i).test(sUrl)||(/^[\/\][^\/\]/i).test(sUrl) ? true : false;
    }
  4. XSS漏洞的注意事项 :跳转url检测中也加入了CRLF头部注入漏洞的检测逻辑, 具体就是在请求参数中加入了%0d%0a这种测试代码,需要对这些参数进行删除处理(事实上:在判断到一个参数中包含 %00 -> %1f 的控制字符时都是不合法的,需对其进行删除)。