一、萬能密碼:
什麼是萬能密碼?
使用者進行使用者名稱和密碼驗證時,網站需要查詢資料庫。查詢資料庫就是執行SQL語句。使用者登入時,後臺執行的資料庫查詢操作(SQL語句)是:
【Select user_id,user_type,email From users Where user_id=’使用者名稱’ And password=’密碼’】
這裡我們沒有對單引號進行過濾,當輸入使用者名稱【admin】和萬能密碼【2’or’1】時,執行的SQL語句為:
【Select user_id,user_type,email From users Where user_id=’admin’ And password=’2’or’1’】。
3.由於SQL語句中邏輯運算子具有優先順序,【=】優先於【and】,【and】優先於【or】,且適用傳遞性。因此,此SQL語句在後臺解析時,分成兩句:
【Select user_id,user_type,email From users Where user_id=’admin’ And password=’2’】和【’1’】,兩句bool值進行邏輯or運算,恆為TRUE。
SQL語句的查詢結果為TRUE,就意味著認證成功,也可以登入到系統中。
1’ or 1 = 1--+
1'or'1'='1'%23
二、waf繞過 sql注入
空格:/**/ %0a
,%0b
,%0c
,%0d
,%09
都可以表示空格
註釋符 : --+ %23 # 都可以表示註釋符
還有很多繞過參考ctfshow web178-186
web187 md5繞過
mysql中,or 語句後面只要是一個1開頭的,那就整個結果就是true
所以本質就是要構造or ‘number'
$username = $_POST['username']; $password = md5($_POST['password'],true);
md5類的password繞過
萬能md5:ffifdyop
$sql = "SELECT * FROM admin WHERE pass = '".md5($password,true)."'";
構造的ffifdyop即可實現下述程式碼 其中or 一側存在6 非0即為真滿足條件即可登入
SELECT * FROM admin WHERE pass=’ ‘or ’ 6’
web188 只能為數字 弱型別比較
mysql弱型別比較
如 ‘4ad’=4
字串與數字進行比較的時候,mysql會自動將字串轉為數字
而當數字為0,且字串開頭不為其他數字時,弱型別恆成立
那麼我們就可以使password = 0 這樣對於所有的密碼以字元開頭的 都是可以匹配的
全部傳0即可
web189