博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
URL重定向及跳转漏洞
阅读量:4629 次
发布时间:2019-06-09

本文共 2116 字,大约阅读时间需要 7 分钟。

URL跳转漏洞

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

使用场景

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

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

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

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

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

防御策略

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

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

 

常用的方式:

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

 

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

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>/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

你可能感兴趣的文章
用Maven创建第一个web项目
查看>>
php中的抽象类(abstract class)和接口(interface)
查看>>
linux安装ActiveMQ
查看>>
面向对象与软件工程---团队作业1
查看>>
认识一下Kotlin语言,Android平台的Swift
查看>>
hdu5389 Zero Escape
查看>>
【转】android电池(四):电池 电量计(MAX17040)驱动分析篇
查看>>
android中的回调
查看>>
redis启动、清缓存命令
查看>>
Java的Clone
查看>>
CSS 弹出层 支持IE/FF/OP
查看>>
maven的配置-2019-4-13
查看>>
进程调度
查看>>
百练 2973 Skew数 解题报告
查看>>
C# 温故而知新:Stream篇(二)
查看>>
回首2016,展望2017
查看>>
你为什么应该经常访问招聘网站?招聘网站至少有4个方面的价值!
查看>>
HashMap源码分析(一)
查看>>
玩转Android之二维码生成与识别
查看>>
Python学习之路基础篇--10Python基础,函数进阶
查看>>