在web應用程式的登入驗證程式中,一般有使用者名稱(username) 和密碼(password)兩個引數,程式會通過使用者所提交輸入的使用者名稱和密碼來執行授權操作。我們有很多人喜歡將sql語句拼接起來。例如:
select * from userswhere username =』 txtusername.text 』 and password =』 txtpassword.text 』
其原理是通過查詢users表中的使用者名稱(username) 和密碼(password) 的結果來進行授權訪問,在txtusername.text為a,txtpassword.text為1,那麼sql查詢語句就為:
select * from userswhere username =』 a 』 and password =』 1 』
如果分別給txtusername.text 和txtpassword.text賦值』 or 『1』 =『1』 --和abc。那麼,sql 指令碼直譯器中的上述語句就會變為:
select * from userswhere username =』』or 『1』 = 『1』 -- and password =』abc』
該語句中進行了兩個條件判斷,只要乙個條件成立,就會執行成功。而'1'='1'在邏輯判斷上是恆成立的,後面的"--"表示注釋,即後面所有的語句為注釋語句這樣我們就成功登入。即sql注入成功.
類似的原理還有
' or1=1--
1'or'1'='1
x'or'1'='1'or'1'='1
如果我們給txtusername.text賦值為:』;droptable users--即:
select * from userswhere username =』』;drop table users-- and password =』abc』
整個使用者表就沒有了,當然這裡要猜出資料表名稱。想想是多麼可怕的事情。
防範sql注入
最簡單的方法是對使用者的輸入進行判定和過濾
可以禁止輸入非法字元
private subtxtusername_change()
dim s as string, ss as long, i as long
s = "\=<>*'- /'" '需要禁止的字元
ss = txtusername.selstart
for i = 1 to len(s)
i = len(txtusername.text)
txtusername.text =replace(txtusername.text, mid(s, i, 1), "")
if i <> len(txtusername.text) and ss > 0 then ss = ss - 1
next
txtusername.selstart = ss
end sub
sqli labs 七 登陸處sql注入
第十三關 這關也是乙個登陸口,和上關所說的一樣,先使用 試一下,讓程式報錯然後判斷後台的sql語句 可以看到後台sql大概是 where name name 這樣的 post資訊中輸入uname 1 or 1 1 passwd 1 submit submit 可以成功進入 但是沒有顯示賬號密碼之類的...
引數化登陸防止SQL注入
using system using system.collections.generic using system.componentmodel using system.data using system.drawing using system.linq using system.text u...
登陸頁面Sql注入(繞過)
如圖,看到這道題的時候發覺之前做過乙個類似的手工注入 不過這次手注會失敗,後台過濾了sql語句裡的一些東西,但我們並不知道過濾了什麼 到這裡我就基本上沒轍了,不過查詢了資料以後發現sqlmap可以對登入頁面進行注入 一直以為sqlmap只能對url裡的物件進行注入 參考資料 sqlmap的爬蟲會爬取...