何謂短網址(Short URL)?顧名思義,就是形式上比較短的網址,當前主要是借助短網址來替代原先冗長的網址,方便傳輸和分享。短網址服務也就是將長網址轉換為短網址的服務,這種服務在方便了廣大網民的同時也帶來了一定的安全風險。
Tencent Blade Team專門對短網址的安全問題進行過研究,也在KCON 2018上進行過分享過部分成果,本文也是對議題《短網址的攻擊與防御》的解讀和補充。
特別感謝:lake2、Wester、martinzhou
一、短網址基礎
短網址服務可以提供一個非常短小的URL以代替原來的可能較長的URL,將長的URL地址縮短。用戶訪問縮短后的URL時,通常將會重定向到原來的URL。短網址服務主要起源于一些具有字數限制的微博客服務,但是現在廣泛用于短信、郵件等。
很多安全問題是跟安全場景相關的,隨著場景的不斷變化,安全問題也是變化的。短網址的初衷是在微博這種限制字數的公共平臺使用,也就是說它基本是公開的,但是后續在個人短信和郵件之中,其實有部分已經是私密的。 這直接引發了短網址第一個比較大的潛在風險。
在了解短網址風險和漏洞之前,我們首先應該了解下短網址是什么以及如何工作。
短網址服務的基本流程:用戶將長網址提交到短網址服務中,之后短網址服務經過URL處理之后,利用轉換算法對長網址進行轉換,最后分別將長網址和短網址存儲到數據庫之中。部分短網址服務為了防止出現對短地址進行連續轉化或者提供一些展示長網址TITLE的功能,所以會對長網址進行訪問。

其實對于短網址服務最核心的問題就是短網址的轉換算法。那么常用的短網址算法有哪些呢?我們分析了GitHub上star數量最多的十個短網址服務對應的算法,大致分為三類:進制算法、隨機數算法和HASH算法。
下面我利用簡單的三個小例子介紹下對應的算法:
(1)進制算法:
算法簡述:一個以數字、大小寫字母共62個字符的任意進制的算法。
數據庫中ID遞增,當ID為233,則對應短網址計算過程如下:
①設置序列為“0123456789abcdefghijklmnopqrstuvwxyz”
② 233/36=6
③ 233%36= 17
④依次取上述字符的6位,17位,則為6h
其生成之后的短網址為xx.xx/6h
(2)隨機數算法:
算法簡述:每次對候選字符進行任意次隨機位數選擇,拼接之后檢查是否重復
若要求位數為2,則其對應短地址為計算過程如下:
①設置字符序列“0123456789abcdefghijklmnopqrstuvwxyz”
②根據字符個數設置最大值為35,最小值為0,取2次隨機數假設為:6,17
③依次取上述字符的6位和17位,則為6h
其生成之后的短網址為xx.xx/6h
(3)HASH算法:
算法簡述:對id進行hash操作( 可選:利用隨機數進行加鹽),并檢查是否重復
設置ID自增,若ID=233,則其對應短地址為計算過程如下:
①取隨機數為鹽
②對233進行sha1加密為:aaccb8bb2b4c442a7c16a9b209c9ff448c6c5f35:2
③要求位數為7,直接取上述加密結果的前7位為:aaccb8
其生成之后的短網址為xx.xx/2e8c027
了解完長網址轉為短網址的流程之后,我們下邊主要簡單說明下短網址轉化為長網址的流程,用戶訪問短網址,短網址服務返回一個302或者301的響應,從而跳轉到長網址。這個地方,幾乎所有短網址服務商會選擇302,因為302方便統計和分析用戶屬性等數據。

二、短網址服務風險
由于短網址服務自身存在的設計缺陷問題,尤其是一般短網址采用6位或者7位字母和數字的集合,可以被很好的預測,從而被針對性的爆破。
而在爆破中最重要的一個步驟就是如何檢測當前短網址使用的算法,從而生成該算法對應的字典,下邊我們給出一些常見的算法檢測過程:
1、進制算法
(1)第三方短網址服務
針對第三方的短網址服務,可以多次輸入網址,查看返回短網址是否連續,連續則為進制算法,如下:

此外注意,由于個別為分布式短網址服務,id非單一遞增,會出現多個字符規律變化,如:87BNwj、87BO82、87BOqw、87BOGz、87BPpD
(2)自營短網址服務:
對于自營短網址服務可以采用以下兩個步驟進行,,
① 直接訪問xx.xxx/1及xx.xxx/2低位等后綴,若均存在基本可以判定使用了進制算法進行轉換。
② 對存在記錄的后綴進行增加或減少嘗試,若均存在記錄或者規律間隔存在記錄則基本認為使用了進制算法。
即:若某短網址存在http://xxx.xx/Abzc4 ,對Abzc4中最后一個單字符{0-Z}共62次變化。若均存在記錄或存在a,c,e等有規律間隔情況,則同樣可以認為使用了進制算法。
2、hash算法&隨機數算法
(1)第三方短網址服務
對于第三方可以多次輸入網址,查看返回短網址是否連續,不連續無規律則為HASH算法&隨機數算法。如下圖:

