突破封閉 Web 系統的技巧之正面衝鋒

FLy_鵬程萬里發表於2018-06-01

前言

在網際網路安全服務公司乙方工作的人或者進行 SRC 眾測等相關滲透測試時,經常碰到客戶只給一個 "xxx資訊管理系統"、"xxx平臺"之類的一個 Web 登入介面的系統的連結地址,其它全憑自己造化,去找漏洞吧!

我將上面講的 "需要認證後才能進入系統進行操作,但是當前沒有認證憑證"的 web 系統統一稱為"封閉的 Web 系統",本文認為閱讀人員有一定的滲透測試經驗,並將就如何突破封閉的 Web 系統,進行探討。分享自己的思路與常用技巧,歡迎同道中人一起交流思路。

注:本文有一定的攻擊性操作,僅為安全從業人員滲透測試思路交流,請在法律條規允 許的範圍內進行安全測試。

正面衝鋒

《突破封閉 Web 系統的技巧》由兩篇文章組成。這是第一篇文章"正面衝鋒"。

遇到需要登入才能進一步測試的系統,又沒登入口令?沒關係,我們有不少正面衝鋒的小技巧,相信你看完一定會有所收穫。

0x00:登入繞過

如果能繞過系統認證,直接登入,那就萬事大吉了!目前繞過登入認證的方法主要有:

1、SQL 注入萬能密碼登入,語句: a' or '1'='1' --
2、XSS 獲取到已登入系統的使用者 Cookie,替換後進入系統
3、通過列目錄漏洞、google hacking、目錄檔案掃描等手段,發現可以未授權訪問的管理頁面,可以直接進行操作
4、通過抓包,更改使用者id、登入名或 Cookie 中的敏感認證欄位值,可越權登入訪問
5、通過已知的後門連結或程式碼中固化的後門管理口令,直接登入

0x01:密碼猜解

大部分系統登入是繞不過的,最常用的還是猜解已知使用者名稱的密碼,用合法的憑證登入系統。

Web 系統進行密碼猜解,大部分人喜歡叫密碼爆破,因為猜解一個人的密碼,通常需要成千上萬條的密碼來嘗試。密碼猜解的目的是準確高效的獲得已知使用者的正確密碼。

1、用來傳送 HTTP/S 協議爆破密碼的工具主要使用 Burpsuite。

其它的就是用一些指令碼,自己造輪子或用已經寫好的較為通用的發包指令碼,如 htpwdScan

https://github.com/lijiejie/htpwdScan

2、高效的保證就是猜解時使用的密碼字典要合適

一般是先嚐試TOP500、TOP1000:

https://github.com/LandGrey/pydictor/blob/master/wordlist/SEDB/ChineseWeakPass1000.txt

3、沒有猜解成功的話,就需要自己根據目標的資訊構造針對性的字典來爆破了。

可以自己寫指令碼生成,但是費時費力,對於比較急的任務往往不適用。推薦一下自己寫的一個高階字典生成工具 pydictor

https://github.com/LandGrey/pydictor

可以直接配置裡面的規則生成字典,也支援高階玩家根據API寫自己的密碼生成外掛,一勞永逸。

其它的一些比較好的字典生成工具推薦 crunch:

https://sourceforge.net/projects/crunch-wordlist/files/
Cewl:
https://github.com/digininja/CeWL/
Cupp:
https://github.com/Mebus/cupp

0x02:管理員猜解

在不能判斷系統中存在什麼樣的使用者名稱時,通常先進行管理員使用者名稱的猜解,然後再根據存在的使用者名稱進行密碼破解。我總結了一個常見系統管理和測試使用者名稱字典 AwesomeSystemTestUsername

https://github.com/LandGrey/pydictor/blob/master/wordlist/NiP/AwesomeSystemTestUsername.txt 

可以做為管理員使用者名稱的猜解使用。

另外,如果系統對存不存在某使用者名稱無任何提示時,可以直接使用上面的字典,加上弱口令 TOP1000

https://github.com/LandGrey/pydictor/blob/master/wordlist/SEDB/ChineseWeakPass1000.txt
同時爆破常見管理員和測試使用者的使用者名稱和密碼,常有意外收穫!

