亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

任意URL跳轉漏洞怎樣修復與JDK中getHost()方法之間的坑

發布時間:2021-11-12 16:58:44 來源:億速云 閱讀:172 作者:柒染 欄目:安全技術

任意URL跳轉漏洞怎樣修復與JDK中getHost()方法之間的坑,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

任意URL跳轉漏洞

服務端未對傳入的跳轉url變量進行檢查和控制,導致可惡意構造任意一個惡意地址,誘導用戶跳轉到惡意網站。由于是從可信的站點跳轉出去的,用戶會比較信任,所以跳轉漏洞一般用于釣魚攻擊,通過轉到惡意網站欺騙用戶輸入用戶名和密碼盜取用戶信息,或欺騙用戶進行金錢交易。

修復該漏洞最有效的方法之一就是校驗傳入的跳轉url參數值,判斷是否為預期域名。在java中可使用下列方法:

String url = request.getParameter("returnUrl"); String host = ""; try {     host = new URL(url).getHost(); } catch (MalformedURLException e) {     e.printStackTrace(); } if host.endsWith(".bbb.com"){     //跳轉 }else{     //不跳轉,報錯 }

上述代碼中主要校驗了客戶端傳來的returnUrl參數值,使用java.net.URL包中的getHost()方法獲取了將要跳轉url的host,判斷host是否為目標域,上述代碼中限制了必須跳轉到xxx.bbb.com的域名,從而排除了跳轉到不可信域名的可能。

但是,getHost()方法真的靠譜嗎??

getHost()方法的坑之一

可以被反斜線繞過,即returnUrl=http://www.aaa.com\www.bbb.com會被代碼認為是將要跳轉到bbb.com,而實際在瀏覽器中反斜線被糾正為正斜線,跳轉到www.aaa.com/www.bbb.com,最終還是跳到www.aaa.com的服務器

使用下列代碼進行測試:

public class Main {      public static void main(String[] args) {         String url = "https://www.aaa.com\\www.bbb.com?x=123";         String host = "";         try {             host = new URL(url).getHost();         } catch (MalformedURLException e) {             e.printStackTrace();         }         System.out.println("host---"+host);         System.out.println("url---"+url);     } }

url參數的域名getHost()之后是www.aaa.com還是www.bbb.com呢?打印結果如下:

任意URL跳轉漏洞怎樣修復與JDK中getHost()方法之間的坑

該結果會被endsWith(“.bbb.com”)方法判斷為真,從而成功執行跳轉,但實際在瀏覽器中跳轉到了www.aaa.com網站。

getHost()方法的坑之二

getHost()方法的結果在不同JDK版本中對井號#的處理結果不同,通常井號被用作頁面錨點,對于https://www.aaa.com#www.bbb.com?x=123這個url,較高版本的JDK中,取出結果為www.aaa.com,低版本中為www.aaa.com#www.bbb.com,從而低版本又可繞過endsWith(“.bbb.com”)方法,成功跳轉。

這里所說的高版本指的是java version 1.8.0_181或者java version  1.7.0_161中的181和161,與JDK7還是8無關。可能java在某個時間集中修復了JDK6/7/8中的URL庫。

測試過程中發現1.6.0_45,1.7.0_71,1.8.0_25均可被#繞過,即不同的JDK中低版本均存在問題。

通過對比rt.jar---java---net--URLStreamHandler.java代碼(低版本為左邊,高版本為右邊)找到問題所在如下圖所示,代碼中的start為url中冒號位置,limit為url中井號位置:

任意URL跳轉漏洞怎樣修復與JDK中getHost()方法之間的坑

從代碼中可以發現,低版本中未考慮到一個完整url中斜線/或者問號?之前會出現井號#的情況,如果url中有斜線/或者問號?,取host就以斜線或者問號為終止,即使中間包含井號也不處理;而高版本中進行了井號位置的判斷,排除了使用井號繞過的可能。但是線上生成環境的JDK版本又不是敢隨便亂升級的,只能從代碼里提前預防。

下圖為使用不同版本JDK測試的結果:

同一段代碼在不同JDK版本中打印出的host值不同,在低版本中包含了井號及其后邊的部分。

任意URL跳轉漏洞怎樣修復與JDK中getHost()方法之間的坑

任意URL跳轉漏洞怎樣修復與JDK中getHost()方法之間的坑

綜合上述兩個坑,若想使用getHost()來修復任意URL跳轉漏洞,需要考慮到反斜線和井號繞過,可使用如下代碼:

String url = request.getParameter("returnUrl"); String host = ""; try {     urlurl = url.replaceAll("[\\\\#],"/"); //替換掉反斜線和井號     host = new URL(url).getHost();   } catch (MalformedURLException e) {     e.printStackTrace(); } if host.endsWith(".bbb.com"){     //跳轉 }else{     //不跳轉,報錯 }

附送一個真實例子

該站可使用井號配合斜線或者問號來繞過域名檢測,即將target設置為URL編碼后的https://www.baidu.com#www.bbb.com?x=123,該站即可302跳轉到百度。

任意URL跳轉漏洞怎樣修復與JDK中getHost()方法之間的坑

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新竹市| 宝兴县| 大英县| 海原县| 娱乐| 简阳市| 砀山县| 黑龙江省| 武威市| 京山县| 中卫市| 邵武市| 蕉岭县| 水城县| 寿阳县| 安达市| 玉山县| 信宜市| 宾阳县| 阿克陶县| 阿荣旗| 龙海市| 吉林省| 辽阳县| 老河口市| 韶山市| 黎川县| 德惠市| 洛川县| 信阳市| 明光市| 扎兰屯市| 离岛区| 崇州市| 抚松县| 镇远县| 夏津县| 祁连县| 泉州市| 锡林浩特市| 黔西县|