前言
本帖子开启 SQL注入(SQL Injection) 章节,这是Web渗透的核心必备技能,也是Web安全学习的基础。重点讲解SQL注入的基础认知、发生原理、Web应用三层架构及数据库基础,
一、SQL注入核心概述
1. 字面定义
SQL注入是指Web应用程序未对用户输入数据的合法性进行判断或过滤,导致攻击者可在预设SQL语句后拼接恶意SQL代码,欺骗数据库服务器执行非授权操作,实现非法目的的高危Web漏洞。
通俗理解: 服务器不校验用户输入的"真假",攻击者可伪造恶意输入,让数据库执行非法操作(如窃取、删除数据)。
2. 关键前置概念:Web应用程序
Web应用程序是泛指,只要能通过网络与后台交互、实现特定功能的程序都属于此类,主要分为两类:
- 移动端:手机/平板上的APP(如抖音、美团、微信等),需联网与后台服务器、数据库交互。
- PC端:浏览器打开的网页(如京东、淘宝、百度等),需通过浏览器发送请求获取后台数据。
核心总结:SQL注入针对所有"需要联网、与后台数据交互"的Web应用程序"。
3. 核心触发条件(缺一不可)
- 存在用户输入数据:如登录框、搜索框、评论区等可输入内容的地方,都可能成为注入点。
- 未过滤用户输入:程序直接将用户输入拼接进后台SQL语句,未做任何合法性校验,恶意输入会被数据库执行。
4. 注入核心逻辑
攻击者将恶意SQL语句伪装成正常用户输入,因程序未过滤,恶意代码被传递到服务器,拼接进预设SQL语句后发送给数据库;数据库无法区分正邪,执行恶意指令,实现攻击者目的。
5. SQL注入的危害
- 窃取敏感数据:查询用户账号密码、企业核心数据等(最常见)
- 篡改数据:修改用户权限、订单状态、商品价格等
- 植入恶意木马:控制服务器,发起后续攻击
- 破坏数据/网站瘫痪:删除数据库表或数据,导致网站无法运行
二、Web应用程序三层架构(SQL注入发生场景)
三层架构是SQL注入的核心基础,无论前后端分离架构如何变化,核心逻辑不变。以京东登录流程为例,拆解三层架构及注入发生阶段。
1. 三层架构定义
将程序的"展示、处理、数据存储"分离,降低耦合度,分为视图层 、业务逻辑层 、数据访问层。
2. 三层架构详细拆解

整体就是分为这三个部分:
|-------|-----------|---------------------------|-----------------------------|
| 架构层级 | 对应组件 | 核心功能 | 京东登录角色 |
| 视图层 | 浏览器/APP界面 | 展示内容、接收用户输入,传递请求并展示响应 | 展示登录页、接收账号密码,传递登录请求并展示结果 |
| 业务逻辑层 | 后台服务器 | 处理业务逻辑,拼接SQL语句,请求数据库并返回响应 | 接收账号密码,拼接SQL查询,接收数据库结果并返回响应 |
| 数据访问层 | 数据库 | 存储数据,执行SQL指令,返回查询结果 | 执行SQL查询,判断账号密码是否正确并返回结果 |
3. 一般登录完整流程
- 用户在视图层输入账号(张三)、密码(12345),点击登录;
- 浏览器将账号密码打包为request请求,发送到业务逻辑层服务器;
- 服务器拼接SQL语句:SELECT * FROM user WHERE name='张三' AND password='12345';
- 服务器将SQL语句发送到数据库,发起查询请求;
- 数据库执行SQL,返回查询结果(有/无此用户);
- 服务器根据结果生成response响应,返回给浏览器;
- 浏览器展示响应内容(首页/错误提示),流程结束。
4. SQL注入的发生阶段
注入发生的核心判断:SQL语句执行的环节,即**「业务逻辑层 ↔ 数据访问层」**之间。
具体位置
- 服务器拼接SQL时,恶意输入被当作正常数据拼接,篡改SQL语句;
- 被篡改的SQL语句发送到数据库,执行后触发注入漏洞。
核心结论:注入与视图层无关,只要存在服务器与数据库的SQL交互,就可能存在注入风险。
三、数据库基础
SQL注入的目标是数据库,需掌握数据库基础分类,重点关注关系型数据库。
主流数据库分类
(1)关系型数据库
- 以二维表格存储数据,表间通过外键关联,支持标准SQL,事务性强,是传统SQL注入的主要目标。
常见产品: MySQL(开源免费,入门重点)、Oracle(收费,大型企业常用)、SQL Server;Oracle已收购MySQL。
(2)非关系型数据库
- 无固定表格结构,存储形式灵活,不支持标准SQL,无传统SQL注入,存在专属NoSQL注入(暂不展开)。
常见产品: MongoDB、Redis、HBase、Neo4j。
3. MySQL系统库
我们这边先要对MySQL的数据库服务器的层级有一个大概的了解:
服务器 → 多个数据库 → 多个数据表 → 多个行、列和字段 → 数据
系统库相当于数据库服务器的"身份证",存储数据库的元数据(自身信息),是SQL注入中信息收集的关键。MySQL搭建后默认自带4个系统库:

