MySQL
常用语句
select group_concat(table_name) from information_schema.tables where table_schema=database()
查看 xxx 的字段
select group_concat(column_name) from information_schema.columns where table_name='xxx'
读取字段的内容
select flag from fl4g
MySQL 系统库表
information_schema
MySQL自带的系统数据库,当中大部分是我们需要了结的信息,比如字符集,权限相关,数据库实体对象信息,外检约束,分区,压缩表,表信息,索引信息,参数,优化,锁和事物等等。所以可以利用这个数据库来进行注入。
--存储mysql数据库下面的所有表名信息的表
information_schema.tables
--数据库名 : table_schema
--表名 : Table_name
-- 存储mysql数据库下面的所有列名信息的表
information_schema.columns
-- 表名 : table_name
MySQL 函数
常见系统函数和变量
version() -- MySQL版本
user() -- 数据库用户名
database() -- 数据库名
@@datadir -- 数据库路径
@@basedir -- 安装路径
@@version_compile_os -- 操作系统版本
常见连接函数
在 select 数据时,我们往往需要将数据进行连接后进行回显。很多的时候想将多个数据或者多行数据进行输出的时候,需要使用字符串连接函数。
concat(str1,str2,...)
没有分隔符地连接字符串
concat_ws(separator,str1,str2,...)
含有分隔符地连接字符串
group_concat(str1,str2,...)
连接一个组的所有字符串,并以逗号分隔每一条数据
https://www.cnblogs.com/lcamry/p/5715634.html
截取字符串常用函数
mid()
此函数为截取字符串一部分。
MID(column_name,start[,length])
-- column_name : 必需。要提取字符的字段。
-- start : 必需。规定开始位置(起始值是 1)。
-- length : 可选。要返回的字符数。如果省略,则 MID() 函数返回剩余文本。
例如 : str="123456" mid(str,2,1) 结果为2
substr()
Substr() 和 substring() 函数实现的功能是一样的,均为截取字符串。
string substring(string, start, length)
string substr(string, start, length)
-- 参数描述同 mid() 函数,第一个参数为要处理的字符串,start 为开始位置,length 为截取的长度。
Left()
得到字符串左部指定个数的字符
Left ( string, n )
-- string 为要截取的字符串,n 为长度。
ord()
返回第一个字符的 ASCII 码
例如 : ORD(MID(DATABASE(),1,1))>114 意为检测 database() 的第一位 ASCII 码是否大于 114,也就是 'r'
字符串编码
ASCII()
返回字符的 ASCII 码值
select ASCII('hello')
CHAR()
把整数转换为对应的字符
SELECT CHAR(77,121,83,81,'76');
Hex()
返回十六进制值的字符串表示
SELECT HEX('mysql');
Unhex()
执行HEX(str)的逆运算
SELECT UNHEX('4D7953514C');
导入导出函数
load_file()
load_file():以文本方式读取文件,在 Windows 中,路径设置为 \
读取文件并返回该文件的内容作为一个字符串。
例如 : select 1,1,1,load_file(char(99,58,47,98,111,111,116,46,105,110,105))
安全加固
禁止远程访问
select user,host from user;
更新 root 账户,开启远程访问,配置如下:
use mysql;
update user set host = "%" where user = "root";
flush privileges;
更新root账户,关闭远程访问,配置如下:
use mysql;
update user set host = "localhost" where user = "root" and host= "%";
flush privileges;
禁止匿名账户登陆
检测是否存在匿名账户
select * from user where user='';
如有空记录存在,说明存在匿名用户,为了保证数据库安全,删除语法为:
delete from user where user='';
修改匿名用户
SET PASSWORD FOR ''@'localhost' = PASSWORD('newpwd');
最大连接数限制
MySQL 数据库经常会遇到这么一个问题,就是 “Can not connect to MySQL server. Too many connections”。这是由于访问 MySQL 且还未释放的连接数目已经达到 MySQL 的上限。通常,MySQL 的最大连接数默认是 100, 最大可以达到 16384。
查看最大连接数
show variables like 'max_connections';
修改最大连接数
set GLOBAL max_connections = 500;
查看所有用户的当前连接数
show processlist;
限制本地文件读取
MySQL 提供对本地文件的读取,使用的是 load data local infile 命令,MySQL5.0 以上的版本选项是默认打开的,该操作令会利用 MySQL 把本地文件读到数据库中,然后用户就可以非法获取敏感信息了,一般没有特殊的需要不要开启读取本地文件的选项。
配置Linux 下/etc/my.cnf文件
local-infile=0
或启动数据库时,加上 --local-infile=0&参数
/usr/local/mysql/bin/mysqld_safe --local-infile=0 &