0x03:普通使用者猜解

如果封閉系統是個多(幾十或幾百個)業務員系統,那麼此時最好用一個普通使用者名稱字典進行猜解。常見的是使用姓名拼音字典。比如 TOP500:

https://github.com/rootphantomer/Blasting_dictionary/blob/master/top500%E5%A7%93%E5%90%8D%E7%BB%84%E5%90%88.txt

TOP10w:

https://github.com/rootphantomer/Blasting_dictionary/blob/master/top10W.txt

等等。高階點的可以自己從中文姓名用指令碼轉化為拼音字典,不再贅述。

同樣,如果一個系統對存不存在某使用者無任何有用提示,要猜解的使用者名稱又非常多的情況下,可以只選幾個弱口令 "123456", "abc123", "1234", "1111", 同時爆破使用者名稱和密碼,效果會非常好。

另外,多使用者系統也常有初始化的預設密碼,通常比較簡單。如果能找到的話,配合10w姓名拼音字典,相信會賺的盆滿缽滿!

0x04:突破加密傳輸的口令

有些業務系統的口令傳輸到後端前,為了安全和老闆的要求,通常是由前端 js 進行編碼或加密後再傳輸的。常見的 Web 系統編碼和加密方式有 base64 編碼、md5 加密、sha1 加密、DES 加密、AES 加密、RSA 加密。這時候,我總結了以下三種爆破方法:

一:用爆破工具的內建功能,按照加密方法先加密後發包。

Burpsuite 的 "Payload Processing" 功能在此方面有明顯優勢。


二:用字典生成工具生成加密好的字典,然後爆破工具直接載入字典

在生成加密字典方面,pydictor 是不二之選。

encode 功能內建支援多種加密方法,並且支援自定義加密方法,直接呼叫 js 檔案中的加密方法進行加密等。另外,還可以用內建工具 handler,加密自己現有的明文字典,讓字典適用本次爆破場景。


當然,也可以自己寫輪子直接呼叫可以解析 js 語法的元件並執行,例如 python 的 execjs 模組、pyv8 模組等,原理和 pydictor 呼叫 js 檔案中的加密方法相同。

三:用 selenium+webdriver 模擬瀏覽器提交登入口令

對於某些動態加密或難以還原加密演算法的場合,可以用 selenium+webdriver 模擬瀏覽器操作,自動填寫密碼提交。具體實現和應用可參考文章 《基於 SELEINUM 的口令爆破應用》

http://sm0nk.com/2017/11/27/%E5%9F%BA%E4%BA%8ESeleinum%E7%9A%84%E5%8F%A3%E4%BB%A4%E7%88%86%E7%A0%B4%E5%BA%94%E7%94%A8/


0x05:突破登入 IP 地址限制

如果對方系統設定了可以登入系統的IP地址白名單,是不是就不能登入了?

也不一定,可以嘗試用下面的 9 個 HTTP 頭欄位,偽造下 IP 地址碰碰運氣。

Client-Ip: 127.0.0.1
X-Client-IP: 127.0.0.1
X-Real-IP: 127.0.0.1
True-Client-IP: 127.0.0.1
X-Originating-IP: 127.0.0.1
X-Forwarded-For: 127.0.0.1
X-Remote-IP: 127.0.0.1
X-Remote-Addr: 127.0.0.1
X-Forwarded-Host: 127.0.0.1

偽造後也不行,可以試試將正常的 IP 地址部分改成 sql 注入語句、xss 語句。可能觸發不了漏洞,但我確實遇到過異常字元使當前處理流程異常的。歐洲人直接登入成功,真是無 fuck 說。

0x06:圖形驗證碼繞過

 對於上面的幾種情況,一旦出現驗證碼,我們就不能愉快的爆破口令了,那麼有什麼方法可以繞過驗證碼進行密碼猜解呢?

1. 圖形驗證碼不重新整理或無效

手工嘗試一次登入後,在某一時間段內無論登入失敗多少次,只要不重新整理頁面 Session 不過期,就可以無限次的使用同一個驗證碼來對一個或多個使用者帳號進行暴力猜解;

