URL跳转漏洞描述
服务端未对传入的跳转url变量进行检查和控制,可导致恶意用户构造一个恶意地址,诱导用户跳转到恶意网站。
跳转漏洞一般用于钓鱼攻击,通过跳转到恶意网站欺骗用户输入用户名和密码来盗取用户信息,或欺骗用户进行金钱交易;还可以造成xss漏洞。
常见的可能产生漏洞的参数名redirect,redirect_to,redirect_url,url,jump,jump_to,target,to,link,linkto,domain
漏洞产生地方:
1. 用户登录、统一身份认证处,认证完后会跳转
2. 用户分享、收藏内容过后,会跳转
3. 跨站点认证、授权后,会跳转
4. 站内点击其它网址链接时,会跳转
URL漏洞检测
修改参数中合法的URL为非法URL,然后查看是否能正常跳转或者响应是否包含了任意的构造URL.
实现方式
1.META标签内跳转
2.javascript跳转
3.header跳转
绕过URL跳转限制
1.利用?号绕过限制
比如:http://www.aaa.com/acb?Url=http://login.aaa.com
这是一个跳转链接,跳转到它的二级域名下,那么这个问号放哪里可以绕过呢?其实就是放到它自身的域名前面也就是你添加的想要跳转的域名的后面,如:http://www.aaa.com/acb?Url=http://test.com?login.aaa.com 。它其实是会跳转到这个test.com域名下,这个域名是我想要跳转的任意域名,而后面的它自身域名一定要带上,不带上就无法辅助用问号?这个特性来跳转到指定域名了,而跳转后,问号和问号后面的内容会变为这样:http://www.test.com/?login.aaa.com(引用)
2.利用反斜杠和正斜杠绕过限制
比如:http://www.aaa.com/acb?Url=http://login.aaa.com/ 同样是在它本身域名钱加上正斜杠,然后正斜杠前面跟上你想跳转的域名地址
如:http://www.aaa.com/acb?Url=http://test.com/login.aaa.com
反斜杠有三种思路
(1)两个反斜杠绕过方法
比如:http://www.aaa.com/acb?Url=http://login.aaa.com/ 同样是在它本身域名钱加上两个反斜杠,然后两个反斜杠前面跟上你想跳转的域名地址
如:http://www.aaa.com/acb?Url=http://test.com\login.aaa.com
(2)一个反斜杠绕过方法
如:http://www.aaa.com/acb?Url=http://test.com\login.aaa.com
(3)另一种思路,一个反斜杠一个点
利用.这样的格式,也就是一个反斜杠加一个点来跳过限制,
如:http://www.aaa.com/acb?Url=http://test.com.login.aaa.com(引用)
3.利用@绕过URL限制
如果你用这方法在火狐里进行跳转,会有弹窗提示,在其它游览器则没有。
如:http://www.aaa.com/acb?Url=http://login.aaa.com@test.com后面的test.com就是要跳转到的域名,前面的域名都是用来辅助以绕过限制的(引用)
4.利用#号绕过
如:http://www.aaa.com/acb?Url=http://test.com#login.aaa.com(引用)
5.利用白名单缺陷绕过
有的域名白名单限制是不全的,比如如果想利用一个跳转,而这个跳转是通用,在这个公司网站很多子域名等都可以跳转,那么你买个域名也不算贵对吧,为什么这么说呢,这个问题就是白名单限制不当,比如,当跳转的域名包含这个网站下的所有域名,比如:
http://www.aaa.com/acb?Url=http://login.aaa.com,这个login.aaa.com也可以改成aaa.com同样可以跳转对吧,因为白名单里只要有包含这个域名就直接成功跳转。那么当我在这个域名前面加上如testaaa.com,白名单里会检查是否包含aaa.com这个域名,包含,然后直接跳转,而并没有检查这个域名的整个信息,然后可以利用这个问题,直接注册一个testaaa.com这个域名就可以利用这个跳转。(引用)
6.多重验证&跳转绕过限制
现在很多网站都有多重验证,比如你登陆账户后会出现另一个验证页面,输入手机验证码进行验证,此时这上面的URL很可能存在任意跳转的问题。
多重跳转的问题导致可绕过URL限制
比如http://www.aaa.com/acb?Url=http://login.aaa.com/acb?url=http://login.aaa.com。当然,还有多重的,这个结构的多重跳转你修改最后面的URL就可以达到任意URL跳转,中间的URL就没必要动了。(引用)
7.点击触发达到绕过URL跳转限制
比如很多登陆页面的地方,其URL是一个跳转的URL,如:http://www.aaa.com/acb?Url=http://test.com。你直接修改了后面为任意URL,但是还是停留在原地,似乎没什么问题,但是,当你输入账号和密码后点击登陆按钮后,就会触发跳转,当然,这个账户和密码不一定要对的,随便都可以,但得视系统而定吧。这个我遇到了很多,比如你修改了域名,然后点击登陆,登陆成功后便可触发跳转,这也是一个比较隐蔽的绕过URL限制的跳转。(引用)
8.POST参数中的URL跳转
当你填什么表格或者需要填写什么的,当你上传图片,点击下一步的时候,通常下一步就是预览你填写的信息,最后才是提交,当你上传了图片后点击下一步抓包,如果过滤不严,你会看到图片的完整地址包含在POST参数里,你就可以直接修改这个地址为任意URL,然后到达下一步,这时是确定信息也就是预览自己填写的信息的正确还是不正确,由于你刚刚修改了图片地址,这里是没有显示出来的,图像会是一个小XX,当点击图片右键选择查看图像时,就会触发URL跳转问题,其实这个也可以利用来进行钓鱼,钓后台审核员的信息(引用)
8.利用xip.io绕过
请求是http://www.127.0.0.1.xip.io 这个绕过是在SSRF场景中的绕过,比如SSRF你要读取内网地址,一般都做了限制,可以尝试用这方法进行绕过限制,从而访问到内网。
另外一点,URL跳转涉及的安全问题大家常见的就是钓鱼,那么利用这个思路也可达成一个钓鱼问题,如,http://www.qq.com.220.181.57.217.xip.io 当你访问qq这个域名时,其实这个链接已经被解析到后面这个ip地址上了,那么实际访问的就是后面这个IP地址。(引用)
漏洞修复的方法
1. 若跳转的URL事先是可以确定的,包括url和参数的值,则可以在后台先配置好,url参数只需传对应url的索引即可,通过索引找到对应具体url再进行跳转;
2. 若跳转的URL事先不确定,但其输入是由后台生成的(不是用户通过参数传入),则可以先生成好跳转链接然后进行签名,而跳转cg首先需要进行验证签名通过才能进行跳转;
3. 若1和2都不满足,url事先无法确定,只能通过前端参数传入,则必须在跳转的时候对url进行按规则校验:即控制url是否是你们公司授权的白名单或者是符合你们公司规则的url:
4. XSS漏洞的注意事项 :跳转url检测中也加入了CRLF头部注入漏洞的检测逻辑, 具体就是在请求参数中加入了%0d%0a这种测试代码,需要对这些参数进行删除处理(事实上:在判断到一个参数中包含 %00 -> %1f 的控制字符时都是不合法的,需对其进行删除)。
5. 开源项目及时进行升级,如Django升级 pip install django --upgrade
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
相关背景
现在web应用越来越多的需要和其他第三方应用交互,以及在自身应用内部根据不同的逻辑引向不同的页面。例如一个典型的场景就是:web站点可以使用第三方账号(如qq,微博等)进行登录,在登录时就会发生跳转,如果在这个过程中没有做好安全策略就会产生安全漏洞。例如可以利用恶意的URL跳转进行钓鱼等。
URL重定向(301/302)
301重定向:当域名或者网址永久弃用后,为了方便可以将此域名或网址重定向到新的域名或URL
302重定向:当域名或网址临时弃用时,为了方便可以将此域名或网址重定向到新的域名或URL
302URL劫持与302任意URL跳转的不同点
302——URL劫持是由于搜素引擎的算法导致的问题。例如A网站暂时弃用,要302重定向到B网站,但是由于B网站URL太过复杂,而搜索引擎的算法判定A网址更加适合,所以爬取的还是A网址,这个时候访问网站是显示的URL是A网站的,而显示的内容是B网站的,造成了302重定向——URL劫持。
302——任意URL跳转是用户可以直接控制URL跳转的参数或者通过一些绕过方式控制URL跳转的位置造成的问题。
成因
web站点或者第三方的服务端没有对用户输入的参数进行合法性校验,或者校验不严格,在URL跳转时用户可控,导致恶意参数的传入以及执行,将应用程序引导到恶意的第三方区域产生的安全问题(短链接更加难以防范)。
WEB站点中URL跳转漏洞的发生点
用户登录、统一身份认证处、认证以后发生跳转
用户分享、收藏内容后会发生跳转
跨站点认证、在授权后会认证
站内对其他网站的链接,点击后会跳转
URL跳转的实现方式
通过META标签内跳转实例
HTML中meta标签详解
1.<meta http-equiv=”Set-Cookie” content=”cookievalue=xxx; expires=Friday,12-Jan-2001 18:18:18 GMT; path=/”>:如果网页过期,那么存盘的cookie将被删除。必须使用GMT的时间格式。
2.<meta http-equiv='expires' content='时间' >:用于设定网页的到期时间。一旦网页过期,必须到服务器上重新传输。
3.<meta http-equiv=”Refresh” content=”5;URL”>:告诉浏览器在【数字】秒后跳转到【一个网址】
4.<meta http-equiv=”content-Type” content=”text/html; charset=utf-8″>:设定页面使用的字符集。
<meta charset=”utf-8″>:在HTML5中设定字符集的简写写法。
5.<meta http-equiv=”Pragma” content=”no-cache”>:禁止浏览器从本地计算机的缓存中访问页面内容。访问者将无法脱机浏览。
6.<meta http-equiv=”Window-target” content=”_top”>:用来防止别人在iframe(框架)里调用自己的页面,这也算是一个非常实用的属性。
7.<meta http-equiv='X-UA-Compatible' content='IE=edge,chrome=1'> :强制浏览器按照特定的版本标准进行渲染。但不支持IE7及以下版本。如果是ie浏览器就用最新的ie渲染,如果是双核浏览器就用chrome内核。
<html>
<head>
<title></title>
<?php
header("Content-Type:text/html;charset=utf-8");
if(isset($_REQUEST["url"]))
{
$url = $_REQUEST["url"];
}else{
$url = "url_meta.php";
}
?>
<meta http-equiv="Refresh" content="5; url=<?php echo $url?>" />
</head>
<body>
</body>
</html>
通过JavaScript跳转
实例:
<?php
if (isset($_GET['url'])) {
$target = $_GET['url'];
echo "<script>window.location.href=\"$target\"</script>";
exit;
} else {
echo "Please input the URL";
}
?>
通过header头跳转
实例:
<?php
if (isset($_GET['url'])) {
$target = $_GET['url'];
header("Location: $target");
exit;
} else {
echo "Please input the URL";
}
?>
如果jump参数没有任何限制,用户就可以构造恶意链接进行提交造成恶意URL跳转 http://www.lsowl.xyz/aaa.php?url=http://www.eval.com ,通过恶意链接造成不可信的第三方跳转可以进一步钓鱼等(直接跳转)。
同时由于一些网站的安全策略,白名单中有 http://www.lsowl.xyz/aaa.php 而导致一些安全策略被绕过,导致用户最终访问的时恶意链接。(过滤不严格的白名单)
通过GET或POST的方式接收将要跳转的URL,然后通过上面的几种方式中的一种来跳转到目标URL。由于用户的输入会进入META,JavaScript,http头,所以都可能发生相应的上下文漏洞,如XSS等,同时URL跳转功能的特点,会在浏览器将用户从可信的站点跳转到不可信的站点,如果用户的输入带有敏感信息会泄露给不可信的第三方。
常见的发生URL跳转的参数名
redirect
redirect_to
redirect_url
url
jump
jump_to
target
to
link
linkto
domain
几种语句和框架版本常见的URL跳转代码(可以作为白盒测试的参考)
Java
response.sendRedirect(request.getParameter("url"));
PHP
$redirect_url = $_GET['url'];
header("Location: " . $redirect_url);
.NET
string redirect_url = request.QueryString["url"];
Response.Redirect(redirect_url);
Django
redirect_url = request.GET.get("url")
HttpResponseRedirect(redirect_url)
Flask
redirect_url = request.form['url']
redirect(redirect_url)
Rails
redirect_to params[:url]
网站后端对白名单限制(以PHP为例)
<?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跳转突破一些基于白名单的安全机制。如:传统的IM对URL的传播进行安全校验,但对于大站点的域名及URL直接允许通过并显示可信的URL,如果该URL中包含恶意跳转可能会导致安全限制被绕过。
基于白名单引用的资源,这种方式与上面的类似。比如:引入youku.com的视频,白名单中检测的时youku.com,如果包含恶意链接还是可能突破限制。
在带referer传输的站点中,就不只会产生任意URL跳转这个问题,同时可能会造成所有基于referer的安全策略失效(比较少见)
模拟跨域请求
在header头中跳转:(并没有带referer请求,所以这里只会产生任意URL及钓鱼诈骗等)
url.php
<?php
if (isset($_GET['url'])) {
$target = $_GET['url'];
// 使服务端进行302跳转
header("Location: $target");
//在JavaScript中跳转
// echo "<script>window.location.href=\"$target\"</script>";
exit;
} else {
echo "Please input the URL";
}
?>
referer.php
<?php
if (isset($_SERVER['HTTP_REFERER'])) {
$referer = $_SERVER['HTTP_REFERER'];
if (strpos($referer, "127.0.0.1:81")) {
echo "referer is true";
} else {
echo "Wrong referer";
}
} else {
echo "referer is null";
}
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
访问:http://127.0.0.1:81/url.php?url=http://127.0.0.1:82/referer.php
在js中跳转(带referer传输,除了任意URL跳转漏洞之外还会绕过基于referer的所有安全策略)
测试方法
抓取数据包中状态码为302的URL
修改目标地址
查看是否正常跳转(如果不存在直接返回到它自己的域名,如果存在则跳转)
尝试绕过
注意点:协议一致性问题。有些网站校验跳转后的协议必须为HTTPS,有时候无法跳转并不会提示。
常见的绕过方式(利用浏览器对URL特性的支持)
1、 “@” (在Firefox中使用会有弹窗提示,其他浏览器没有)
http://www.target.com/redirecturl=http://whitelist.com@evil.com
2、“.”
http://www.target.com/redirecturl=.eval.com
3、“/”
http://www.target.com/redirecturl=http://evil.com/whitelist.com
http://www.target.com/redirecturl=/http://evil.com
4、“\”
http://www.target.com/redirecturl=http://evil.com\a.whitelist.com
5、“\”
http://www.target.com/redirecturl=http://evil.com\\a.whitelist.com
6、“.”
http://www.target.com/redirecturl=http://evil.com\.a.whitelist.com
7、“?”
http://www.target.com/redirecturl=http://evil.com?a.whitelist.com
利用问号,这是一个特性,利用问号可以成功绕过URL限制
比如:http://www.aaa.com/acb?Url=http://login.aaa.com 这是一个跳转链接,跳转到它的二级域名下,那么这个问号放哪里可以绕过呢?其实就是放到它自身的域名前面也就是你添加的想要跳转的域名的后面,如:http://www.aaa.com/acb?Url=http://test.com?login.aaa.com 那么,它其实是会跳转到这个test.com域名下,这个域名是我想要跳转的任意域名,而后面的它自身域名一定要带上,不带上就无法辅助用问号?这个特性来跳转到指定域名了,而跳转后,问号和问号后面的内容会变为这样:http://www.test.com/?login.aaa.com
8、“#”
http://www.target.com/redirecturl=http://evil.com#a.whitelist.com
9、利用白名单缺陷绕过限制
有些域名白名单限制不严格。
1. 检测是否是当前域名
http://www.aaa.com/acb?Url=http://login.aaa.com在访问后会跳转到login.aaa.com,如果它的白名单显示不严格,将login.aaa.com改成aaa.com同样可以跳转,到这里都是合法的跳转。这时只要构造一个第三方的域名中包含aaa.com的url就可以成功跳转。如果恰好有这样一个域名,恭喜你;如果没有,就需要买一个域名。emmm..在国内这样很亏
2.域名字符串检测欺骗
http://www.aaa.com/acb?Url=http://login.aaa.com,检测login.aaa.com,直接修改为:http://www.aaa.com/acb?Url=http://login.aaa.com.www.eval.com
10、利用多重验证&跳转绕过限制
现在的许多网站都有多重验证。例如:在登录账户以后会出现另一个验证,输入手机号进行验证,这时可能存在任意URL跳转的问题。具体如下:
http://www.aaa.com/acb?Url=http:...http://login.aaa.com,这里只需要修改最后的URL来绕过限制
11、点击触发达到绕过URL跳转的限制
在许多的登录的位置,URL是一个跳转的地址。比如:http://www.aaa.com/acb?Url=http://login.aaa.com;这个时候只要将login.aaa.com修改为任意URL;这时界面没有发生变化,当用户输入账号密码点击登录按钮时会触发跳转。
需要注意的是:这里不一定要输入正确的账号密码进行跳转,有些需要,视具体的站点而定
12、利用xip.io绕过限制(还可以借鉴其余的SSRF绕过方法)
http://www.aaa.com/acb?Url=http://login.aaa.com.eval.com.xip.io
在SSRF读取内网地址的时候会有许多限制,有时候可以利用xip.io直接绕过限制读取,这里可以引用这个方法,直接将可以跳转的位置的地址后添加为任意url+xip.io,如果可以存在则将跳转的地址解析到后面的恶意url进行跳转。
13、利用超链接绕过可信站点的限制(可信站多次重定向)
例如一个存在URL跳转漏洞的位置,在测试的时候一般都喜欢使用www.baidu.com等知名站点去做第三方跳转,但是现在像baidu.com,qq.com这样的可信站点被许多站点默认加在白名单中,所以以这样可信的站点去跳转它并不能触发URL跳转漏洞(这里是网站的正常逻辑);而别的方式又绕不过,就可以利用下面这个思路:
1. baidu.com这个域名已经被加在测试站点的白名单中
2. 任意跳转的URL已经被baidu收录
3. site:xxx(任意跳转的URL)
4. 在百度点击相关的站点的时候回利用百度自身的一个302跳转
5. 将百度自身的这个302跳转作为测试站点热任意URL的参数,绕过白名单baidu.com的限制进行任意URL跳转(注意:百度自身的302跳转太长了,可以使用单向压缩函数进行压缩,前提是测试站点能够解析)
第二种场景:测试站点的白名单限制的比较严格,只允许加在自己域的地址,这时就需要一个测试站点其他域存在任意URL跳转漏洞,才可能利用成功:
https://www.aaa.com/redirect.php?url=https://auth.aaa.com/jump.do?url=eval.com
总结:其实是利用了两次URL跳转
14、POST方式的URL跳转
1. post方式下的影响较小,比如在站点的个人信息处存在头像上传,上传正常的头像,抓包将头像地址修改为恶意第三方地址,放行以后图片是不能正常显示的,这个时候如果有后台管理员的审核安全意识不高,去查看这个不显示的图片,触发恶意URL跳转,可以打到后台管理员信息。利用条件比较苛刻。在XSS也有类似的利用场景。
2.如果在POST方式中数据只URL跳转参数,那就可以尝试将POST请求转换为GET请求,配合上面的绕过方式利用。(前提是测试网站支持GET传参的方式)
15、HPP参数污染绕过
https://www.aaa.com/redirect.php?url=https://auth.aaa.com/jump.do?url=l@lsowl.xyz
跳转会变成: location:http://https://www.aaa.com/redirect.php?url=https://auth.aaa.com/jump.do?url=@lsowl.xyz
畸形地址绕过
畸形地址由于web站点采用各种各样的语言以及框架,所以绕过的方式显得很诡异。。。
1、通过添加多余的“/”(%2F),然后对%2F二次URL编码绕过网站对.com的分割
https://www.aaa.com/%2Fevil/%252Ecom
2、通过添加4个“/”前缀和“/…”后缀,突破限制(重复特殊字符绕过)
https://www.aaa.com/redirect.php?url=www.eval.com/..
3、特殊字符:
4、协议型网站的实例
http://user:pass@testweb.com/path/;help.php?q=abc#lastpage
其他绕过思路
1、 跳转参数是IP,而不是域名
2、跳转到IPV6地址,不是IPV4地址
3、将要跳转的IP地址用10进制,8进制,16进制表示
4、更换协议,使用FTP,gopher
5、CRLF注入不能XSS时,转向利用任意URL跳转漏洞
IP地址计算补充(以本地ping百度返回的IP为例)
第一种计算方法(将点分十进制转换为32位二进制)
第二种计算方法
111 256 256 256 + 13 256 256 + 100 256 +92*1 = 1863148636(十进制)
第三种计算方法(利用mysql中的inet_aton函数)
半自动化测试
开源的payload地址:https://github.com/cujanovic/Open-Redirect-Payloads/blob/master/Open-Redirect-payloads.txt
修复方案
1、referer限制
确定传递URL参数的引入来源,保证URL的有效性,避免恶意用户自己生成的链接(这里要注意的 是,在有些特殊的环境下,URL跳转会带着HTTP referer头,这样就会使得依赖referer头验证的方式失效)
2、进行token验证
保证所有的链接是可信域中的,加入用户不可控的token在服务端进行验证,防止恶意跳转
3、服务端做好域名白名单或跳转白名单,只对合法的URL进行跳转(常用)
4、对请求参数做加密和签名,防止参数被篡改,服务端要能合法正确的解析URL(不常用,多应用在跳转的URL是由后台生产,不是用户在前台输入)
友情链接:
https://www.anquanke.com/post/id/94377
https://blog.csdn.net/change518/article/details/54286473
https://blog.csdn.net/xyx107/article/details/82941842
https://blog.csdn.net/change518/article/details/53997509
http://www.admintony.com/redict-bypass.html#more
http://www.luteam.com/?p=211#more-211 [关于IP计算]
http://byd.dropsec.xyz/2017/11/21/SSRF%E7%BB%95%E8%BF%87%E6%96%B9%E6%B3%95%E6%80%BB%E7%BB%93/ [关于SSRF绕过]