Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
。 reload
reload 方法,該方法強(qiáng)迫瀏覽器刷新當(dāng)前頁面。
語法:location.reload([bForceGet])
參數(shù): bForceGet, 可選參數(shù), 默認(rèn)為 false,從客戶端緩存里取當(dāng)前頁。true, 則以 GET 方式,從服務(wù)端取最新的頁面, 相當(dāng)于客戶端點擊 F5("刷新")
reload() 方法用于重新加載當(dāng)前文檔。
如果該方法沒有規(guī)定參數(shù),或者參數(shù)是 false,它就會用 HTTP 頭 If-Modified-Since 來檢測服務(wù)器上的文檔是否已改變。如果文檔已改變,reload() 會再次下載該文檔。如果文檔未改變,則該方法將從緩存中裝載文檔。這與用戶單擊瀏覽器的刷新按鈕的效果是完全一樣的。
2.
2,replace 方法,該方法通過指定URL替換當(dāng)前緩存在歷史里(客戶端)的項目,因此當(dāng)使用replace方法之后,你不能通過“前進(jìn)”和“后退”來訪問已經(jīng)被替換的URL。
語法: location.replace(URL)
通常使用: location.reload() 或者是 history.go(0) 來做。
此方法類似客戶端點F5刷新頁面,所以頁面method="post"時,會出現(xiàn)"網(wǎng)頁過期"的提示。
因為Session的安全保護(hù)機(jī)制。
當(dāng)調(diào)用 location.reload() 方法時, aspx頁面此時在服務(wù)端內(nèi)存里已經(jīng)存在, 因此必定是 IsPostback 的。
如果有這種應(yīng)用: 需要重新加載該頁面,也就是說期望頁面能夠在服務(wù)端重新被創(chuàng)建,期望是 Not IsPostback 的。
這里,location.replace() 就可以完成此任務(wù)。被replace的頁面每次都在服務(wù)端重新生成。
代碼: location.replace(location.href);
返回并刷新頁面:
location.replace(document.referrer);
document.referrer //前一個頁面的URL
不要用 history.go(-1),或 history.back();來返回并刷新頁面,這兩種方法不會刷新頁面。
附:
Javascript刷新頁面的幾種方法:
復(fù)制代碼 代碼如下:
1,history.go(0)
2,location.reload()
3,location=location
4,location.assign(location)
5,document.execCommand('Refresh')
6,window.navigate(location)
7,location.replace(location)
8,document.URL=location.href
自動刷新頁面的方法:
1,頁面自動刷新:把如下代碼加入<head>區(qū)域中
復(fù)制代碼 代碼如下:
<meta http-equiv="refresh" content="20">
其中20指每隔20秒刷新一次頁面.
2,頁面自動跳轉(zhuǎn):把如下代碼加入<head>區(qū)域中
復(fù)制代碼 代碼如下:
<meta http-equiv="refresh" content="20;url=http://www.jb51.net">
其中20指隔20秒后跳轉(zhuǎn)到http://www.jb51.net頁面
3,頁面自動刷新js版
復(fù)制代碼 代碼如下:
<script language="JavaScript">
function myrefresh()
{
window.location.reload();
}
setTimeout('myrefresh()',1000); //指定1秒刷新一次
</script>
4,JS刷新框架的腳本語句
復(fù)制代碼 代碼如下:
//刷新包含該框架的頁面用
<script language=JavaScript>
parent.location.reload();
</script>
//子窗口刷新父窗口
<script language=JavaScript>
self.opener.location.reload();
</script>
( 或 <a href="javascript:opener.location.reload()">刷新</a> )
//刷新另一個框架的頁面用
<script language=JavaScript>
parent.另一FrameID.location.reload();
</script>
如果想關(guān)閉窗口時刷新或想開窗時刷新,在<body>中調(diào)用以下語句即可。
復(fù)制代碼 代碼如下:
<body onload="opener.location.reload()"> 開窗時刷新
<body onUnload="opener.location.reload()"> 關(guān)閉時刷新
<script language="javascript">
window.opener.document.location.reload()
</script>
一、先來看一個簡單的例子:
下面以三個頁面分別命名為frame.html、top.html、bottom.html為例來具體說明如何做。
frame.html 由上(top.html)下(bottom.html)兩個頁面組成,代碼如下:
復(fù)制代碼 代碼如下:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> frame </TITLE>
</HEAD>
<frameset rows="50%,50%">
<frame name=top src="top.html">
<frame name=bottom src="bottom.html">
</frameset>
</HTML>
現(xiàn)在假設(shè)top.html (即上面的頁面) 有七個button來實現(xiàn)對bottom.html (即下面的頁面) 的刷新,可以用以下七種語句,哪個好用自己看著辦了。
top.html 頁面的代碼如下:
復(fù)制代碼 代碼如下:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> top.html </TITLE>
</HEAD>
<BODY>
<input type=button value="刷新1" onclick="window.parent.frames[1].location.reload()"><br>
<input type=button value="刷新2" onclick="window.parent.frames.bottom.location.reload()"><br>
<input type=button value="刷新3" onclick="window.parent.frames['bottom'].location.reload()"><br>
<input type=button value="刷新4" onclick="window.parent.frames.item(1).location.reload()"><br>
<input type=button value="刷新5" onclick="window.parent.frames.item('bottom').location.reload()"><br>
<input type=button value="刷新6" onclick="window.parent.bottom.location.reload()"><br>
<input type=button value="刷新7" onclick="window.parent['bottom'].location.reload()"><br>
</BODY>
</HTML>
下面是bottom.html頁面源代碼,為了證明下方頁面的確被刷新了,在裝載完頁面彈出一個對話框。
復(fù)制代碼 代碼如下:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> bottom.html </TITLE>
</HEAD>
<BODY onload="alert('我被加載了!')">
<h1>This is the content in bottom.html.</h1>
</BODY>
</HTML>
解釋一下:
復(fù)制代碼 代碼如下:
1.window指代的是當(dāng)前頁面,例如對于此例它指的是top.html頁面。
2.parent指的是當(dāng)前頁面的父頁面,也就是包含它的框架頁面。例如對于此例它指的是framedemo.html。
3.frames是window對象,是一個數(shù)組。代表著該框架內(nèi)所有子頁面。
4.item是方法。返回數(shù)組里面的元素。
5.如果子頁面也是個框架頁面,里面還是其它的子頁面,那么上面的有些方法可能不行。
附:
Javascript刷新頁面的幾種方法:
1 history.go(0)
2 location.reload()
3 location=location
4 location.assign(location)
5 document.execCommand('Refresh')
6 window.navigate(location)
7 location.replace(location)
8 document.URL=location.href
二、自動刷新頁面
1.頁面自動刷新:把如下代碼加入<head>區(qū)域中
<meta http-equiv="refresh" content="20">
其中20指每隔20秒刷新一次頁面.
2.頁面自動跳轉(zhuǎn):把如下代碼加入<head>區(qū)域中
<meta http-equiv="refresh" content="20;url=http://www.jb51.net">
其中20指隔20秒后跳轉(zhuǎn)到http://www.jb51.net頁面
3.頁面自動刷新js版
[Ctrl+A 全選 注:如需引入外部Js需刷新才能執(zhí)行]
三、java在寫Servler,Action等程序時,要操作返回頁面的話(如談出了窗口,操作完成以后,關(guān)閉當(dāng)前頁面,刷新父頁面)
復(fù)制代碼 代碼如下:
1 PrintWriter out = response.getWriter();
2 out.write("<script type=\"text/javascript\">");
3 ////子窗口刷新父窗口
4 out.write("self.opener.location.reload();");
5 //關(guān)閉窗口
6 out.write("window.opener=null;");
7 out.write("window.close();");
8 out.write("</script>");
四、JS刷新框架的腳本語句
1.如何刷新包含該框架的頁面用
復(fù)制代碼 代碼如下:
<script language=JavaScript>
parent.location.reload();
</script>
T之家 3 月 17 日消息,小米官網(wǎng)此前可通過“mi.com/html”訪問 2019 年版本,該版本首頁清晰可見“小米手機(jī) 9”“小米手環(huán) 4”“Redmi Note 7”“小米游戲本 2019”等產(chǎn)品。
不過根據(jù)IT之家小伙伴投稿,目前小米已經(jīng)悄悄下線了這一 2019 年版本網(wǎng)站,IT之家經(jīng)過測試,如今在瀏覽器鍵入“mi.com/html”訪問,將被強(qiáng)制跳轉(zhuǎn)“mi.com/shop”,回歸 2024 年。
另據(jù)IT之家此前報道,小米在本月初誤將 mi.com 官網(wǎng)域名跳轉(zhuǎn)至“mi.com/ html”,而后迅速修正,但依然有不少用戶留存了截圖。
、概述
服務(wù)端未對傳入的跳轉(zhuǎn)url變量進(jìn)行檢查和控制,可導(dǎo)致惡意用戶構(gòu)造一個惡意地址,誘導(dǎo)用戶跳轉(zhuǎn)到惡意網(wǎng)站。跳轉(zhuǎn)漏洞一般用于釣魚攻擊,通過跳轉(zhuǎn)到惡意網(wǎng)站欺騙用戶輸入用戶名和密碼來盜取用戶信息,或欺騙用戶進(jìn)行金錢交易;還可以造成xss漏洞。
常見的可能產(chǎn)生漏洞的參數(shù)名redirect,redirect_to,redirect_url,url,jump,jump_to,target,to,link,linkto,domain
定義:借助未驗證的URL跳轉(zhuǎn),將應(yīng)用程序引導(dǎo)到不安全的第三方區(qū)域,從而導(dǎo)致的安全問題。
url跳轉(zhuǎn)常見出現(xiàn)的地方(即漏洞產(chǎn)生的地方)
二、URL跳轉(zhuǎn)漏洞原理
黑客利用URL跳轉(zhuǎn)漏洞來誘導(dǎo)安全意識低的用戶點擊,導(dǎo)致用戶信息泄露或者資金的流失。其原理是黑客構(gòu)建惡意鏈接(鏈接需要進(jìn)行偽裝,盡可能迷惑),發(fā)在QQ群或者是瀏覽量多的貼吧/論壇中。 安全意識低的用戶點擊后,經(jīng)過服務(wù)器或者瀏覽器解析后,跳到惡意的網(wǎng)站中。
惡意鏈接需要進(jìn)行偽裝,經(jīng)常的做法是熟悉的鏈接后面加上一個惡意的網(wǎng)址,這樣才迷惑用戶。
諸如偽裝成像如下的網(wǎng)址,你是否能夠識別出來是惡意網(wǎng)址呢?
http://gate.baidu.com/index?act=go&url=http://t.cn/RVTatrd
http://qt.qq.com/safecheck.html?flag=1&url=http://t.cn/RVTatrd
http://tieba.baidu.com/f/user/passport?jumpUrl=http://t.cn/RVTatrd
三、攻擊方式及危害
惡意用戶完全可以借用URL跳轉(zhuǎn)漏洞來欺騙安全意識低的用戶,從而導(dǎo)致“中獎”之類的欺詐,這對于一些有在線業(yè)務(wù)的企業(yè)如淘寶等,危害較大,同時借助URL跳轉(zhuǎn),也可以突破常見的基于“白名單方式”的一些安全限制,如傳統(tǒng)IM里對于URL的傳播會進(jìn)行安全校驗,但是對于大公司的域名及URL將直接允許通過并且顯示會可信的URL,而一旦該URL里包含一些跳轉(zhuǎn)漏洞將可能導(dǎo)致安全限制被繞過。
如果引用一些資源的限制是依賴于“白名單方式”,同樣可能被繞過導(dǎo)致安全風(fēng)險,譬如常見的一些應(yīng)用允許引入可信站點如youku.com的視頻,限制方式往往是檢查URL是否是youku.com來實現(xiàn),如果youku.com內(nèi)含一個url跳轉(zhuǎn)漏洞,將導(dǎo)致最終引入的資源屬于不可信的第三方資源或者惡意站點,最終導(dǎo)致安全問題。
四、實現(xiàn)方式
通過以GET或者POST的方式接收將要跳轉(zhuǎn)的URL,然后通過上面的幾種方式的其中一種來跳轉(zhuǎn)到目標(biāo)URL。一方面,由于用戶的輸入會進(jìn)入Meta,javascript,http頭所以都可能發(fā)生相應(yīng)上下文的漏洞,如xss等等,但是同時,即使只是對于URL跳轉(zhuǎn)本身功能方面就存在一個缺陷,因為會將用戶瀏覽器從可信的站點導(dǎo)向到不可信的站點,同時如果跳轉(zhuǎn)的時候帶有敏感數(shù)據(jù)一樣可能將敏感數(shù)據(jù)泄漏給不可信的第三方。
這里我們舉個Header頭跳轉(zhuǎn)實現(xiàn)方式:
<?php
$url=$_GET['jumpto'];
header("Location: $url");
?>
如果jumpto沒有任何限制,所以惡意用戶可以提交:
http://www.wooyun.org/login.php?jumpto=http://www.evil.com
來生成自己的惡意鏈接,安全意識較低的用戶很可能會以為該鏈接展現(xiàn)的內(nèi)容是www.wooyun.org從而可能產(chǎn)生欺詐行為,同時由于QQ,淘寶旺旺等在線IM都是基于URL的過濾,同時對一些站點會以白名單的方式放過,所以導(dǎo)致惡意URL在IM里可以傳播,從而產(chǎn)生危害,譬如這里IM會認(rèn)為www.wooyun.org都是可信的,但是通過在IM里點擊上述鏈接將導(dǎo)致用戶最終訪問www.evil.com這個惡意網(wǎng)址。
五、繞過URL跳轉(zhuǎn)限制
1.利用?號繞過限制
比如:http://www.aaa.com/acb?Url=http://login.aaa.com
這是一個跳轉(zhuǎn)鏈接,跳轉(zhuǎn)到它的二級域名下,那么這個問號放哪里可以繞過呢?其實就是放到它自身的域名前面也就是你添加的想要跳轉(zhuǎn)的域名的后面,如:http://www.aaa.com/acb?Url=http://test.com?login.aaa.com 。它其實是會跳轉(zhuǎn)到這個test.com域名下,這個域名是我想要跳轉(zhuǎn)的任意域名,而后面的它自身域名一定要帶上,不帶上就無法輔助用問號?這個特性來跳轉(zhuǎn)到指定域名了,而跳轉(zhuǎn)后,問號和問號后面的內(nèi)容會變?yōu)檫@樣:http://www.test.com/?login.aaa.com
2.利用反斜杠和正斜杠繞過限制
比如:http://www.aaa.com/acb?Url=http://login.aaa.com/ 同樣是在它本身域名錢加上正斜杠,然后正斜杠前面跟上你想跳轉(zhuǎn)的域名地址,如:http://www.aaa.com/acb?Url=http://test.com/login.aaa.com
反斜杠有三種思路
①兩個反斜杠繞過方法
比如:http://www.aaa.com/acb?Url=http://login.aaa.com/ 同樣是在它本身域名錢加上兩個反斜杠,然后兩個反斜杠前面跟上你想跳轉(zhuǎn)的域名地址
如:http://www.aaa.com/acb?Url=http://test.com\login.aaa.com
②一個反斜杠繞過方法
如:http://www.aaa.com/acb?Url=http://test.com\login.aaa.com
③另一種思路,一個反斜杠一個點
利用.這樣的格式,也就是一個反斜杠加一個點來跳過限制,
如:http://www.aaa.com/acb?Url=http://test.com.login.aaa.com
3.利用@繞過URL限制
如果你用這方法在火狐里進(jìn)行跳轉(zhuǎn),會有彈窗提示,在其它游覽器則沒有。
如:http://www.aaa.com/acb?Url=http://login.aaa.com@test.com后面的test.com就是要跳轉(zhuǎn)到的域名,前面的域名都是用來輔助以繞過限制的
4.利用#號繞過
如:http://www.aaa.com/acb?Url=http://test.com#login.aaa.com
5.利用白名單缺陷繞過
有的域名白名單限制是不全的,比如如果想利用一個跳轉(zhuǎn),而這個跳轉(zhuǎn)是通用,在這個公司網(wǎng)站很多子域名等都可以跳轉(zhuǎn),那么你買個域名也不算貴對吧,為什么這么說呢,這個問題就是白名單限制不當(dāng),比如,當(dāng)跳轉(zhuǎn)的域名包含這個網(wǎng)站下的所有域名,比如:
http://www.aaa.com/acb?Url=http://login.aaa.com,這個login.aaa.com也可以改成aaa.com同樣可以跳轉(zhuǎn)對吧,因為白名單里只要有包含這個域名就直接成功跳轉(zhuǎn)。那么當(dāng)我在這個域名前面加上如testaaa.com,白名單里會檢查是否包含aaa.com這個域名,包含,然后直接跳轉(zhuǎn),而并沒有檢查這個域名的整個信息,然后可以利用這個問題,直接注冊一個testaaa.com這個域名就可以利用這個跳轉(zhuǎn)。
6.多重驗證&跳轉(zhuǎn)繞過限制
現(xiàn)在很多網(wǎng)站都有多重驗證,比如你登陸賬戶后會出現(xiàn)另一個驗證頁面,輸入手機(jī)驗證碼進(jìn)行驗證,此時這上面的URL很可能存在任意跳轉(zhuǎn)的問題。多重跳轉(zhuǎn)的問題導(dǎo)致可繞過URL限制
比如http://www.aaa.com/acb?Url=http://login.aaa.com/acb?url=http://login.aaa.com。當(dāng)然,還有多重的,這個結(jié)構(gòu)的多重跳轉(zhuǎn)你修改最后面的URL就可以達(dá)到任意URL跳轉(zhuǎn),中間的URL就沒必要動了。
7.點擊觸發(fā)達(dá)到繞過URL跳轉(zhuǎn)限制
比如很多登陸頁面的地方,其URL是一個跳轉(zhuǎn)的URL,如:http://www.aaa.com/acb?Url=http://test.com。你直接修改了后面為任意URL,但是還是停留在原地,似乎沒什么問題,但是,當(dāng)你輸入賬號和密碼后點擊登陸按鈕后,就會觸發(fā)跳轉(zhuǎn),當(dāng)然,這個賬戶和密碼不一定要對的,隨便都可以,但得視系統(tǒng)而定吧。這個我遇到了很多,比如你修改了域名,然后點擊登陸,登陸成功后便可觸發(fā)跳轉(zhuǎn),這也是一個比較隱蔽的繞過URL限制的跳轉(zhuǎn)。
8.POST參數(shù)中的URL跳轉(zhuǎn)
當(dāng)你填什么表格或者需要填寫什么的,當(dāng)你上傳圖片,點擊下一步的時候,通常下一步就是預(yù)覽你填寫的信息,最后才是提交,當(dāng)你上傳了圖片后點擊下一步抓包,如果過濾不嚴(yán),你會看到圖片的完整地址包含在POST參數(shù)里,你就可以直接修改這個地址為任意URL,然后到達(dá)下一步,這時是確定信息也就是預(yù)覽自己填寫的信息的正確還是不正確,由于你剛剛修改了圖片地址,這里是沒有顯示出來的,圖像會是一個小XX,當(dāng)點擊圖片右鍵選擇查看圖像時,就會觸發(fā)URL跳轉(zhuǎn)問題,其實這個也可以利用來進(jìn)行釣魚,釣后臺審核員的信息(引用)
9.利用xip.io繞過
請求是http://www.127.0.0.1.xip.io 這個繞過是在SSRF場景中的繞過,比如SSRF你要讀取內(nèi)網(wǎng)地址,一般都做了限制,可以嘗試用這方法進(jìn)行繞過限制,從而訪問到內(nèi)網(wǎng)。另外一點,URL跳轉(zhuǎn)涉及的安全問題大家常見的就是釣魚,那么利用這個思路也可達(dá)成一個釣魚問題,如,http://www.qq.com.220.181.57.217.xip.io 當(dāng)你訪問qq這個域名時,其實這個鏈接已經(jīng)被解析到后面這個ip地址上了,那么實際訪問的就是后面這個IP地址。
六、url跳轉(zhuǎn)修復(fù)
1.若跳轉(zhuǎn)的URL事先是可以確定的,包括url和參數(shù)的值,則可以在后臺先配置好,url參數(shù)只需傳對應(yīng)url的索引即可,通過索引找到對應(yīng)具體url再進(jìn)行跳轉(zhuǎn);
2.若跳轉(zhuǎn)的URL事先不確定,但其輸入是由后臺生成的(不是用戶通過參數(shù)傳人),則可以先生成好跳轉(zhuǎn)鏈接然后進(jìn)行簽名,而跳轉(zhuǎn)cg首先需要進(jìn)行驗證簽名通過才能進(jìn)行跳轉(zhuǎn);
3.若1和2都不滿足,url事先無法確定,只能通過前端參數(shù)傳入,則必須在跳轉(zhuǎn)的時候?qū)rl進(jìn)行按規(guī)則校驗:即控制url是否是你們公司授權(quán)的白名單或者是符合你們公司規(guī)則的url:
function checkURL ( sURL) {
return (/^(https?:\/\/)?[\w-.]+.(yourDomainA|yourDomainB|yourDomainC).com($|\/|\)/i).test(sUrl)||(/^[\w][\w\/.-_%]+$/i).test(sUrl)||(/^[\/\][^\/\]/i).test(sUrl) ? true : false; }
4.XSS漏洞的注意事項 :跳轉(zhuǎn)url檢測中也加入了CRLF頭部注入漏洞的檢測邏輯, 具體就是在請求參數(shù)中加入了%0d%0a這種測試代碼,需要對這些參數(shù)進(jìn)行刪除處理(事實上:在判斷到一個參數(shù)中包含 %00 -> %1f 的控制字符時都是不合法的,需對其進(jìn)行刪除)。
七、如何防御
理論上講,url跳轉(zhuǎn)屬于CSRF的一種,我們需要對傳入的URL做有效性的認(rèn)證,保證該URL來自于正確的地方,限制的方式同防止csrf一樣可以包括:
1.referer的限制
如果確定傳遞URL參數(shù)進(jìn)入的來源,我們可以通過該方式實現(xiàn)安全限制,保證該URL的有效性,避免惡意用戶自己生成跳轉(zhuǎn)鏈接
2.加入有效性驗證Token
我們保證所有生成的鏈接都是來自于我們可信域的,通過在生成的鏈接里加入用戶不可控的Token對生成的鏈接進(jìn)行校驗,可以避免用戶生成自己的惡意鏈接從而被利用,但是如果功能本身要求比較開放,可能導(dǎo)致有一定的限制。
參考:
https://juejin.cn/post/6844903772930441230
http://drops.xmd5.com/static/drops/papers-58.html
https://blog.csdn.net/pro20/article/details/105731095
https://segmentfault.com/a/1190000021968717
*請認(rèn)真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。