Low 服務器只是驗證了引數Login是否被設定,沒有任何的防爆破機制,且對引數username、password沒有做任何過濾,存在明顯的sql注入漏洞, 方法一:bp爆破 直接對爆破密碼得到password長度與眾不同,再手工驗證登錄成功, 方法二:手工sql注入 admin’ or ’1′=’1 admin’ # Medium mysql_escape_string函式會對字串中的特殊符號進行轉義,基本上能夠抵御sql注入攻擊,但是,依然沒有加入有效的防爆破機制(sleep(2)實在算不上), 和之前一樣,bp爆破, High 加入了Token,可以抵御CSRF攻擊,同時也增加了爆破的難度,通過抓包可以看到,登錄驗證時提交了四個引數:username、password、Login以及user_token,
每次服務器回傳的登陸頁面中都會包含一個隨機的user_token的值,用戶每次登錄時都要將 user_token一起提交,服務器收到請求后,會優先做token的檢查,再進行sql查詢,
根據代碼可以得知
1.isset函式用來檢測變數是否設定,并且不是 NULL,
2.用戶可以完全控制該引數,傳參時給Login賦值即可滿足條件繼續執行,
3. 校驗token,每次都需要更新token,
3.用戶名部分使用,stripslashes(str)函式去除用戶名中出現的反斜線,然后再使用mysqli_real_escape_string(str)函式用戶名的特殊符號(\x00,\n,\r,\,‘,“,\x1a)(ascii碼0,換行,回車,回退)進行轉義,完全抵抗SQL注入,
4.用戶輸入的密碼將進行md5散列后傳遞到SQL陳述句中,
5. 如果密碼輸錯了,則延時0-3秒之后才能再次提交,
網上找到兩種方式,一種是用py腳本跑,還有一種也是用burp,
impossible
可以看到Impossible級別的代碼加入了可靠的防爆破機制,當檢測到頻繁的錯誤登錄后,系統會將賬戶鎖定,爆破也就無法繼續,
同時采用了更為安全的PDO(PHP Data Object)機制防御sql注入,這是因為不能使用PDO擴展本身執行任何資料庫操作,而sql注入的關鍵就是通過破壞sql陳述句結構執行惡意的sql命令,
關于PDO:http://www.cnblogs.com/pinocchioatbeijing/archive/2012/03/20/2407869.html
本文僅是個人學習記錄,部分摘自FreeBuf.Com等,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/21013.html
標籤:其他
