我們先嚐試隨意輸入用戶名 123 和密碼 123 登錄:
從錯誤頁面中我們無法獲取到任何信息。
看看後臺代碼如何做驗證的:
實際執行的操作時:
select * from users where username='123' and password='123'
當查詢到數據表中存在同時滿足 username 和 password 字段時,會返回登錄成功。
按照第一個實驗的思路,我們嘗試在用戶名中輸入 123' or 1=1 #
, 密碼同樣輸入 123' or 1=1 #
:
爲什麼能夠成功登陸呢?因爲實際執行的語句是:
select * from users where username='123' or 1=1 #' and password='123' or 1=1 #'
按照 Mysql 語法,# 後面的內容會被忽略,所以以上語句等同於(實際上密碼框裏不輸入任何東西也一樣):
select * from users where username='123' or 1=1
由於判斷語句 or 1=1 恆成立,所以結果當然返回真,成功登錄。
我們再嘗試不使用 # 屏蔽單引號,採用手動閉合的方式:
我們嘗試在用戶名中輸入 123' or '1'='1
, 密碼同樣輸入 123' or '1'='1
(不能少了單引號,否則會有語法錯誤):
實際執行的 Sql 語句是:
select * from users where username='123' or '1'='1' and password='123' or '1'='1`
看到了嗎?兩個 or 語句使 and 前後兩個判斷永遠恆等於真,所以能夠成功登錄。
還有很多其他 Mysql 語句可以巧妙的繞過驗證,同學們可以發散自己的思維進行嘗試。