登錄註冊表單滲透

大家在甲方授權的滲透測試中,經常會遇到各種表單:登錄、註冊、密碼修改、密碼找回等表單,本技術稿着重介紹關於各種表單的滲透經驗,拋磚引玉,歡迎大家交流互動。

方便大家查看,製作如下思維導圖,以下只詳細介紹其中一些重要常用的漏洞。

一、登錄處是否可繞過—>(抓包decode+爆破)【高危】

password在前端用url編碼—>URL Decode

爆破成功

漏洞修復

1、增強驗證碼機制,為防止驗證碼被破解,可以適當增加驗證碼生成的強度,例如中文圖形驗證碼。 2、用戶名或密碼輸入錯誤均提示「用戶名或密碼錯誤」,防止黑客獲取到註冊用戶信息。 3、限制用戶登錄失敗次數。 4、限制一定時間內IP登錄失敗次數。 5、使用雙因子驗證策略

二、賬號/密碼可枚舉 [高危]

漏洞描述:由於頁面對輸入的賬號、密碼判斷的回顯不一樣,攻擊者可以通過回顯差異進行用戶名的枚舉,拿到賬戶名來進行弱口令的爆破。

用戶名存在

用戶名不存在

漏洞修復

1.增加驗證機制,如驗證碼 2.添加token 3.統一身份驗證失敗時的響應,用戶名或密碼錯誤

三、賬號/密碼硬編碼【高危】

漏洞描述:賬號或密碼都被硬編碼在頁面中,只需要輸入正確用戶名/密碼/驗證碼即可

漏洞修復

1.取消默認硬編碼配置,刪除敏感信息,禁止直接明文存儲在前端登陸框。

四、手機驗證碼可爆破

前提:該頁面沒有圖形驗證碼或圖像驗證碼失效+後端對驗證碼輸入錯誤次數沒有做任何限制+驗證碼的時效性高於爆破時間.

爆破成功

漏洞修復

1.點擊獲取手機驗證碼後產生即時更新強圖形驗證碼 2.限制輸入錯誤次數 3.縮短驗證碼的有效期

五、短訊轟炸

修改號碼回顯為ok

現在可以寫個小程序對目標進行循環發包,實現短訊轟炸

Note:為了防止被ban,給大家說個技巧:可以停頓十秒再發下一個;有時雖然後端對其進行驗證,但是還是有辦法繞過 1>刪除cookie值 2>手機號後加空格或n

漏洞修復

1.後端對同一手機號在某段時間只能發送一條短訊,並且設置發送次數的上限

六、註冊表單之批量註冊

正確的信息註冊 response:{"content":"/User","type":1,"data":null}

對手機號進行批量遍歷,發現批量成功,存在批量註冊漏洞

七、註冊表單之覆蓋註冊

漏洞詳情:此漏洞是指以前已經用一個手機註冊了會員,由於此漏洞的存在,導致可以利用該手機號重複註冊,並且會覆蓋之前註冊的會員信息。

已註冊:顯示ture,沒註冊:顯示false

修改返回包為false

發現此手機號又可以註冊了!

八、任意用戶密碼重置

漏洞描述:在修改密碼錶單處 通過修改數據包的特定數據修改任意用戶的密碼

修改id為需要重置的用戶

id 10016的密碼重置為123456

漏洞修復

1. 使用session對當前用戶的權限做校驗 還有以下情況我就不一一舉例了。 1>Cookie值替換 2>跳過驗證步驟 3>驗證碼未綁定用戶

九、圖形驗證碼繞過(從代碼層面分析)

原理解讀:

驗證碼(CAPTCHA)Completely Automated Public Turing test to tell Computers and Humans Apar —>全自動人機區分的圖靈測試。

圖形驗證碼應用非常廣泛,無論在Web應用還是客戶端軟件,為防止暴力破解、機器註冊等。遺憾的是好多開發者不得要領,為完成工作進度,敷衍了事。

驗證碼常見的安全問題: 1>驗證碼存在邏輯缺陷,可被繞過,可被逆向; 2>驗證碼太簡單,容易被機器識別;

Q1:把驗證碼是否出現的判斷邏輯放在客戶端瀏覽器

原理:某些系統默認不顯示驗證碼,只有在用戶校驗錯誤一定次數之後再出現。

那我非常好奇,那如何判斷用戶已經錯誤幾次了呢?沒有經驗的開發可能這樣做:

1.在cookie中寫入一個標記,Eg:loginErr = 1,後續錯誤累加. 2.在session中寫入一個標記,Eg:loginErr = 1,後續錯誤累加.

問題來了,如果攻擊者不帶Cookie提交HTTP請求呢?或攻擊者不更新Cookie中的loginErr的值反覆提交呢?

程序因為無從獲取Cookie/sessionID,會認為攻擊者是首次訪問,無論什麼時候,驗證碼都不會出現!

Q2:驗證碼不過期,單個驗證碼反覆可用

原理:大部分情況,驗證碼在web服務器上對應一個session值。如果完成一次校驗,不標記這個session已失效,就會造成同一驗證碼反覆可用,因此攻擊者在cookie中帶固定的sessionID和固定的一個驗證碼字符串,即可輕鬆爆破。

還有一種非常常見的代碼實現思路,更新session的工作是通過重新下載驗證碼達到的,開發人員最容易犯的一個失誤就是把更新session的任務交給客戶端瀏覽器來完成。Eg:302重定向,甚至是通過js、meta refresh重定向頁面,來引導用戶重新下載驗證碼。這些做法實際是錯誤的,要是用戶攔截了重定向,沒有發出新的下載請求呢?上次的驗證碼是否還可以使用?開發者需要做到:一張驗證碼,只能使用一次。使用之後,立即過期,不可再次使用!

Q3 將驗證碼內容輸出到客戶端

不管出於什麼考慮,都不應該把驗證碼的內容發送到客戶端cookie、或輸出到response headers的其他字段。Eg:寫入驗證碼的MD5值、 Base64轉碼等,太容易被黑客逆向破解,得到原值了,即便是加固定salt後輸出,都是不安全的。

Q4 驗證碼太弱

通常出現邏輯錯誤的驗證碼,同樣存在太弱的通病,使用開源的tessertact OCR引擎,不經任何訓練,不人工去噪處理,能識別互聯網上的大部分驗證碼!

實例演示: 驗證碼重放攻擊

漏洞詳情:測試發現,在用戶登錄時,驗證碼不是即時刷新,導致攻擊者可通過重放驗證碼進行登錄爆破。

抓包發現驗證碼數據並沒有傳輸到後端校驗

漏洞修復

1.驗證碼只能用一次,用完立即過期!不能再次使用,實現一次一碼。 2.驗證碼不要太弱。使用扭曲、變形、干擾線條、干擾背景色、變換字體等。 3.大網站最好統一安全驗證碼,各處使用同一個驗證碼接口。

*本文原創作者:星空111,本文屬於FreeBuf原創獎勵計劃,未經許可禁止轉載