登入失敗之後,系統會開啟一個新頁面或者彈出一個新的警告視窗,提示使用者登入失敗,點選確定後返回登入介面且驗證碼重新整理。這種情況下,只要我們不關閉新視窗或彈窗,驗證碼就不會失效;

還有就是不管輸入什麼資料,驗證碼都會判斷通過的極少數情況。

2. 圖形驗證碼值可直接獲取

驗證碼通常會被他們隱藏在網站的原始碼中或者在請求的 Cookie 中,或在 response 資料包中返回:

可以寫指令碼正則匹配也可以用 Burpsuite 的 macros 功能

http://blog.csdn.net/d_pokemon/article/details/78194351

來匹配返回資料包中資料。

3. 圖形驗證碼引數繞過

對於請求資料: user=admin&pass=1234&vcode=brln,有兩種繞過方法,一是驗證碼空值繞過,改成 user=admin&pass=1234&vcode=;一是直接刪除驗證碼引數,改成 user=admin&pass=1234

另外有時修改或刪除 Cookie 中的一些值也可以繞過,導致不需要填寫驗證碼也可以登入。

4. 存在無驗證碼頁面

經過測試,如果我們發現網站驗證碼自身並不存在缺陷,那我們接下來就可以嘗試尋找一些其他的登入頁面或介面來嘗試暴力破解。如隱藏的頁面、測試頁面、老舊版本的頁面等。

5. 萬能驗證碼

滲透測試的過程中,有時候會出現這種情況,系統存在一個萬能驗證碼,如0000、9999,只要輸入萬能驗證碼,就可以無視驗證碼進行暴力破解。

6. 驗證碼數量有限

多見於計算型別的驗證碼,如 1+2=?,這種型別的驗證碼嚴格意義上來說不能叫做驗證碼,多重新整理幾次驗證碼,我們可能會發現系統中的算數題目只有那麼幾道,這種情況下只要將驗證碼全部下載下來,生成一個 md5 庫,然後將前端生成的驗證碼與本地檔案進行對比即可。

http://nladuo.github.io/2016/09/22/%E9%AA%8C%E8%AF%81%E7%A0%81%E7%A0%B4%E8%A7%A3%E6%8A%80%E6%9C%AF%E5%9B%9B%E9%83%A8%E6%9B%B2%E4%B9%8B%E4%BD%BF%E7%94%A8K%E8%BF%91%E9%82%BB%E7%AE%97%E6%B3%95/

7. 簡單驗證碼識別

在平常的漏洞挖掘過程中,如果我們發現登入的驗證碼非常簡單且易於識別,那我們就可以嘗試使用自動化工具來進行登入破解了,如 PKAV 的 HTTP Fuzzer、python 呼叫 tesseract-ocr 庫等。

8. 使用高階演算法識別驗證碼

還沒有仔細研究過,主要是對特定網站的圖形驗證碼訓練識別模型,達到一定的準確率就可以呼叫進行模擬提交圖形驗證碼的值了。可參考以下三篇文章進行學習:

使用KNN演算法識別驗證碼:

卷積神經網路識別驗證碼

http://nladuo.github.io/2016/09/23/%E9%AA%8C%E8%AF%81%E7%A0%81%E7%A0%B4%E8%A7%A3%E6%8A%80%E6%9C%AF%E5%9B%9B%E9%83%A8%E6%9B%B2%E4%B9%8B%E4%BD%BF%E7%94%A8%E5%8D%B7%E7%A7%AF%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C/

使用 TensorFlow 訓練驗證碼

http://nladuo.github.io/2017/04/10/%E4%BD%BF%E7%94%A8TensorFlow%E8%AE%AD%E7%BB%83Weibo-cn%E9%AA%8C%E8%AF%81%E7%A0%81/

0x07:簡訊驗證碼繞過

對於網站要求輸入手機號,接收手機簡訊並校驗簡訊驗證碼是否正確進行登入的系統,突破的主要思路有:

1.簡訊驗證碼生命期限內可暴力列舉

