一、题目
二、方法
- 打开服务器,显示登录界面。登录界面是 SQL 注入题的经典场景,核心就是绕过登录验证 。
- 使用sql注入,绕过登录验证。
- 构建用户名:
' or 1=1--+
原理:' or 1=1--+ 为什么能绕过登录?
username = admin
password = 123
SELECT * FROM users WHERE username='admin' AND password='123'
- 数据库会去找:用户名是 admin 且 密码是 123 的记录。
- 找到 → mysqli_num_rows() > 0 → 登录成功,找不到 → 登录失败。
- 注入后的 SQL:
username = ' or 1=1--+
password = 123
- $username 的值被原样拼进去,SQL 变成:
SELECT * FROM users WHERE username='' or 1=1--+' AND password='123'
现在逐段拆解:
1. username=''
单引号 ' 先把原来的字符串闭合了,username='' 表示"用户名等于空字符串"。
2. or 1=1
or 是"或者",1=1 恒为真。
整个 WHERE 条件变成:(username='') OR (1=1)
因为 1=1 永远成立,所以整个条件永远为真。
3. --+
-- 是 SQL 的单行注释,+ 在 URL 编码里代表空格(在 POST body 里也常这么用)。
它的作用是:把后面的 ' AND password='123' 全部注释掉。
所以最终实际执行的 SQL 是:SELECT * FROM users WHERE username='' or 1=1
后面的密码判断被完全忽略了。
- 查询语句执行:SELECT * FROM users WHERE username='' or 1=1
- 因为 1=1 恒真,这条查询会返回表里所有用户记录(至少一条),所以只要结果集有记录(哪怕不是 admin),就判定登录成功。于是不需要正确的密码,直接进来了。