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