- information_schema:存储所有数据库、数据表、字段的结构信息,注入时用于获取库名、表名、列名;
- mysql:存储MySQL用户权限信息(如账号、密码);
- performance_schema:存储数据库运行状态、性能监控数据,注入中使用较少;
- sys:简化数据库性能监控,注入中使用较少。
4. 核心SQL语法
我们可以用phpstudy来演示一下:

进到我们的bin目录然后,在此目录下打开cmd:

这边输入你自己的设置的用户和密码:

(1)查询所有数据库(服务器层级)
- 语法: show databases;
- 作用: 查看当前MySQL服务器中所有数据库

这边可以看到其中有四个是我们的系统库。
(2)选中目标数据库(进入数据库层级)
- 语法: use 数据库名;
- 示例: use users; (选中test演示数据库,后续操作均针对该库)
这个users是博主之前玩项目时候存的,刚好用来演示了:)
(3)查询当前数据库的所有数据表
- 语法: show tables;
- 示例: 选中test库后,执行该语句,可看到仅t1一张演示表(实战中数据表数量通常成百上千)

(4)查询数据表的所有数据
- 语法: select * from 表名;
- 示例: select * from users;
这个 * 符号,是ALL的意思,就是指代我要查询 from 后面的所有字段

(5)条件查询
- 语法: select * from 表名 where 条件;
- 示例: select * from users where id=2;

(6)联合查询UNION(注入核心语法)
作用: 将两条SQL查询语句的结果合并,注入中用于拼接恶意查询语句,核心有2个特性(必记):
- 特性1:两条查询语句的结果互不干扰,即使前一条查询无结果,后一条仍会执行;
- 特性2:两条查询语句的字段数量必须一致,否则会报错。
示例:
select * from users where id=2 union select * from users where password='111';
很可惜,这个表是做了加密的,演示不了,所以我找一下别的给你们看

(7)排序查询ORDER BY(注入常用)
作用: 注入中不用于排序,核心用于判断数据表的字段数量(列数)
- 语法: select * from 表名 order by 数字/字段名; (数字对应字段顺序,1代表第一个字段)

但我们其实一般不这么用,我们要用 order by 来猜解 - 注入用法: 依次增大数字,若报错则说明当前数字超出字段数量,可判断表的列数(如order by 4报错,说明表有3个字段)

我们回过头来,去看看深入了解一下那4个系统库

我们先进去这个

然后你会发现这里有61个表,天塌了啊,但其实我们只需要用到3张表

- SCHEMATA表:提供了当前MySQL实例中所有数据库信息,show databases的数据就是这里来的,我们可以看一下

很熟悉吧 - TABLES表:提供了关于数据中表的信息。table_name,这边你可以思考一下,如果真的所有表都给你查完了,是不是会有很多东西,那我们这边可以限定一下范围

你看,这样就是一个比较基础的查询思路了

- COLUMNS表:提供了表的列信息,详细描述了某张表的所有列以及每个列的信息。column_name。这个东西说白了就查字段,那么你想想,查表都那么慢了,那查字段肯定更慢

OK啊,就像这样《未响应》
那我们依旧只查一个来看看

尾声
其实后面是不是还有三个系统表,这边不做过多的赘述。
- performance_schema 库具有 87 张表。MySQL 5.5 开始新增一个数据库:PERFORMANCE_SCHEMA,主要用于收集数据库服务器性能参数。内存数据库,数据放在内存中直接操作的数据库。相对于磁盘,内存的数据读写速度要高出几个数量级。
- mysql 库是核心数据库,类似于 sql server 中的 master 表,主要负责存储数据库的用户(账户)信息、权限设置、关键字等 mysql 自己需要使用的控制和管理信息。不可以删除,如果对 mysql 不是很了解,也不要轻易修改这个数据库里面的表信息。常用举例:在 mysql.user 表中修改 root 用户的密码
- sys 库具有 1 个表,100 个视图。sys 库是 MySQL 5.7 增加的系统数据库,这个库是通过视图的形式把 information_schema 和 performance_schema 结合起来,查询出更加令人容易理解的数据。可以查询谁使用了最多的资源,哪张表访问最多等。