更深入的认识OR 1=1
OR 1=1 的本质是一个永真条件,它通过逻辑“或”运算让整个 WHERE 子句恒为真。
深入理解:
在 SQL 中,WHERE 子句就像一个过滤器:它会逐行检查表中的数据,只有满足条件的行才会被放入结果集。
-
正常查询:
SELECT * FROM users WHERE username = 'admin' AND password = '123'
只有当某一行的username列等于'admin'且password列等于'123'时,这一行才会被返回。 -
注入
OR 1=1后:
SELECT * FROM users WHERE username = 'admin' OR 1=1 -- ' AND password = '...'
条件变成了(username='admin') OR (1=1)。
因为1=1永远为真,所以无论username是否等于'admin',整个WHERE条件都对每一行求值为真。于是,表中的所有行都会被返回。
关键点:
OR 1=1 不会创造数据,它只是取消了对表中已有数据的过滤。
- 如果表里有数据(比如至少有一条用户记录),那么查询就会返回这些记录,登录验证代码看到有返回行,就认为用户存在,绕过成功。
- 如果表里一条数据都没有(空表),虽然条件恒真,但因为没有行可以被“放行”,结果集依然是空,
fetchArray()拿不到任何东西,登录失败。
与 UNION SELECT 的区别:
OR 1=1是修改过滤逻辑,影响的是“从原有表里选哪些行”。UNION SELECT是集合操作,它可以将你自己构造的新行直接追加到查询结果中,即使原表为空,也能强行制造出一行数据返回给应用。这就是为什么对付空表时,必须用UNION注入。
简言之,OR 1=1 的作用是“把门拆了,让所有已有的东西都出来”,但如果房间本来就是空的,门拆了也没东西出来;而 UNION SELECT 是“自己往房间里放东西,再把它拿出来”。