一、漏洞描述

  • URL跳转漏洞,也叫开放重定向漏洞(open redirect) 。

  • CWE-601对该漏洞的描述为:http参数可能包含一个URL值,并且可能导致Web应用程序将请求重定向到指定的URL。通过修改恶意站点的URL值,攻击者可能发起网络钓鱼诈骗并窃取用户凭据。是参数可控导致的漏洞产生。

  • URL跳转漏洞是指后台服务器在告知浏览器跳转时,未对客户端传入的重定向地址进行合法性校验,导致用户浏览器跳转到钓鱼页面的一种漏洞。

  • 简单来说就是在网页进行重定向的时候,将重定向的目的URL修改为攻击者构造的恶意页面,达到钓鱼或者窃取敏感信息等目的。

  • 现在Web登录很多都接入了QQ、微信、新浪等第三方登录,以QQ第三方授权登录举例

    • 我们调用QQ授权服务器进行授权时,会在参数中传入redirect_url(重定向)地址,告知QQ授权服务器,授权成功之后页面跳转到这个地址,然后进行站点登录操作。

    • 但是如果重定向地址在传输过程中被篡改成了一个钓鱼网址,那么就是导致用户的授权信息被非法获取。

    • 当然,QQ第三方登录也会有自己的策略,接入QQ第三方登录的应用会在开发者平台,配置相关的跳转白名单,只有属于白名单中的域名、子域名或URL,QQ授权服务器才跳转,如果发现redirect_url不合法,则跳转到非法页面

  • 重定向的类型:

    • 永久重定向:这种方式表示原URL不应再被使用,应该优先选用新的URL。相关的状态码为301(Moved Permanently)、308(Permanent Redirect)

    • 临时重定向:有时候请求的资源无法从其标准地址访问,但是却可以从另外的地方访问。相关状态码为302(Found)、303(See Other)、307(Temporary Redirect)

    • 特殊重定向:这种方式的状态码为300(Multiple Choice)、304(Not Modified)。300是手工重定向,用户自行选择web页面展示的重定向链接列表。304会使页面跳转到本地陈旧的缓存版本当中。

  • 重定向的方法

    • HTTP协议的重定向:也就是状态码

    • 使用HTMl的meta元素进行重定向:<meta http-equiv="Refresh" content="0; URL=http://example.com/" />(这个方法只适用于html页面)

    • 借助DOM的js重定向:window.location = "http://lazy.com/";(这种方法只能在支持js的客户端使用)

二、URL重定向及跳转漏洞漏洞产生的原因和危害:

  • 原因

    • 代码层忽视URL跳转漏洞,或不知道/不认为这是个漏洞;

    • 代码层过滤不严,用取子串、取后缀等方法简单判断,代码逻辑可被绕过;

    • 对传入参数操作(域名剪切/拼接/重组)和判断不当,导致绕过;

    • 原始语言自带的解析URL、判断域名的函数库出现逻辑漏洞或者意外特性;

    • 服务器/容器特性、浏览器等对标准URL协议解析处理等差异性导致被绕过;

  • 危害:URL跳转漏洞本身属于低危漏洞,但可以结合其他漏洞深入利用

    • 获取用户权限(伪造钓鱼网站、窃取登录凭证token)

    • 绕过检测(窃取CSRF token,绕过SSRF、RCE黑名单)

    • xss、csrf等漏洞组合扩大危害

三、代码分析

  • 靶场代码路径:\WWW\pikachu\vul\urlredirect

四、URL重定向跳转攻击利用思路

  • 构造有危害的钓鱼页面,通过这个URL进行跳转。

  • 安全意识低的用户会误以为是当前信任页面发出来的链接,生成的恶意链接,用户访问后,可能会产生欺诈行为

  • 同时由于QQ,淘宝等基础URL过滤,但是也是基于白名单的方式放行,所以导入URL可以在这些软件上大范围传播,从而产生危害

五、利用方式介绍

  • 开启Burp,先多点击WEB页面的功能点

  • 然后打开Burp的Logger(日志)模块,过滤出状态码为302的数据包(URL跳转的转状态码)

  • 此时选择一个请求包中带有URL的包,发送到Repeater

  • 此时,将原始数据包中即将跳转的URL改成一个比较小众的网站地址,然后发送该数据包,查看响应包中的Location字段是否为改完的那个地址,如果一样,证明存在URL跳转漏洞

六、防御思路简介

  • referer限制:如果确定传递URL参数进入的来源,可以通过该方式实现安全限制,保证该URL的有效性,避免恶意用户生成跳转链接

  • 加入有效性验证Token:保证所有生成的链接都是来自于可信域,通过在生成的链接里加入用户不可控的Token,对生成的链接进行校验,可以避免用户生成自己的恶意链接,但是如果功能本身要求比较开放,可能导致有一定的限制。

  • 输入验证和过滤:对用户输入的URL参数进行严格的验证和过滤,确保其符合预期的格式和类型。可以使用正则表达式、过滤器函数或其他验证方法来验证参数的有效性,并防止恶意输入。如果参数不符合要求,应该采取适当的错误处理措施,如拒绝接受或进行转换净化。

  • 白名单验证:定义一个允许的重定向目标URL白名单,只有在白名单中的URL才被认为是合法的重定向目标。对于接收到的重定向URL,与白名单中的URL进行匹配。如果URL不在白名单中,应该中止重定向或采取适当的错误处理措施。

  • 使用相对路径或绝对路径:尽量避免使用用户提供的参数直接构建重定向URL。相反,应该使用相对路径或绝对路径来构建重定向URL,以确保重定向目标的可靠性和安全性。可以使用服务器端生成URL,以避免在客户端受信任的代码中直接构建URL。

  • 编码和加密跳转地址:对跳转地址进行编码或加密,以防止攻击者构造恶意的跳转地址。可以使用URL编码函数对跳转地址进行编码,并在接收到跳转请求后进行解码。此外,还可以考虑使用加密算法对跳转地址进行加密,并在跳转之前进行解密操作。

  • 安全性检查:在进行跳转之前,对跳转地址进行安全性检查。确保跳转地址不会导致应用程序的安全漏洞,比如跳转到未授权的页面、执行危险的操作或暴露敏感信息。

  • 最小权限原则:限制应用程序的重定向功能,仅在必要时才使用。确保应用程序的重定向功能不会被滥用,以减少潜在的安全风险。

  • 定期审查和更新:定期审查应用程序的重定向功能,确保没有新的安全漏洞出现。同时,及时更新应用程序和相关依赖库,以修复已知的安全漏洞。