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);

  

原文地址:https://www.cnblogs.com/leeyongbard/p/9958302.html

时间: 2024-10-12 22:21:06

URL重定向及跳转漏洞的相关文章

URL重定向漏洞,python打造URL重定向漏洞检测脚本

前言: 今天学习了重定向漏洞,这个漏洞比较好理解 漏洞名:URL重定向漏洞 威胁:低 漏洞的来源:开发者对head头做好对应的过滤和限制 例子: 有漏洞的网站:http://a.com/x.php?url=http://a.com/login.php 这时我们通过写个url后面的链接让其跳转到指定的页面.例:http;//a.com/x.php?url=http://www.baidu.com 可搭配使用的漏洞: CSRF  当一个网站存在CSRF漏洞的时候,而你知道了创建后台管理员的链接.修改

Web安全之url跳转漏洞及bypass总结

0x01 成因 对于URL跳转的实现一般会有几种实现方式: META标签内跳转 javascript跳转 header头跳转 通过以GET或者POST的方式接收将要跳转的URL,然后通过上面的几种方式的其中一种来跳转到目标URL.一方面,由于用户的输入会进入Meta,javascript,http头所以都可能发生相应上下文的漏洞,如xss等等,但是同时,即使只是对于URL跳转本身功能方面就存在一个缺陷,因为会将用户浏览器从可信的站点导向到不可信的站点,同时如果跳转的时候带有敏感数据一样可能将敏感

Pikachu-目录遍历、敏感信息泄露、URL重定向

目录: 目录遍历 敏感信息泄露 URL重定向 一.目录遍历 概述 在web功能设计中,很多时候我们会要将需要访问的文件定义成变量,从而让前端的功能便的更加灵活. 当用户发起一个前端的请求时,便会将请求的这个文件的值(比如文件名称)传递到后台,后台再执行其对应的文件. 在这个过程中,如果后台没有对前端传进来的值进行严格的安全考虑,则攻击者可能会通过“../”这样的手段让后台打开或者执行一些其他的文件. 从而导致后台服务器上其他目录的文件结果被遍历出来,形成目录遍历漏洞.   你可以通过“../..

Pikachu:目录遍历、敏感信息泄漏及URL重定向

目录遍历: 在web功能设计中,很多时候我们会要将需要访问的文件定义成变量,从而让前端的功能便的更加灵活. 当用户发起一个前端的请求时,便会将请求的这个文件的值(比如文件名称)传递到后台,后台再执行其对应的文件. 在这个过程中,如果后台没有对前端传进来的值进行严格的安全考虑,则攻击者可能会通过“../”这样的手段让后台打开或者执行一些其他的文件. 从而导致后台服务器上其他目录的文件结果被遍历出来,形成目录遍历漏洞. 看到这里,你可能会觉得目录遍历漏洞和不安全的文件下载,甚至文件包含漏洞有差不多的

百度跳转漏洞

不知道这算不算漏洞,我觉得是有一定的危险的. 偶然间在百度贴吧发现一个帖子是这样的: 点击之后会跳转到http://zmb338.com ,奇怪的是这个回复并没有被贴吧系统删除掉. 我试了一下,下面这两个帖子都没有被百度删除掉. 这说明百度对站点m.baidu.com不过滤,这是第一个存在的问题,第二是百度自己没有对http://m.baidu.com/相关跳转url的参数过滤. 这种跳转漏洞很容易被钓鱼,比如我可以构造这样一个URL,附加一些欺诈信息,比如你的账户最近被异地登陆,请点击下面的网

PHP网站实现地址URL重定向

网站建设中,通常会用到网站地址URL的重定向,这样的好处是有利于你网站的SEO优化,也就是让你的网站实现伪静态,下面简单介绍一下实现的两种方法: 1.在Apache配置文件中设置重定向 首先找到Apache配置文件httpd.conf,在配置文件中找到下面代码 LoadModule rewrite_module modules/mod_rewrite.so,将其打开(就是将前面#去除). 然后打开输出phpinfo()函数,如果在模块中开启了mod_rewrite模块,就说明上面一步成功啦,如下

Apache Rewrite url重定向功能的简单配置

Rewrite url重定向就是实现URL的跳转和隐藏真实地址,基于Perl语言的正则表达式规范.平时帮助我们实现拟静态,拟目录,域名跳转,防止盗链等 1.Apache Rewrite的主要功能 就是实现URL的跳转和隐藏真实地址,基于Perl语言的正则表达式规范.平时帮助我们实现拟静态,拟目录,域名跳转,防止盗链等 2.Apache Rewrite的配置 Apache下的Rewrite配置主要有两种,一种是针对整个apache服务器的配置,此种配置的Rewrite规则是直接在httpd.con

使用.htaccess实现apache URL重定向

一.什么是URL重定向? URL重定向(URL redirection,或称网址重定向或网域名称转址),是指当使用者浏览某个网址时,将他导向到另一个网址的技术. 二.URL重定向怎么配置? 1)首先需要apache开启重定向,修改httpd.conf配置: 1 查找: 2 Options FollowSymLinks 3 AllowOverride None 5 改为: 6 Options FollowSymLinks 7 AllowOverride All 2)去掉下面的注释 LoadModu

nginx的URL重定向功能

nginx的重定向和nginx的反向代理的原理还是有区别的.当把nginx用作URL重定向功能时,当客户端访问网站时,nginx会自动把网站链接跳转到指定的地址,在客户端浏览器地址栏会发现明明访问的是A域名(ip),却显示出了访问B域名(ip),也就是nginx把收到的客户端的请求后把客户端要请求的信息对应的服务器地址发给客户端,让客户端自己去获取,而nginx会返回302正确信息,这就是nginx的URL的重定向功能(rewrite):而nginx作为反向代理服务器时,当浏览器访问网站时,ng