(2)自營短網址服務
① 直接訪問xx.xxx/1及xx.xxx/2低位等后綴,若均不存在則進行步驟2。
② 對存在記錄的后綴進行增加或減少嘗試,若非均勻間隔存在記錄則基本認為使用了進制算法。
即:若某短網址存在http://xxx.xx/Abzc4 ,對Abzc4中最后一個單字符{0-Z}共62次變化。若無明顯規律則基本認為為HASH&隨機數算法
接下來,我們分享一下短網址的兩個攻擊場景,第一個是由于部分短網址在傳輸過程使用了含有敏感權限和敏感信息的長網址,由此造成大量個人信息泄露:,第二個是由于短網址的可預測和可爆破,有時候可能會產生一些想象不到的效果。 案例一:爆破短網址服務獲取大量服務、系統敏感信息:
1、獲取個人信息
http://xx.xx/auth?contractId=d57f17139247036b72******b5554a830305ec139d
2、獲取合同
https://xx.xx/get.action?transaction_id=290414****03784&msg_digest=RUQ2MUQ5NjcxQzc5MjcxQ*******4QTExNTZFNjgzQTJENEExQjc5Nw==
3、重置密碼
https://xx.xx/resetPassword?emailType=RESET_PASSWORD&encryptionEmail=***GHOsR%2FMfiNEv8xOC29.&countersign=eyJhbGciOiJIUzUxMiJ9.eyJBQlNPTFVURV9FWFBJUkVfVElNRV9NSUxMUyI6IjE1M******zA1OTMxNjU4OTQiLCJORVdfRU1BSUwiOiJ5YW54aXUwNjE0QGdtYWlsLmNvbSIsIlRPS0VOX1RZUEUiOiJSRVNFVF9QQVNTV09SRCIsIkVNQUlMIjoieWFueGl1MDYxNEBnbWFpbC5jb20ifQ
其實單從上邊的爆破出來的鏈接來看,每一個都極其的難以猜解,但是正是因為使用了短網址,從而把一些非常難猜解的高維度信息降低成了非常容易預測的低維度信息,就像你造了很堅固的房門,但是別人手里卻有備用鑰匙。
案例二:業務安全攻擊鏈
1、邀請鏈接直接發送給邀請人,邀請人點擊即可完成注冊;
2、邀請鏈接以短網址發送;
3、批量邀請,爆破短網址,批量點擊注冊,即可完成薅羊毛;
某個應用有老用戶邀請新用戶的賺賞金活動,邀請鏈接以短網址形式發送給新用戶,新用戶點擊鏈接之后,則賞金會放到老用戶賬戶之中。那么在這個活動中,攻擊者用戶A可以隨機選擇兩個手機號,我們分別用用戶B和用戶C來代替這兩個用戶,那么攻擊用戶A邀請隨機選擇的這兩個手機號,之后直接爆破短網址進行確認,則在B和C不知情的情況下完成了賞金的領取。
三、短網址服務漏洞
其實當短網址出現短網址被猜解、爆破的問題,那么是不是會出現其他的問題,所以我們還對其進行了其他的安全測試。
1、SSRF安全問題
遠程訪問功能在過濾不嚴謹的情況下會造成SSRF,測試時使用自定義域名綁定一個內網地址之后進行訪問,該短網址服務展示了長網址的TITLE,如下成功訪問到了內網地址:

2、獲取TITLE功能和展示長網址頁面,在過濾不嚴謹的情況下,造成XSS。
部分短網址服務提供了長網址TITLE的展示功能和在當前頁展示長網址的功能,在過濾不嚴謹的情況下也會造成xss。

如上圖中cve為在展示長網址頁面造成了xss問題。而同時取title并在頁面上展示也會造成xss,比如可以構造payload:“alert(1)“。
3、sql注入問題
進行拼接查詢時會造成SQL注入。在測試中我們先進行了and 1=1的測試,發現可以正常讀取,如下圖:

之后再進行數據庫版本的聯合注入,如下圖:

四、短網址防御實踐
對于短網址服務,建議以下措施提升安全性:
1、增加單IP訪問頻率和單IP訪問總量的限制,超過閾值進行封禁。
2、對包含權限、敏感信息的短網址進行過期處理。
3、對包含權限、敏感信息的長網址增加二次鑒權。
五、影響范圍
秉承“負責任的漏洞披露過程”,我們在測試過程中發現的短網址安全問題,均已通過對應SRC通知相關廠商,廠商均已快速修復完畢。
精力有限,未能一一測試,還請各廠商自測修復。
|