sqli注入的方法以及可能導致sql注入的地方
使用“--”註解後面的sqli語句的時候,如果“--”後面沒有空格,可能會失敗
"#" 需要編碼為%23
有時候注入之後會有多個條目顯示,但是返回條件會判斷是不是隻有1條,這個時候可以使用limit關鍵詞,一條一條顯示
通過在輸入引數裡面,輸入"\"字元,破壞原先sql語句結構,達到sql注入的目的,例如sql語句:
SELECT * FROM users WHERE username='[username]' and password='[password]',把username內容輸入為"\",把password內容設定為 "or 1=1 -- ",那麼sql語句變為:
SELECT * FROM users WHERE username='\' and password=' or 1=1 --'
上面的sql語句查詢條件,username為"\' and password" 但是後面的 "or 1=1"
sql語句會總是執行成功,達到注入的目的了
在移動應用中,有時候會把查詢條件作為引數傳遞,這時候進行sql注入就更簡單了,例如:/sqlinjection/example4/?req=username%3d%27hacker%27
LIMIT後面的內容頁可能作為引數傳遞給資料庫去查詢,但是order by關鍵詞必須在limit前面,因此如果在limit的內容後面加"--"是無法註釋掉order by的,這種注入點,可以使用union關鍵詞來實現注入
group by後面的內容可能作為引數傳遞給資料庫去查詢,在sql語句中,group by位於order by 之前,因此如果在group by的內容後面加"--"是可以註釋掉order by的
當sql語句的錯誤資訊不返回,或者說在輸入引數中加入的注入內容沒有反應的時候,可以使用sql盲注,例如加入sleep函式,如果存在注入點,那麼執行時就會sleep一定時間
字符集設定有可能導致mysql-real-escape-string轉碼發生問題,在驗證輸入引數有可能導致不能去掉單引號轉義等,導致sql語句判斷條件恆成立,例如設定成gbk字符集之後,“%bf%27 or 1=1 -- ”會恆成立