第二十四關:
這關考驗的是sql的二次注入。
這關是一個登陸加注冊的功能點,登陸的地方沒有注入,賬號密碼都輸入輸入'",頁面只會顯示登陸失敗。
但注冊賬號的地方沒有做過濾可以注冊帶有單引符號的用戶,比如可以直接注冊一個單引符號的用戶
其實從源碼中可以看到,只要是用戶輸入的參數,再放入sql進行拼湊之前都會經過mysql_real_escape_string這個函數的轉義,也就造不成注入了(除了寬字節注入)
后來發現,用戶登陸成功后會有一個修改密碼的功能
這里也可以直接看源碼
sql語句中有三個參數拼湊進去了,但是可以看到程序只對用戶輸入的參數做了轉義,而從session中獲取的參數沒有做處理,原因是理論上session是可信域,也就是說里面參數是用戶不可控的。
但是事與願違,session中的uname是從數據庫中取得,而我們在注入賬號的時候是可以往數據庫中加入帶有單引符號的uname。
ok,知道這里應該可以注入后,我們再仔細看下這個sql語句,這是一個update的注入,假設uname我們可以隨意控制,我們讓uname= admin' #是不是就可以將管理員的密碼修改了,而且由於注釋掉了后面的語句,所以我們都不用輸入正確的admin的密碼。
發現可以成功修改管理員的密碼。那么這里僅僅能做到修改密碼的操作嗎?
顯然不是,我們之前就了解了update的sql語句存在報錯注入和盲注,這里沒有報錯信息,所以只能盲注了。但這里由於盲注之前需要有個注冊操作,比較麻煩,需要自己寫腳本。我這里先不寫了,以后遇到了再補上吧。