什么是SQL注入(入门详解)

前言

本帖子开启 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. 一般登录完整流程

  1. 用户在视图层输入账号(张三)、密码(12345),点击登录;
  2. 浏览器将账号密码打包为request请求,发送到业务逻辑层服务器;
  3. 服务器拼接SQL语句:SELECT * FROM user WHERE name='张三' AND password='12345';
  4. 服务器将SQL语句发送到数据库,发起查询请求;
  5. 数据库执行SQL,返回查询结果(有/无此用户);
  6. 服务器根据结果生成response响应,返回给浏览器;
  7. 浏览器展示响应内容(首页/错误提示),流程结束。

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 结合起来,查询出更加令人容易理解的数据。可以查询谁使用了最多的资源,哪张表访问最多等。
相关推荐
程序员阿鹏4 小时前
如何实现MySQL分库分表?
数据结构·数据库·sql·mysql·缓存
风哥2号4 小时前
数据库教程FGMT33‑MySQL主从复制项目实施与维护06(MySQL8.4/9.7 MGR组复制)
数据库·mysql
liangsheng_g4 小时前
Spring事务传播行为分派与挂起恢复源码实战
数据库·sql·spring
蓝速科技5 小时前
信创终端 POC 测试实战与选型避坑指南丨蓝速科技
运维·数据库·人工智能·科技·自然语言处理
风哥2号5 小时前
数据库教程FGMT29‑Linux平台MySQL5.7安装配置与管理入门
数据库
三8445 小时前
云安全· 01 · 云计算与云安全基础
网络安全·云计算·云安全
杨云龙UP5 小时前
MySQL Host is blocked because of many connection errors 导致 JDBC 连接失败排查与解决
linux·运维·网络·数据库·sql·mysql·登录失败
执念WRD5 小时前
Fastjson 1.2.83 RCE 漏洞利用
网络·安全·网络安全
这个DBA有点耶7 小时前
数据库数据同步解决方案怎么选?6款主流工具横向对比与信创选型指南
数据库·架构·dba
刃神太酷啦7 小时前
Redis 核心进阶:哨兵、集群、缓存问题与分布式锁详解----《Hello Redis!》(6)
linux·c语言·数据库·c++·redis·分布式·缓存