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);
URL重定向及跳转漏洞的更多相关文章
- 代码安全丨第二期:URL重定向(跳转)漏洞
URL重定向: URL重定向(URLredirection)漏洞,又称跳转漏洞,指的是网络应用程序接受用户可控的输入作为到外部站点的链接,然后在重定向中使用该链接.该安全漏洞给网络钓鱼攻击提供了极大的 ...
- URL重定向漏洞解析
参考文章 悟空云课堂 | 第二期:URL重定向(跳转)漏洞 CWE-601: URL Redirection to Untrusted Site ('Open Redirect') 分享几个绕过URL ...
- URL重定向漏洞,python打造URL重定向漏洞检测脚本
前言: 今天学习了重定向漏洞,这个漏洞比较好理解 漏洞名:URL重定向漏洞 威胁:低 漏洞的来源:开发者对head头做好对应的过滤和限制 例子: 有漏洞的网站:http://a.com/x.php?u ...
- url跳转漏洞(1)
转载 https://landgrey.me/open-redirect-bypass/ 0x00:漏洞场景 URL跳转漏洞的出现场景还是很杂的,出现漏洞的原因大概有以下5个: 1. 写代码时没有考虑 ...
- PJzhang:URL重定向漏洞的72般变化
猫宁!!! 反射型xss的利用可以给对方发送钓鱼链接,窃取对方cookie,进入对方账户. 利用url重定向漏洞,发送给对方一个钓鱼链接,重定向到一个恶意网页,比如一个假的银行网站,被盗取账号密码 ...
- URL跳转漏洞
URL跳转原理: 由于越来越多的需要和其他第三方应用交互,以及在自身应用内部根据不同的逻辑将用户引向到不同的页面,譬如一个典型的登录接口就经常需要在认证成功之后将用户引导到登录之前的页面,整个过程中如 ...
- Web安全之url跳转漏洞及bypass总结
0x01 成因 对于URL跳转的实现一般会有几种实现方式: META标签内跳转 javascript跳转 header头跳转 通过以GET或者POST的方式接收将要跳转的URL,然后通过上面的几种方式 ...
- Url跳转漏洞常见
Url跳转漏洞常见出现点: 1.用户登录.统一身份认证处,认证完后会跳转. 2.用户分享.收藏内容过后,会跳转. 3.跨站点认证.授权后,会跳转. 4.站内点击其它网址链接时,会跳转. Url跳转漏洞 ...
- 使用.htaccess实现apache URL重定向
一.什么是URL重定向? URL重定向(URL redirection,或称网址重定向或网域名称转址),是指当使用者浏览某个网址时,将他导向到另一个网址的技术. 二.URL重定向怎么配置? 1)首先需 ...
随机推荐
- 阿里巴巴 Java 代码规范
1. 抽象类命名使用 Abstratc开头. 2. 阿里强制规定不允许任何魔法值(未经定义的常量)直接出现在代码中.魔法值会让代码的可读性大大降低,而且如果同样的数值多次出现时,容易出现不清楚这些数值 ...
- usdt钱包开发,比特币协议 Omni 层协议 USDT
usdt钱包开发 比特币协议 -> Omni 层协议 -> USDT USDT是基于比特币omni协议的一种代币: https://omniexplorer.info/asset/31 I ...
- Spring IOC 和 AOP
一. IOC 1. 概念及原理 IOC: Inversion of Control(控制反转)是一种设计思想,就是容器控制应用程序所需要的外部资源的创建和管理,然后将其反转给应用程序.对象及其依赖对象 ...
- 获取select被选中的option的值
<select id="select"> <option>绥江</option> <option>西江</ ...
- 【react开发】使用swiper插件,loop:true时产生的问题解决方案
这2天上班遇到的问题:react使用swiper3插件实现banner轮播,其中有个banner图有个click点击事件,而其他的是页面跳转.出现了一个问题: 就是向右滑动到该帧时的swiper,点击 ...
- xtrabackup 对pxc节点进行备份恢复
xtrabackup 对pxc节点进行备份恢复 全量备份一个节点的数据,当节点挂掉时,使用备份恢复到最近状态,再启动节点加入集群. 备份 xtrabackup 命令小解释: --defaults-fi ...
- Sort aborted Error in MySQL Error Log
现象 [ERROR] lines containing "Sort aborted" are present in the MySQL error log file. [Warni ...
- Spring Boot 整合Mybatis非starter时,mapper一直无法注入解决
本来呢,直接使用mybatis-spring-boot-starter还是挺好的,但是我们系统比较复杂,有多个数据源,其中一个平台自己的数据源,另外一些是动态配置出来的,两者完全没有关系.所以直接使用 ...
- log4j配置目标到mongodb
首先,具体采用什么技术作为集中式存储方案在99%的应用中应该来说并没有多大区别,最重要的是要定期清理不必要的日志,以及日志格式设计(也可以重写org.log4mongo.MongoDbPatternL ...
- ldap集成nginx
nginx版本:1.10.2 nginx安装: wget http://nginx.org/download/nginx-1.10.2.tar.gz tar zxvf nginx-1.10.2.tar ...