URL重定向及跳转漏洞

URL跳转漏洞

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

使用场景

   现在 Web 登录很多都接入了QQ、微信、新浪等第三方登录,以 QQ 第三方授权登录为例说明,在我们调用 QQ 授权服务器进行授权时,会在参

数中传入redirect_url(重定向)地址,告知 QQ 授权服务器,授权成功之后页面跳转到这个地址,然后进行站点登录操作。但是如果你的重定向地址在

传输过程中被篡改成了一个钓鱼网址,那么就是导致用户的授权信息被非法获取。当然,QQ 第三方登录,也会有自己的策略,就是接入 QQ 第三方

登录的应用,会在开发者平台,配置相关的跳转白名单,只有属于白名单中的域名、子域名或 url ,QQ授权服务器才跳转,如果发现 redirect_url 不

合法,则跳转到非法页面。

防御策略

   根据上面的场景分析,我们知道,之所以会出现跳转 URL 漏洞,就是因为服务端没有对客户端传递的跳转地址进行合法性校验,所以,预防这种攻

击的方式,就是对客户端传递过来的跳转 URL 进行校验。

常用的方式:

服务端配置跳转白名单或域名白名单,只对合法的 URL 做跳转

下面是关于PHP服务端对客户端传递过来的跳转 URL 进行校验的代码:

<?php

// $allowedDomains 表示允许跳转的url白名单
$allowedDomains = array(
		"aaaa.com"
		"bbbb.com"
		.......	
	);
function encodeUrl($urlInfo)
    {/*{{{*/
        $path = isset($urlInfo['path']) ? $urlInfo['path'] : '';
        if(!empty($path))
        {
        	$t = explode("/", $path);
        	
        	for($i = 0; $i < count($t); $i++)
        	{
        		$t[$i] = rawurlencode($t[$i]);        		
        	}
        	$path = implode("/", $t);
        }
    	$query = isset($urlInfo['query']) ? $urlInfo['query'] : '';
        if(!empty($query))
        {
        	$t = explode("&", $query);
        	
        	for($i = 0; $i < count($t); $i++)
        	{
        		$tt = explode("=", $t[$i]);
        		$tt[1] = rawurlencode($tt[1]);
        		$t[$i] = implode("=", $tt);        		
        	}
        	$query = implode("&", $t);
        }
        if(!isset($urlInfo['host']) || empty($urlInfo['host']))
        {
        	return $path. "?". $query;
        }
        $scheme = isset($urlInfo['scheme']) ? $urlInfo['scheme'] : 'http';
        $port = isset($urlInfo['port']) ? $urlInfo['port'] : 80;

        
        $request = $scheme . '://'. $urlInfo['host'];
        $request .= ($port == 80) ? '' : ':'.$port;
        $request .= $path;
        $request .= (empty($query)) ? '' : '?'.$query;
        return $request;
    }/*}}}*/
	
function checkUrl($url,$domainArr=array())
	{/*{{{*/
		$res = array('isTrustedDomain' => false,'url' => '','domain' => '');
		if(empty($url))		return $res;
		$domainArr = empty($domainArr) || !is_array($domainArr) ? $allowedDomains : $domainArr;
		$url	  = filterUrl($url);//先过滤特殊字符
		$p      = parse_url($url);
		$scheme = $p['scheme'];
		if(!in_array(strtolower($scheme),array('http','https'))){
			return $res;
		}
		
		$host   = $p['host'];
		if(!isValidHost($host)){
			return $res;
		}
		$hostLen = strlen($host);
		foreach($domainArr as $domain){
			$firstPos = strpos($host, $domain);
			if($firstPos !== false && ($firstPos + strlen($domain)) == $hostLen){
				
				if($firstPos == 0 || $domain[0] == '.' || $host[$firstPos-1] == '.'){
					$res['isTrustedDomain'] = true;
					$res['url'] 		  				= $url;
					$res['domain'] 				= $domain;
					break;
				}
			}
		}
		return $res;
	}/*}}}*/

function filterUrl( $url )
	{/*{{{*/
		if(empty($url)) return $url;
		// Strip all of the Javascript in script tags out...
		$url = preg_replace('/<SCRIPT.*?<\/SCRIPT>/ims',"",$url);
		// Strip all blank character
		$url = preg_replace('/[\s\v\0]+/',"",$url);
		//Strip special characters(',",<,>,\)
		$url = str_replace(array("'","\"","<",">","\\"),'',$url);
		return $url;
	}/*}}}*/

function isValidHost($host)
	{/*{{{*/
		$p = "/^[0-9a-zA-Z\-\.]+$/";
		return preg_match($p,$host) ? true : false;
	}/*}}}*/
	
$url = "https://www.baidu.com";
$call_back_url = trim($url);
$call_back_url = encodeUrl(parse_url(urldecode($call_back_url)));
$res = checkUrl($call_back_url, $domainArr);

var_dump($res);

### Pikachu靶场中的URL重定向实现 在Pikachu靶场中,URL重定向功能主要通过`urlredirect.php?url=`这一机制来实现[^1]。当用户访问该PHP文件并附带特定的URL参数时,服务器会将请求重定向至所提供的URL。 #### 不安全的URL跳转实例 由于缺乏必要的输入验证和过滤措施,在某些情况下,攻击者能够利用此特性进行恶意操作。例如: ```php <?php // 假设这是 urlredirect.php 的简化版本 if (isset($_GET['url'])) { $targetUrl = $_GET['url']; header("Location: " . $targetUrl); } ?> ``` 上述代码片段展示了如何简单地获取用户提交的目标URL,并直接执行HTTP头部重定向命令。然而,这种方式极易受到URL重定向漏洞的影响,因为任何传入的有效URL都将被执行跳转动作[^2]。 #### 安全实践建议 为了避免潜在的安全风险,应当采取更为严谨的方法处理URL重定向逻辑。具体来说,应该考虑如下几点改进方案: - **固定重定向路径**:尽可能使用预先设定好的、可信的URL列表作为可能的目的地选项之一;而不是依赖于动态构建或完全由客户端控制的URL字符串[^3]。 - **实施严格的输入校验**:对于所有来自外部的数据都要进行全面而细致的审查工作,确保只允许合法合理的值进入后续业务流程之中。比如可以通过正则表达式匹配等方式限定可接受范围内的字符集组成规则等[^4]。 - **应用白名单策略**:建立一个已知良好站点域名集合,仅限这些经过认证后的资源才能成为有效的重定向目标对象。这样即使遇到非法尝试也能有效拦截下来而不至于造成实际危害[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值