在驗證碼還未過期的時間段內,可列舉全部的純四位數字、六位數字等較簡單的簡訊驗證碼;

2. 簡訊驗證碼在資料包中返回

同圖形驗證碼的 2,可以直接獲取到簡訊驗證碼。

3. 修改請求資料包引數或 Cookie 值繞過

比如有 post 資料包:mobile=18888888888&userid=00001, Cookie中有:codetype=1

在特定步驟,修改 mobile=自己的手機號,自己手機就可以收到別人的驗證碼,後面再用別人的手機號和接收到的驗證碼登入;

修改 Cookie 中可疑的引數和值,進行繞過,比如上面修改 codetype=0

4. 修改返回包繞過

舉個簡單的例子:提交錯誤的簡訊驗證碼,返回包中有: status=false,用 Burpsuite 的 "Do intercept" 功能修改為 status=true,即可繞過前端判斷,成功進入系統。具體還要結合實際的場景,靈活操作。

5. 攻破簡訊驗證碼介面

有些網站會遺留簡訊驗證碼測試頁面,比如/test.html等,如果能找到並且還可以正常使用,系統真是想怎麼進就怎麼進了。一般系統的簡訊驗證碼功能,都會有個介面平臺可以獲取到手機接收到的所有簡訊,找到並攻破也能進入系統。

6. 預設萬能密碼

為了方便測試以及維護,有的系統會留有萬能驗證碼,上線後還保留著。可能是固定的寫在配置檔案、js檔案或程式碼中,也可能是隨時間變化的,遇到是緣,定要珍惜。

0x08:雙因子驗證繞過

我碰到的雙因子驗證手段主要有兩種:

第一種是輸入了正確密碼後,系統向繫結的手機號傳送一條帶有一定隨機性的明文簡訊驗證碼,通常是6位純數字,驗證通過後才能登入系統。大多數的 web 系統的雙因子認證手段屬於此類。

第二種是用已經繫結的第三方的軟體上的實時動態碼作為第二憑證進行登入。如 Google Authenticator、手機令牌應用等,一般也是6位純數字,驗證通過後才能登入。

對於第一種簡訊驗證碼形式的雙因子驗證方式,完全可以套用 0x07: 簡訊驗證碼繞過 裡的姿勢來先進行繞過測試。第二種比較有難度,但是可以通過尋找第三方的軟體漏洞來 bypass Web 系統的雙因子驗證。除此之外,還有三種較為通用的繞過方法:

1、暴力破解

如果 Web 系統實現不當,可列舉所有的6位數字,有機率可以成功登入系統

2、利用密碼重置成功後的 seesion

當雙因子認證保護的Web系統開放密碼重置功能時,可以嘗試去重置密碼,重置成功後獲得的Session一般可以直接登   錄系統,不需要二次認證!

3、第三方 Oauth 認證跳過雙因子驗證

有許多 Web 系統可以通過第三方 Oauth 授權,比如 QQ 帳號、微博賬號授權登入等,獲得授權後,就直接跳轉回 Web 系統,自動登入且不需要二次認證。

總結

封閉的 Web 系統用登入憑證來保護自己柔弱的軀體,不讓陌生人觸碰。看似封閉、難以一窺的系統,但其實仔細梳理一遍思路,細心又耐心的右擊看過每一行網站原始碼、每一個 js 檔案,嗅探出每一個引數的意義。你就會有一個強烈的想法:我就是網站管理員,我密碼忘了,現在我要用我的方法進入系統!

參考文章:

登入加密演算法破解祕籍

http://liehu.tass.com.cn/archives/1016

對登入中賬號密碼進行加密之後再傳輸的爆破的思路和方式

http://www.freebuf.com/articles/web/127888.html

利用漏洞中驗證碼繞過的小技巧

http://foreversong.cn/archives/889

破解攔截繞過網站手機簡訊驗證碼方式

http://blog.csdn.net/attilax/article/details/53865068

4-methods-to-bypass-two-factor-authentication

https://shahmeeramir.com/4-methods-to-bypass-two-factor-authentication-2b0075d9eb5f


相關文章