漏洞描述

服务端未对传入的跳转 URL 变量进行检查和控制,可能导致可恶意构造任意一个恶意地址,诱导用户跳转到恶意网站。 由于是从可信的站点跳转出去的,用户会比较信任,所以跳转漏洞一般用于钓鱼攻击,通过转到恶意网站欺骗用户输入用户名和密码盗取用户信息,或欺骗用户进行金钱交易;还可以造成 xss 漏洞

漏洞检测

修改参数中的合法 URL 为非法 URL,然后查看是否能正常跳转或者响应包是否包含了任意的构造 URL

绕过 URL 跳转限制

利用问号绕过限制

比如:http://www.aaa.com/acb?Url=http://login.aaa.com 这是一个跳转链接,跳转到它的二级域名下,那么这个问号放哪里可以绕过呢?其实就是放到它自身的域名前面也就是你添加的想要跳转的域名的后面,如:http://www.aaa.com/acb?Url=http://test.com?login.aaa.com 。那么,它其实是会跳转到这个 test.com 域名下,这个域名是我想要跳转的任意域名,而后面的它自身域名一定要带上,不带上就无法辅助用问号 ? 这个特性来跳转到指定域名了,而跳转后,问号和问号后面的内容会变为这样:http://www.test.com/?login.aaa.com

利用反斜杠和正斜杠绕过限制

比如:http://www.aaa.com/acb?Url=http://login.aaa.com/ 同样是在它本身域名前加上正斜杠,然后正斜杠前面跟上你想跳转的域名地址 如:http://www.aaa.com/acb?Url=http://test.com/login.aaa.com

反斜杠有三种思路 (1)两个反斜杠绕过方法 比如:http://www.aaa.com/acb?Url=http://login.aaa.com/ 同样是在它本身域名前加上两个反斜杠,然后两个反斜杠前面跟上你想跳转的域名地址 如:http://www.aaa.com/acb?Url=http://test.com\\login.aaa.com (2)一个反斜杠绕过方法 如:http://www.aaa.com/acb?Url=http://test.com\login.aaa.com (3)另一种思路,一个反斜杠一个点 利用.这样的格式,也就是一个反斜杠加一个点来跳过限制, 如:http://www.aaa.com/acb?Url=http://test.com\.login.aaa.com

利用@绕过 URL 限制

如果你用这方法在火狐里进行跳转,会有弹窗提示,在其它游览器则没有。 如:http://www.aaa.com/acb?Url=http://login.aaa.com@test.com后面的test.com就是要跳转到的域名,前面的域名都是用来辅助以绕过限制的

利用#号绕过

如:http://www.aaa.com/acb?Url=http://test.com#login.aaa.com

利用白名单缺陷绕过限制

有的域名白名单限制是不全的,比如如果想利用一个跳转,而这个跳转是通用,在这个公司网站很多子域名等都可以跳转,那么你买个域名也不算贵对吧,为什么这么说呢,这个问题就是白名单限制不当,比如,当跳转的域名包含这个网站下的所有域名,比如:http://www.aaa.com/acb?Url=http://login.aaa.com,这个 login.aaa.com 也可以改成 aaa.com 同样可以跳转对吧,因为白名单里只要有包含这个域名就直接成功跳转。那么当我在这个域名前面加上如 testaaa.com ,白名单里会检查是否包含 aaa.com 这个域名,包含,然后直接跳转,而并没有检查这个域名的整个信息,然后可以利用这个问题,直接注册一个 testaaa.com 这个域名就可以利用这个跳转。

多重验证&跳转绕过限制

现在很多网站都有多重验证,比如你登陆账户后会出现另一个验证页面,输入手机验证码进行验证,此时这上面的 URL 很可能存在任意跳转的问题。 多重跳转的问题导致可绕过 URL 限制 比如 http://www.aaa.com/acb?Url=http://login.aaa.com/acb?url=http://login.aaa.com 。当然,还有多重的,这个结构的多重跳转你修改最后面的 URL 就可以达到任意 URL 跳转,中间的 URL 就没必要动了。

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

比如很多登陆页面的地方,其 URL 是一个跳转的 URL,如:http://www.aaa.com/acb?Url=http://test.com。你直接修改了后面为任意URL,但是还是停留在原地,似乎没什么问题,但是,当你输入账号和密码后点击登陆按钮后,就会触发跳转,当然,这个账户和密码不一定要对的,随便都可以,但得视系统而定吧。这个我遇到了很多,比如你修改了域名,然后点击登陆,登陆成功后便可触发跳转,这也是一个比较隐蔽的绕过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;
}
  1. XSS 漏洞的注意事项 :跳转 url 检测中也加入了 CRLF 头部注入漏洞的检测逻辑, 具体就是在请求参数中加入了%0d%0a 这种测试代码,需要对这些参数进行删除处理(事实上:在判断到一个参数中包含 %00 -> %1f 的控制字符时都是不合法的,需对其进行删除)。