注:以下漏洞示例已由相關廠商修復,切勿非法測試!
0x01 漏洞挖掘
01 注冊
注冊中最常見的有兩個,一個是惡意注冊,另一個是賬戶遍歷。一個好的注冊界面應該是這樣
或者這樣的
而不是這樣的
要么使用短信或郵箱進行驗證,要么存在難以識別的驗證碼,使得注冊的請求無法批量提交。那么賬戶遍歷是什么意思呢?在注冊的時候Web程序往往會有用戶名或手機號(或其他什么)檢測之類的步驟,以避免相同賬號注冊兩次,比如一般會提示“***用戶名已存在!”。我們就可以利用這個步驟去批量嘗試一些用戶名,如果提示已存在就說明存在這個用戶,然后就可以用這個用戶名進行下一步操作,比如登錄爆破(直接爆破的話可能會提示“用戶名或密碼錯誤”,用已知用戶名爆破就只需要關心密碼問題了)和密碼找回。
02 登錄
登錄里比較簡單的一種的情況就是登錄界面不存在驗證碼可以直接爆破,第二種就是存在驗證碼但可被繞過,第三種是第三方賬戶登錄可被繞過,這里重點說第二和第三種的問題。
1、短信驗證碼
這種情況一般指4位數字驗證碼,且不限制錯誤次數。比如以某APP為例,短信登錄界面如下
獲取驗證碼后隨意填寫,抓包
然后在intruder里爆破
再用獲得的驗證碼登錄即可。
2、圖形驗證碼
以ESPCMS V6的一個漏洞為例,在會員和后台登陸的地方對驗證碼識別的方式是可以繞過的,在文件/upload/interface/member.php 500行左右的位置是后台登陸檢驗驗證碼的地方:
看一下他檢測驗證碼的方式,將輸入的驗證碼與cookie中的值比較,這意味着什么?只要我們不改變cookie中的值以及輸入的驗證碼的值,那么就可以繞過驗證碼識別。也就是說驗證碼是和cookie綁定的,如圖所示只要刷新一下改變驗證碼下面的這條cookie就跟着變化。只要不改變這兩個值就能使用一個驗證碼持續登陸,這樣就能爆破了。
如果爆破的話還要解決另外一個問題,每個登陸界面只能請求一次,因為還有一個隱藏的token參數
這樣的話就要每嘗試一次動態獲取這個token值,其中token中的值是和返回的PHPSESSID綁定的,所以這里同步獲取PHPSESSID和token然后進行爆破。例如在burp中只需要更新post數據中tokenkey的值即可再次發包,但是並不會觸發驗證碼錯誤。
漏洞利用程序如下:
爆破測試
3、第三方賬戶登錄繞過
現在很多網站或APP都支持第三方賬號登錄,比如微信、微博,這些登錄本身接口一般沒什么問題,但是在使用的時候可能會出現邏輯錯誤,以知乎曾經爆出的一個漏洞為例,打開知乎客戶端,用一個微博小號登錄,攔截微博授權成功的請求地址:https://api.weibo.com/oauth2/sso_authorize?sflag=1,修改Response Body,將uid改成要登錄的uid:
然后即可登錄
知乎服務器端在拿到客戶端提交的授權成功以后,還應該調用第3方平台的token校驗,以微博為例子,應該再調用一次:https://api.weibo.com/2/account/get_uid.json,看拿到的uid是否和客戶端提交的uid一致。另外登錄位置也存在賬號遍歷的情況,比如有的登錄邏輯是先判斷是否存在這個用戶名然后給予提示“用戶名不存在”或不提示。
02 密碼找回
密碼找回的利用姿勢比較多,還是先說驗證碼的問題。除了上節所說的4位驗證碼的可爆破的問題,還有驗證碼泄露、認證繞過、越權等問題。
1、驗證碼泄露
仍然以某APP為例
輸入驗證碼、要找回的賬號和手機號,點擊“獲取驗證碼”,同時攔截抓包,然后就可以在返回包中看到要認證的驗證碼,這樣不用得到用戶的手機,也能得到他的驗證碼
再輸入密碼即可找回。
2、驗證碼的認證繞過
以某網站為例,在密碼找回界面,輸入用戶名和密碼,點擊獲取驗證碼
驗證碼隨便輸,然后點擊下一步,攔截返回包,
將status改為0,然后就可以進入密碼修改界面
另外也存在替換手機號的情況,及將驗證碼發送到你替換的手機上,而找回的密碼還是原來的賬號。
2、郵箱弱token
有時候密碼找回是通過郵箱鏈接來實現的,鏈接里一般會有一個與賬號綁定的具有唯一性的認證參數,若這個參數能夠被猜解就會產生問題,以一個奇虎360出現過的一個漏洞為例,先正常流程取回一次密碼,查看郵箱,郵件內容類似:
猜測一下此處的流程,用戶取回密碼時,產生一個精確的時間戳,與帳號綁定,記錄在某個密碼重置庫內,那么修改這個用戶密碼必須得知道這個時間戳才可以,看似合理,但程序員忽略了一個細節,就是假如這個時間戳是新生成得,在一定時間段內進行暴力猜解,很快就可以獲取到這個有效得鏈接!以某賬號為例,輸入其郵箱找回密碼,然后同時爆破找回密碼的鏈接,點擊訪問
用修改的密碼即可登錄
4、越權修改
越權修改是指在密碼找回的過程中將正在找回密碼的賬號替換為指定的賬號並修改密碼,以某郵箱系統的一個漏洞為例,使用手機找回的方法來驗證
設置密碼
提交的時候抓包,將userName改為想要修改的賬戶
在下一次的請求中再修改一次
然后使用修改的密碼即可登錄
03 越權
越權一般包括水平越權和垂直越權。
1、水平越權
水平越權:就是相同級別(權限)的用戶或者同一角色不同的用戶之間,可以越權訪問、修改或者刪除的非法操作。如果出現次漏洞,那么將可能會造成大批量數據泄露,嚴重的甚至會造成用戶信息被惡意篡改。以某APP為例,在點擊賬戶信息按鈕時會返回當前賬戶的基本信息,如下是請求的數據包
返回的包為
如果直接修改Id,改為0001001238,那么注意看返回包
這里就是沒有任何的身份認證,僅根據Id返回相應的數據,導致可以水平越權,查看他人的賬戶信息。再看另一個例子,以某網站為例,登錄進入個人主頁界面
在Firefox中修改uid的值即可進入他人賬號
2、垂直越權
垂直越權:是不同級別之間或不同角色之間的越權;垂直越權又別分為向上越權與向下越權。比如,某些網站,像發布文章、刪除文章等操作屬於管理員該做的事情。假設一個匿名用戶也可以做相同的事情,這就叫做向上越權;向下越權是一個高級用戶可以訪問低級用戶信息(這也是不行的,這回暴漏用戶的隱私)。以ZDSoft網站生成系統越權漏洞為例,比較老的一個洞,網站后台登錄地址一般為:http://www.***.cn/admin/login.aspx
后台菜單地址為:
http://www.***.cn/admin/left.aspx
如果沒有登錄直接訪問菜單地址js跳轉到登錄地址,但是禁用了瀏覽器js后就可以直接訪問而不會跳轉,比如訪問用戶管理界面
再以某APP為例,APP有兩種登錄模式,用戶(指定人員)登錄和游客登錄。對於游客來說很多功能不能訪問,只能看到如下功能
指定用戶登錄,可以使用所有功能
但是APP只是做了前端限制,以游客權限直接發送用戶權限的數據包即可使用相關的功能,比如以游客的登錄憑據訪問用戶才可使用的“**查詢”功能。
3、兩種越權的區別
水平越權的問題出現在同一個角色上,系統只驗證了能訪問數據的角色,而沒有對角色內的用戶做細分,也沒有對數據的子集做細分,因為缺乏一個用戶到數據之間的對應關系。由於水平權限管理是系統缺乏一個數據級的訪問控制所造成的,因此水平權限管理又可稱之為“基於數據的訪問控制”;垂直權限問題出現在不同角色上,一般來說高權限角色可以訪問低權限角色的資源,而低權限角色訪問高權限角色的資源則被禁止。如果一個本屬於低權限角色的用戶通過一些方法能夠過得低權限角色的能力,則發生了垂直越權漏洞。
04 交易
這里的情況一般就是訂單可被惡意修改,比如修改購買數量和單價以形成超低價的總額,以中國移動出現過的一個漏洞為例,中國移動和健康體檢通,可通過修改訂單價格實現免費體檢,首先選擇套餐
然后抓包修改數據
然后即可支付
另外一個套餐
付款成功
可以看到套餐已訂購
0x02 防御
01 驗證碼策略
1、驗證碼至少是6位數字,且有時間限制、獲取次數限制和錯誤次數限制。
2、驗證碼的驗證要放到服務端執行,不能將驗證碼返回到前端。
3、若只能放到前端,必須采取加密策略。
4、多步校驗,比如找回密碼第一步驗證了,最后一步提交時也要驗證。
02 權限策略
1、登錄憑證要時刻驗證,不能只在登錄接口處進行登錄驗證,要任何需要登錄權限的地方進行登錄驗證(cookie,ssid,token等)。
2、用戶操作要進行對應的權限檢查,不能只根據操作參數或鏈接執行功能。
3、Cookie要進行嚴格加密,並與用戶session綁定。
4、采用“最小權限原則”進行訪問控制。
03 密匙簽名策略
1、郵箱找回密碼的功能,其認證參數要唯一且不可預測,盡量減少不必要的參數。
2、支付功能一定要使用嚴格的簽名算法,避免任何參數的修改。