驗證碼突破#
驗證碼主要用在登錄表單中進行登錄驗證,防止表單被暴力破解。如果驗證碼模塊設置不當,如客戶端驗證、服務端驗證碼不過期等,驗證碼就形同虛設。
一般有如下集中驗證碼分類:
- 圖形驗證碼
- 短信驗證碼
- 郵件驗證碼
- 滑動驗證碼
- 語音驗證碼
短信驗證碼#
驗證碼暴力破解#
現在的短信驗證碼大多都是 6 位數的驗證碼,6 位數的驗證碼不容易爆破,但是如果遇到 4 位數的驗證碼且失效時間和驗證碼未限制發送次數的情況下,那麼就可以嘗試爆破。
4 位數的驗證碼只需爆破 10000 次,次數算少的了,0000~9999 區間。
案例 1: 任意用戶註冊
攻擊者填寫任意手機號碼進行註冊,服務器向攻擊者填寫的手機號碼發送短信驗證碼,此案例的驗證碼是 4 位數,設置驗證碼的範圍為 0000~9999 區間,對驗證碼進行暴力破解,成功獲取到驗證碼後,就自動註冊了帳號。
通過返回的數據包可以判定是否破解成功。
如上圖所示,通過返回值的長度可以判定響應大小為 49 的是正確的驗證碼。
修復建議:
針對驗證碼的暴力測試,建議採取如下的加固方案:
(1)設置驗證碼的失效時間,建議為 180 秒;
(2)限制單位時間內驗證碼的失敗嘗試次數,如 5 分鐘內連續失敗 5 次即鎖定該帳號 15 分鐘
驗證碼繞過測試#
漏洞原理:
在一些案例中,通過修改前端提交服務器返回的數據(例如:res_code 等字段),可以實現繞過驗證碼,執行我們的請求。
測試流程:
攻擊者進入註冊帳戶頁面,輸入任意手機號碼,獲取驗證碼,在註冊帳戶頁面填寫任意驗證碼,提交請求並抓包,使用抓包工具查看並修改返回包信息,轉發返回數據包,查看是否註冊成功。
修改響應包
修復建議:
針對此漏洞,建議在服務端增加驗證碼的認證機制,對客戶端提交的驗證碼進行二次校驗。
驗證碼重複使用#
漏洞原理:
在網站的登錄或評論等頁面,如果驗證碼認證成功後沒有將 session 及時清空,將會導致驗證碼首次認證成功之後可重複使用。測試時可以抓取攜帶驗證碼的數據包重複提交,查看是否提交成功。
測試流程:
攻擊者正常流程註冊帳號,輸入頁面驗證碼,抓取提交的數據包,使用發包工具對數據包中的用戶名字段修改後進行重複提交,然後查看是否成功註冊多個帳號。
修復建議:
針對驗證認證次數問題,建議驗證碼在一次認證成功後,服務端清空認證成功的 session,這樣就可以有效防止驗證碼一次認證反復使用的問題。
驗證碼 GET 傳輸泄露#
可以看到,驗證碼就在 get 包中,直接就能獲取到驗證碼,這樣一來,即使無須有的手機號依然可以註冊,直接把驗證碼輸入
短信轟炸#
漏洞原理:
短信發送模塊處,未對短信的發送次數進行限制,導致可無限制發送短信驗證碼。
測試流程:
攻擊者在短信發送處填寫手機號碼,點擊發送驗證碼,抓包,重複發包嘗試是否可以多次接到短信驗證碼,如果 1s 中可以接收到多次驗證碼,說明存在短信轟炸漏洞。
一些繞過方法:
1、利用空格繞過
2、修改 cookie 值繞過
3、ip 繞過
4、修改返回值繞過
5、不同帳戶發送短信繞過
圖片驗證碼#
驗證碼繞過 (on client)#
js 前端驗證
禁用 javascript
瀏覽器 F12 - 設置 - 停用 JavaScript
來到登錄框
burp 抓包
intruder 爆破成功
驗證碼繞過(on server)#
同一個驗證碼發送多次不過期,可爆破,成功登錄
圖片驗證碼自動識別測試#
下載 captcha-killer-modified#
在Releases處下載 jar 文件
burpsuite 加載此 jar 文件
然後下載 captcha-killer-modified 源碼倉庫,需要用到 codereg.py 文件,這個文件是用來開啟驗證碼識別模塊的,前提需要安裝 dddddocr 庫。
git clone https://github.com/f0ng/captcha-killer-modified.git
安裝 ddddocr 庫#
倉庫地址:https://github.com/sml2h3/ddddocr
注:我的環境是 mac m1 pro
# brew安裝onnxruntime
brew install onnxruntime
pip3 install ddddocr # python3.9安裝運行codereg.py報錯
使用 python3.10 安裝 aiohttp
pip310 install aiohttp -i http://pypi.doubanio.com/simple/ --trusted-host pypi.doubanio.com
運行python310 codereg.py
報錯:TypeError: The port is required to be int.
解決報錯:
將腳本中default="8888"
更改為default=8888
再次運行即可
重新運行python310 codereg.py
,正常
實戰案例 1#
靶場是用 pikachu 的靶場
1、burp 請求驗證碼 url
請求驗證碼 URL,點擊獲取,可以獲取右側的驗證碼
上圖中左側的請求內容可以先抓個登錄框的包,然後修改 post 中的 url 為驗證碼的 url,下圖中發送到 captcha-killer-modified 插件。
其他案例,關鍵字
提取
2、設置 ddddocr 接口 url
設置請求模板,Request template
POST /reg HTTP/1.1
Host: 127.0.0.1:8888
Authorization:Basic f0ngauth
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:97.0) Gecko/20100101 Firefox/97.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 8332
<@BASE64><@IMG_RAW></@IMG_RAW></@BASE64>
接口地址設置為:http://127.0.0.1:8888,codereg.py 啟動的服務
設置如下:
此時 captcha-killer-modified 面板的內容如下,精準識別了驗證碼
3、開始 intruder 爆破
- 設置 attack type 為 pitchfork
- 爆破密碼字段和 vcode 驗證碼字段
設置密碼處的 payload
設置驗證碼的 payload
最終識別率,這裡用的靶場驗證碼比較複雜。
codereg.py 的輸出
參考#
- https://gv7.me/articles/2019/burp-captcha-killer-usage/
- 書籍參考:《web 攻防業務安全實戰指南》