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繞過]