SQL注入入门:从原理到实战,数字型与字符型详解(2)
摘要本文以 SQL 注入为主题先回顾数字型注入与字符型注入的区别再重点讲解两个关键探测手段order by用于判断查询结果的列数union用于把自定义查询结果拼接到原查询后面。文章结合靶场实例详细演示了先用 order by 逐次递增探测列数、再用 union select 对齐列数找出回显点、最后把回显点替换成目标数据的完整配合流程并强调所有操作都应在合规靶场中进行。一上一篇文章我们了解了关于SQL注入的基本流程这次我们来深度剖析一下数字型注入和字符型注入1注下面操作均在合规靶场进行注下面操作均在合规靶场进行注下面操作均在合规靶场进行2我们知道数字型注入和字符型注入根本的区别就是后端执行SQL代码的时候有没有对用户输入这块进行校验例如下面这段SQL代码$sqlSELECT * FROM users WHERE id$id LIMIT 0,1; $resultmysql_query($sql); $row mysql_fetch_array($result);因为在id$id LIMIT 0,1;这里后端没有对$id进行字符处理所以导致攻击者输入{1}后后端的SQL代码就为这样$sqlSELECT * FROM users WHERE id1 LIMIT 0,1;因为原始SQL已经用单引号包裹了 $id攻击者输入的 1 带来了一个闭合单引号导致剩下的 变成了多余的语法错误。这就叫“打破原有的闭合规则这样SQL代码不会被执行而是抛出一个异常{You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 1 LIMIT 0,1 at line 1}意思就是在{1 LIMIT 0,1 at line 1}这里有一个SQL语句错误这就导致攻击者可以通过这个报错信息来反推这段SQL代码的闭合类型这也就是攻击者最喜欢看到的信息比起盲注这个反而简单了因为就等于告诉攻击者注入的结果是直接回显在前端HTML页面里的。二在SQL注入中order by 和 union 是两个非常关键的探测手段它们能帮助攻击者快速判断SQL语句的结构为后续的注入利用打下基础。1order by 的用法order by 在SQL中原本用于对查询结果进行排序但在注入探测中它有一个更重要的用途判断查询结果的列数。例如对于前面的SQL代码$sqlSELECT * FROM users WHERE id$id LIMIT 0,1;我们打开靶场SQLI-LABS/Less-1,过一遍感受一下。当在URL后面加上?id1参数后页面就把SQL代码的异常回显在页面上因为我是直接在原生的HTTP请求里加的参数浏览器自动进行了URL编码在URL编码里{ %20 } 代表空格%26代表{#号}%27则代表单引号{ },你用的如果是BPBurp Suite,则空格用{ }注释掉后面的SQL代码可以用{ -- 和 %26 }回到正题order by可以帮助我们更快的知道页面最多可以回显多少的字段同样当输入{ 1 order by 1 -- } 时后端的SQL代码就为$sqlSELECT * FROM users WHERE id1 order by 1 -- LIMIT 0,1;{ order by 这里的数字可以任意输入 -- }输入{ 3 }时页面没有报错但输入{ 4 }时页面如果爆破了那么前端回显的最大列数为{ 3 }列以此类推,例如这就可以确定页面回显的最大字段为{ 3 }列。为什么先探测列数因为后面的 union 注入要求前后两个查询的列数必须一致否则会报错。所以 order by 是 union 注入的前置步骤。二、union 的用法union 的作用是把两个查询的结果合并在一起。在注入中我们利用它来把自定义的查询结果拼接到原查询后面从而获取我们想要的数据。union 的使用前提有两个前后两个查询的列数必须相同这就是为什么要先用 order by 探测列数。前后两个查询的列类型要兼容。例如假设我们探测出原查询有 3 列那么可以这样构造$sqlSELECT * FROM users WHERE id-1 union select 1,2,3;这里的{ -1} 不是 SQL 的特殊关键字它只是传给原查询参数的一个值作用是让 union前面那一段查询查不到任何数据从而让页面显示 union 后面的 1,2,3 结果,如果页面回显了2和3那就说明第 2 列和第 3 列是回显点例如我们可以把占位符替换成想要查询的内容比如$sqlSELECT * FROM users WHERE id1 union select 1,2,username from users LIMIT 0,1;页面是这样回显的这里有一个要说的这段SQL代码后面的{ LIMIT 0,1 }是这样的{ LIMIT 0,1 }LIMIT后面的01是LIMIT的子参数意思是{ 0 }从一整个结果集里面从第0条记录也就是第一条开始{ 1 }表示是只显示第一条数据这也是为什么我们使用{ -1 } 这个非法ID因为原查询查不到数据页面留出空位正好让我们的 union select 数据补位回显。像pikachu靶场就没有对数据限制这里做一个对比方便好理解三、order by 和 union 的配合流程在实际注入中两者的配合流程通常是这样的先用order by N逐次递增探测出查询的列数。再用union select 1,2,3...对齐列数找出回显点。最后把回显点替换成目标数据如库名、表名、字段名、数据。下面我们把这个流程拆开结合前面的例子一步步走一遍看看每一步到底在做什么、为什么要这么做。第一步用 order by 探测列数。这一步是整个注入的“地基”。我们并不知道后端查询到底返回几列所以从order by 1开始逐次把数字加 1直到页面报错为止。比如在 Less-1 中order by 3页面正常order by 4页面报错就说明原查询只有 3 列。为什么必须知道列数因为 union 合并结果时前后两个查询的列数必须完全一致多一列或少一列都会直接报错导致注入失败。第二步用 union select 对齐列数找出回显点。知道了列数是 3 之后我们把查询参数改成一个查不到数据的值比如-1再拼接union select 1,2,3。这样前面那段查询返回空结果页面就会显示 union 后面的内容。如果页面上出现了数字 2 和 3就说明第 2 列和第 3 列是回显点——也就是我们可以把想要的数据“塞”进去的位置。这一步相当于在目标系统里找到了两个可以输出信息的“窗口”。第三步把回显点替换成目标数据。回显点确定之后剩下的就是“换内容”了。比如把2换成database()就能看到当前数据库名把3换成username就能看到用户名字段。以此类推我们可以一步步把库名、表名、字段名、具体数据都查出来。整个过程就像在填一张表格先确定表格有几列再找到能显示内容的格子最后往格子里填我们想要的信息。这个流程是手工注入的核心思路理解之后后续的报错注入、盲注等技巧都是在这个基础上的延伸。比如报错注入是利用数据库报错信息来带出数据盲注则是通过页面是否正常来逐字符猜测数据它们的本质都是在“探测结构”和“获取数据”这两个环节上做文章。把 order by 和 union 的配合流程吃透后面再学其他注入方式就会轻松很多。四、总结本文围绕 SQL 注入中的两个核心探测手段展开order by用于判断查询结果的列数union用于把自定义查询结果拼接到原查询后面。两者的配合流程可以概括为三步先用 order by 逐次递增探测列数再用 union select 对齐列数找出回显点最后把回显点替换成目标数据如库名、表名、字段名、具体数据。理解这个流程的关键在于把握两个前提前后两个查询的列数必须相同、列类型要兼容。这也是为什么 order by 是 union 注入的前置步骤。掌握了这套手工注入的核心思路后续的报错注入、盲注等技巧都是在这个基础上的延伸——它们的本质都是在“探测结构”和“获取数据”这两个环节上做文章。最后提醒一句以上所有操作都应在合规靶场中进行切勿用于未经授权的真实系统。

相关新闻

UART串口实战:从寄存器配置到printf重定向的嵌入式调试指南

UART串口实战:从寄存器配置到printf重定向的嵌入式调试指南

1. 从Day1到Day3之后,我为什么决定把第四天留给串口说实话,我前三天是有点浮躁的。Day1搭建开发环境,Day2点亮板载LED,Day3用按键控制灯亮灭。做完这些之后我一度觉得嵌入式好像也就这么回事——配置几个寄存器、写几个while(1)循…

2026/10/18 7:30:04 阅读更多 →
仿muduo实现高并发服务器——读写缓冲区Buffer.hpp

仿muduo实现高并发服务器——读写缓冲区Buffer.hpp

目录摘要注释3.1 回顾3.2 新知识3.3 注意3.4 反思正文4.1 开发中遇到的问题总结常见问题标签摘要 Buffer.hpp 是 header-only 实现:#include 即用,无需链接 .cpp/.a/.so。内部为 std::vector 加 _redidx/_wrtidx 两个下标,提供写入、读取、容…

2026/10/18 7:30:04 阅读更多 →
随身WiFi的adb shell常用命令三十条:系统状态一键体检

随身WiFi的adb shell常用命令三十条:系统状态一键体检

本文是随身WiFi系列第 69 篇,正文约 3200 字,读完约 9 分钟。前面几十篇里散落过各种 adb 命令,评论区一直喊"有没有一个合集"。这篇把最常用的三十条按场景归档:看信号、看流量、看内存、看存储、看日志、救急&#xf…

2026/10/18 7:30:04 阅读更多 →

最新新闻

从私钥到Web3入口:钱包技术演进与实现原理

从私钥到Web3入口:钱包技术演进与实现原理

1. 钱包到底是什么:先搞懂“币”其实不在钱包里很多刚接触区块链的朋友都会问我一个问题:我钱包里的币到底存在哪里?是不是像银行一样,有个中央服务器帮我记账?答案可能和直觉相反——你的币从来不在“钱包”里&#x…

2026/10/18 8:36:17 阅读更多 →
FastColoredTextBox中文修正版:彻底解决光标错位与样式渲染

FastColoredTextBox中文修正版:彻底解决光标错位与样式渲染

简介:FastColoredTextBox 是一款广受欢迎的开源高亮代码文本框控件,支持自定义显示模式,并默认内置 C#、HTML 等多种语言的高亮规则;原版在处理中文双字节字符时经常出现显示异常、光标位置偏移,多个 Style 同时使用时…

2026/10/18 8:36:17 阅读更多 →
用Flask自研研学预约系统:数据模型、支付回调与防超卖实战

用Flask自研研学预约系统:数据模型、支付回调与防超卖实战

1. 项目缘起:为什么我一头扎进了自研研学预约系统先说清楚我做的这套东西是什么:一个面向中小型营地/研学机构的在线课程预约系统,用Python的Flask框架从零搭起,涵盖了课程排期、名额管理、在线支付确认、后台订单管理这些核心环节…

2026/10/18 8:36:17 阅读更多 →
拆解开源Agent框架:插件化的核心机制、实战与避坑指南

拆解开源Agent框架:插件化的核心机制、实战与避坑指南

先把话说在前面:我拆的是最近热度很高的一个开源 Agent 框架,拆法比较粗暴,直接把源码拉下来,从入口一路跟到插件装载、工具调用、上下文组装、退出清理,一条线走完。拆完之后我对“插件化”这三个字的理解&#xff0c…

2026/10/18 8:36:17 阅读更多 →
Spring Event事件机制:从同步耦合到异步解耦的完整实践与避坑指南

Spring Event事件机制:从同步耦合到异步解耦的完整实践与避坑指南

简介:面向 Spring 开发者的 Event 事件机制示例工程,以可运行代码演示事件定义、发布、监听、顺序控制与异步处理等核心用法,适合正在系统学习 Spring 事件模型,或希望在业务模块间实现低耦合通信的读者。资源共 75 个文件&#x…

2026/10/18 8:36:17 阅读更多 →
阵列天线方向图对比:均匀阵、切比雪夫、泰勒与稀疏阵选型指南

阵列天线方向图对比:均匀阵、切比雪夫、泰勒与稀疏阵选型指南

简介:阵列天线方向图比较是阵列天线设计中的重要基础,单元个数、阵元间距与波长三者共同决定波束宽度、旁瓣电平与零点位置。这套MATLAB源码包面向无线通信、雷达与天线工程学习者,可帮助读者快速仿真不同参数组合下的方向图差异,…

2026/10/18 8:35:17 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →