原文鏈接:秋水表哥博客
0X00:
什么是url重定向行拢?
URL重定向(URL redirection,或稱網(wǎng)址重定向或網(wǎng)域名稱轉(zhuǎn)址)诞吱,是指當(dāng)使用者瀏覽某個(gè)網(wǎng)址時(shí)舟奠,將他導(dǎo)向到另一個(gè)網(wǎng)址的技術(shù)
url轉(zhuǎn)發(fā)和重定向區(qū)別
第一種是request.getRequestDispatcher().forward(request,response):
1、屬于轉(zhuǎn)發(fā)房维,也是服務(wù)器跳轉(zhuǎn)沼瘫,也可以叫做內(nèi)部重定向,相當(dāng)于方法調(diào)用咙俩,在執(zhí)行當(dāng)前文件的過程中轉(zhuǎn)向執(zhí)行目標(biāo)文件耿戚,兩個(gè)文件(當(dāng)前文件和目標(biāo)文件)屬于同一次請(qǐng)求,前后頁共用一個(gè)request阿趁,可以通過此來傳遞一些數(shù)據(jù)或者session信息膜蛔,request.setAttribute()和request.getAttribute()。
2歌焦、在前后兩次執(zhí)行后飞几,地址欄不變,仍是當(dāng)前文件的地址独撇。
3屑墨、不能轉(zhuǎn)向到本web應(yīng)用之外的頁面和網(wǎng)站,所以轉(zhuǎn)向的速度要快纷铣。
4卵史、URL中所包含的“/”表示應(yīng)用程序(項(xiàng)目)的路徑。
第二種是response.sendRedirect():
1搜立、屬于重定向以躯,也是客戶端跳轉(zhuǎn),相當(dāng)于客戶端向服務(wù)端發(fā)送請(qǐng)求之后,服務(wù)器返回一個(gè)響應(yīng),客戶端接收到響應(yīng)之后又向服務(wù)端發(fā)送一次請(qǐng)求,一共是2次請(qǐng)求秒赤,前后頁不共用一個(gè)request,不能讀取轉(zhuǎn)向前通過request.setAttribute()設(shè)置的屬性值膀懈。
2、在前后兩次執(zhí)行后谨垃,地址欄發(fā)生改變启搂,是目標(biāo)文件的地址。
3刘陶、可以轉(zhuǎn)向到本web應(yīng)用之外的頁面和網(wǎng)站胳赌,所以轉(zhuǎn)向的速度相對(duì)要慢。
4匙隔、URL種所包含的"/"表示根目錄的路徑疑苫。
url重定向漏洞
為什么會(huì)產(chǎn)生url重定向漏洞?
個(gè)人理解應(yīng)當(dāng)是外部重定向才會(huì)引發(fā)此漏洞纷责,畢竟參數(shù)可控缀匕,是問題根源, 1\. 寫代碼時(shí)沒有考慮過任意URL跳轉(zhuǎn)漏洞碰逸,或者根本不知道/不認(rèn)為這是個(gè)漏洞; 2\. 寫代碼時(shí)考慮不周,用取子串、取后綴等方法簡單判斷阔加,代碼邏輯可被繞過; 3\. 對(duì)傳入?yún)?shù)做一些奇葩的操作(域名剪切/拼接/重組)和判斷饵史,適得其反,反被繞過; 4\. 原始語言自帶的解析URL胜榔、判斷域名的函數(shù)庫出現(xiàn)邏輯漏洞或者意外特性,可被繞過; 5\. 原始語言胳喷、服務(wù)器/容器特性、瀏覽器等對(duì)標(biāo)準(zhǔn)URL協(xié)議解析處理等差異性導(dǎo)致被繞過;
url重定向漏洞危害是什么呢夭织?
網(wǎng)站接受用戶輸入的鏈接吭露,跳轉(zhuǎn)到一個(gè)攻擊者控制的網(wǎng)站,可能導(dǎo)致跳轉(zhuǎn)過去的用戶被精心設(shè)置的釣魚頁面騙走自己的個(gè)人信息 和登錄口令
ssrf和url重定向區(qū)別尊惰?
問過大佬讲竿,說了一句,除了模樣長得一樣其他什么都不一樣 個(gè)人理解:SSRF是服務(wù)器幫你去訪問弄屡,url重定向其實(shí)也是服務(wù)器幫忙去訪問题禀,那么感覺SSRF可能能實(shí)現(xiàn)url重定向功能,也應(yīng)該 可以用來釣魚膀捷,區(qū)別的話可能SSRF能幫忙探測(cè)內(nèi)網(wǎng)迈嘹,而url重定向是訪問外網(wǎng)
0X01:
以下均轉(zhuǎn)自:https://landgrey.me/open-redirect-bypass/
使用場(chǎng)景
1. 用戶登錄、統(tǒng)一身份認(rèn)證處,認(rèn)證完后會(huì)跳轉(zhuǎn)
2. 用戶分享秀仲、收藏內(nèi)容過后融痛,會(huì)跳轉(zhuǎn)
3. 跨站點(diǎn)認(rèn)證、授權(quán)后神僵,會(huì)跳轉(zhuǎn)
4. 站內(nèi)點(diǎn)擊其它網(wǎng)址鏈接時(shí)雁刷,會(huì)跳轉(zhuǎn)
常見參數(shù)名
redirect
redirect_to
redirect_url
url
jump
jump_to
target
to
link
linkto
domain</pre>
幾種語句和框架版本常見的URL跳轉(zhuǎn)代碼如下,可用作白盒代碼審計(jì)參考:
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]
利用方法
后面假設(shè)源域名為:www.landgrey.me 要跳轉(zhuǎn)過去的域?yàn)椋篹vil.com
1. 直接跳轉(zhuǎn)
沒做任何限制挑豌,參數(shù)后直接跟要跳轉(zhuǎn)過去的網(wǎng)址就行:
https://www.landgrey.me/redirect.php?url=http://www.evil.com/untrust.html
2. 協(xié)議一致性
當(dāng)程序員校驗(yàn)跳轉(zhuǎn)的網(wǎng)址協(xié)議必須為https時(shí)(有時(shí)候跳轉(zhuǎn)不過去不會(huì)給提示):
https://www.landgrey.me/redirect.php?url=https://www.evil.com/untrust.html
3. 域名字符串檢測(cè)欺騙
01. 有的程序員會(huì)檢測(cè)當(dāng)前的域名字符串是否在要跳轉(zhuǎn)過去的字符串中安券,是子字符串時(shí)才會(huì)跳轉(zhuǎn),php代碼如:
<?php
$redirect_url = $_GET['url'];
if(strstr($redirect_url,"www.landgrey.me") !== false){
header("Location: " . $redirect_url);
}
else{
die("Forbidden");}
繞過:
https://www.landgrey.me/redirect.php?url=http://www.landgrey.me.www.evil.com/untrust.html
一個(gè)京東的實(shí)例:
02. 還有的會(huì)檢測(cè)域名結(jié)尾是不是當(dāng)前域名氓英,是的話才會(huì)跳轉(zhuǎn)侯勉,Django示例代碼如下:
redirect_url = request.GET.get("url")
if redirect_url.endswith('landgrey.me'):
HttpResponseRedirect(redirect_url)
else:
HttpResponseRedirect("https://www.landgrey.me")
繞過:
https://www.landgrey.me/redirect.php?url=http://www.evil.com/www.landgrey.me
或者買個(gè)xxxlandgrey.me域名,然后繞過:
https://www.landgrey.me/redirect.php?url=http://xxxlandgrey.me
03.可信站多次重定向繞過
利用已知可重定向到自己域名的可信站點(diǎn)的重定向铝阐,來最終重定向自己控制的站點(diǎn)址貌。
一種是利用程序自己的公共白名單可信站點(diǎn),如www.baidu.com徘键,其中百度有個(gè)搜索的緩存鏈接比如https://www.baidu.com/linkurl=iMwwNDM6ahaxKkSFuOG练对,可以最終跳轉(zhuǎn)到自己網(wǎng)站,然后測(cè)試時(shí):
https://www.landgrey.me/redirect.php?url=https://www.baidu.com/linkurl=iMwwNDM6ahaxKkSFuOG
就可以跳轉(zhuǎn)到自己站點(diǎn)了吹害。
另一種類似螟凭,但是程序的跳轉(zhuǎn)白名單比較嚴(yán)格,只能是自己域的地址它呀,這時(shí)需要有一個(gè)目標(biāo)其它域的任意跳轉(zhuǎn)漏洞螺男,比如https://auth.landgrey.me/jump.do?url=evil.com,然后測(cè)試時(shí):
https://www.landgrey.me/redirect.php?url=https://auth.landgrey.me/jump.do?url=evil.com
4. 畸形地址繞過
這一部分由于各種語言纵穿、框架和代碼實(shí)現(xiàn)的不同下隧,防護(hù)任意跳轉(zhuǎn)代碼的多種多樣;導(dǎo)致繞過方式乍看起來很詭異谓媒,有多詭異淆院?舉三個(gè)案例:
案例一:這個(gè)案例 ,通過添加多余的"/"(%2F)符號(hào)句惯,再對(duì)"."兩次url編碼成"%252E"繞過代碼中對(duì)域名后".com"的切割土辩, 構(gòu)造類似
https://landgrey.me/%2Fevil%252Ecom
達(dá)到了任意URL跳轉(zhuǎn)的目的。
案例二:這個(gè)案例抢野,通過添加4個(gè)"/"前綴和"/.."后綴脯燃,構(gòu)造類似
https://landgrey.me/redirect.php?url=////www.evil.com/..
進(jìn)行了繞過。
案例三:這個(gè)案例蒙保,通過"."字符辕棚,構(gòu)造類似
https://landgrey.me/redirect.php?url=http://www.evil.com.landgrey.me
進(jìn)行繞過。
手工測(cè)試時(shí),主要結(jié)合目標(biāo)對(duì)輸入的跳轉(zhuǎn)處理和提示逝嚎,根據(jù)經(jīng)驗(yàn)來繞過;
自動(dòng)化測(cè)試時(shí)扁瓢,通常是根據(jù)目標(biāo)和規(guī)則,事先生成payload补君,用工具(如burpsuite)在漏洞點(diǎn)處自動(dòng)發(fā)包測(cè)試;
復(fù)雜的案例引几,在當(dāng)時(shí)測(cè)試時(shí)一般有相關(guān)提示信息,不然就是自動(dòng)化fuzzing出的挽铁,實(shí)際中手工bypass的難度和花費(fèi)太大伟桅。
URL跳轉(zhuǎn)漏洞復(fù)雜的真實(shí)例子也比較難找。黑盒測(cè)試叽掘,經(jīng)常是測(cè)試成功也不能確定到底是哪里出的問題楣铁。要達(dá)到繞過效果,主要涉及以下9個(gè)特殊字符:
";", "/", "", "?", ":", "@", "=", "&", "."
一個(gè)“協(xié)議型”的網(wǎng)址示例:
http://user:pass@testweb.com/path/;help.php?q=abc#lastpage
10種bypass方式:
1. 單斜線"/"繞過
https://www.landgrey.me/redirect.php?url=/www.evil.com
2. 缺少協(xié)議繞過
https://www.landgrey.me/redirect.php?url=//www.evil.com
3. 多斜線"/"前綴繞過
https://www.landgrey.me/redirect.php?url=///www.evil.com
https://www.landgrey.me/redirect.php?url=////www.evil.com
4. 利用"@"符號(hào)繞過
https://www.landgrey.me/redirect.php?url=https://www.landgrey.me@www.evil.com
5. 利用反斜線""繞過
https://www.landgrey.me/redirect.php?url=https://www.evil.com\www.landgrey.me
6. 利用"#"符號(hào)繞過
https://www.landgrey.me/redirect.php?url=https://www.evil.com#www.landgrey.me
7. 利用"?"號(hào)繞過
https://www.landgrey.me/redirect.php?url=https://www.evil.com?www.landgrey.me
8. 利用"\"繞過
https://www.landgrey.me/redirect.php?url=https://www.evil.com\www.landgrey.me
9. 利用"."繞過
https://www.landgrey.me/redirect.php?url=.evil (可能會(huì)跳轉(zhuǎn)到www.landgrey.me.evil域名)
https://www.landgrey.me/redirect.php?url=.evil.com (可能會(huì)跳轉(zhuǎn)到evil.com域名)
10.重復(fù)特殊字符繞過
https://www.landgrey.me/redirect.php?url=///www.evil.com//..
https://www.landgrey.me/redirect.php?url=////www.evil.com//..
上面的方法有些是有案例更扁,有些是別人總結(jié)的盖腕,有些是有原理依循的,比如第4條浓镜,利用"@"符號(hào)前的"www.landgrey.me"是指"www.evil.com"域的一個(gè)用戶名來繞過溃列。
5. 其它繞過思路
1. 跳轉(zhuǎn)到IP地址,而不是域名;
2. 跳轉(zhuǎn)到IPV6地址膛薛,而不是IPv4地址;
3. 將要跳轉(zhuǎn)到的IP地址用10進(jìn)制听隐、8進(jìn)制、16進(jìn)制形式表示;
4. 更換協(xié)議,使用ftp哄啄、gopher協(xié)議等;
5. 借鑒SSRF漏洞繞過的tricks;
6. CRLF注入不能xss時(shí)遵绰,轉(zhuǎn)向利用任意URL跳轉(zhuǎn)漏洞;
6. 自動(dòng)化利用
參考Github上已總結(jié)的測(cè)試payload(很雜,一些可能根本沒有實(shí)例增淹,完全是YY),按情況替換里面的域名乌企。在黑盒情況下虑润,可以用來批量發(fā)包測(cè)試。
防護(hù)方法
1. 代碼固定跳轉(zhuǎn)地址加酵,不讓用戶控制變量
2. 跳轉(zhuǎn)目標(biāo)地址采用白名單映射機(jī)制
比如1代表auth.landgrey.me拳喻,2代表www.landgrey.me,其它不做任何動(dòng)作
3. 合理充分的校驗(yàn)校驗(yàn)跳轉(zhuǎn)的目標(biāo)地址猪腕,非己方地址時(shí)告知用戶跳轉(zhuǎn)風(fēng)險(xiǎn)</pre>
參考鏈接: