Mysql渗透基础

mysql 常用的命令行操作、新建删除数据库、新建删除表、修改表结构、操作表数据、表内的常用语法等。

mysql–for pentest

先把 phpStudy 的 mysql 服务启动起来,然后保证phpStudy\MySQL\bin 在环境变量里面。

登录

1mysql -uroot -p -P3306
  • -u: 用户名
  • -p: 密码
  • -P: 端口
  • -h: 主机
  • -D: 数据库

帮助命令

1mysql > ?
2mysql > help

查看 mysql 用户的密码

desc mysql.user;

展示表结构,搜索auth,找到 authentication_string,就是密码。

1select authentication_string,user from mysql.user;
2
3+-------------------------------------------+---------------+
4| authentication_string                     | user          |
5+-------------------------------------------+---------------+
6| *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | root          |
7| *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql.session |
8| *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql.sys     |
9+-------------------------------------------+---------------+

注释(在渗透中比较有用)

有三种注释方式:

1#注释
2-- 注释
3/*注释*/

注意第二种需要有个空格;

增删改查(数据库)

1增:create database db1;
2删:drop database db1;
3改:alter database db1 charset utf8
4查:show databases;#查看所有的数据库

基础操作实例(数据库新建表,查看表定义,删除库,引擎和编码)

 1create database if not exists moondata;
 2#创建数据库moondata
 3show databases;
 4#展示所有数据库
 5use mysql;
 6#切换到mysql数据库
 7show tables;
 8#展示所有table
 9desc user;
10#展示user表定义
 1+--------------------+
 2| Database           |
 3+--------------------+
 4| information_schema |
 5| moondata           |
 6| mysql              |
 7| performance_schema |
 8| sys                |
 9| test               |
10+--------------------+
1CREATE TABLE user (
2  id INT NOT NULL AUTO_INCREMENT,
3  username VARCHAR(50) NOT NULL,
4  email VARCHAR(100) NOT NULL,
5  password CHAR(60) NOT NULL,
6  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
7  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
8  PRIMARY KEY (id)
9)engine=myisam default charset=utf8;
1drop database moondata;

myisam引擎和InnoDB引擎

engine=myisam 表示使用 MyISAM 存储引擎创建表。MyISAM 是一种基于文件的存储引擎,它适合用于读密集型应用。与其他存储引擎相比,MyISAM 不支持事务和行级锁定,但它的独特设计使其能够快速执行大量查询。在早期版本的 MySQL 中,默认的存储引擎就是 MyISAM,但是在现代化的应用程序中,InnoDB 等更强大的存储引擎通常被视为首选。

如果使用 MyISAM 存储引擎创建表,需要手动设置字符集和排序规则,如果在创建表时没有指定字符集,则可能会导致数据存储出现乱码等问题。

default charset=utf8 表示使用 UTF-,MySQL 5.5 及以上版本的默认字符集确实是 UTF-8,在 MySQL 4.1 及更早版本中,默认字符集是 Latin1(ISO-8859-1),而不是 UTF-8。 因此,如果使用较老的 MySQL 版本,则需要手动设置字符集。

InnoDB 和 MyISAM 这两个存储引擎的名称都有一定的历史渊源。

InnoDB 最初是由 Innobase Oy(一个芬兰的数据库软件公司)开发的,该公司于 2005 年被 MySQL AB(现在是 Oracle Corporation 的子公司)收购。因此,“Inno"代表了 Innobase 公司的名称,“DB"则代表数据库。

MyISAM 的名称也有一定的来源。在 MySQL 早期版本中,ISAM(Indexed Sequential Access Method)是一种基于文件的存储引擎,而 MyISAM 实际上是 ISAM 的一个改进版本。“My"则代表了 MySQL。因此,MyISAM 实际上是"My SQL Indexed Sequential Access Method"的缩写。

alter table 修改表(字段定义、表名、引擎)

使用 alter,你可以做到:

  • 修改表名 table rename
  • 修改表的引擎 table engine
  • 修改表的字符集 table charset
  • 添加字段 table add column
  • 删除字段 table drop
  • 修改字段名称 table change
  • 修改字段类型 table modify

下面是一些例子,推荐弄到datagrip里面执行感受感受;

datagrip 是 jetbrains 的数据库工具

1# 创建person表,字段id  first_name  last_name  age
2create table person2(
3id int(11) not null auto_increment,
4first_name varchar(255) not null,
5last_name varchar(255) not null,
6age int(11) not null,
7primary key(id)
8)engine=innodb default charset=utf8;
 1alter table person rename person2;#修改表格名称
 2
 3desc db1.person2; #展示表结构
 4alter table person2 modify column id int(30) auto_increment;#修改id列类型为int(30) 默认int(11) ,auto_increment自增
 5ALTER TABLE person2 AUTO_INCREMENT=1; #设置自增起始值
 6
 7alter table person2 drop last_name;#删除列
 8alter table person2 change column first_name name varchar(255);#修改id列名称为uid
 9alter table person2 add column password varchar(255);#添加列
10alter table person2 add column birthday datetime;
11alter table person2 engine = innodb;#修改表引擎

关于auto_increment

如果您删除了表中的行,则auto_increment值不会重置,而是会继续递增。

这是因为MySQL在设计时就决定了auto_increment值应该是永久性的、唯一的、不可重复的。

即使您删除了之前插入的所有行,下一个新插入的行的auto_increment值也会继续递增,确保值的唯一性。

不过你可以通过 alter 重设 AUTO_INCREMENT ,不如重新设置成1。(如果删除了表中的id没有比1小的值,那么下一个插入的id值就是1,否则还是看表中最大的id值,然后id+1)

1ALTER TABLE person2 AUTO_INCREMENT=1; #重设AUTO_INCREMENT为1
2
3TRUNCATE TABLE db1.person2; #清空表,速度及快,重置自增列的值

查询表

为了查询,得先搞一点数据,我让gpt帮我生成了这些:

1# 创建表person2id为主键,自增,name为varchar(255)password为varchar(255)age为int(11)
2create table person2(
3id int(30) auto_increment primary key,
4name varchar(255),
5password varchar(255),
6age int(11)
7)engine=innodb default charset=utf8;
 1insert into db1.person2(name,password, age) values('LandonHills','Ku$we12!id',24);
 2insert into db1.person2(name,password, age) values('JasonGreen','Dr#8&7hjKl',31);
 3insert into db1.person2(name,password, age) values('KennethJones','@kiow23!Gd',42);
 4insert into db1.person2(name,password, age) values('SamanthaSmith','Rt%4^fEeD3',20);
 5insert into db1.person2(name,password, age) values('NatalieAllen','^Hg6fDsE2$',28);
 6insert into db1.person2(name,password, age) values('ChristopherWalker','*iop87Jk9#',26);
 7insert into db1.person2(name,password, age) values('MelanieWilson','@plo5$asW1',29);
 8insert into db1.person2(name,password, age) values('NicholasClark','Lm#90^kOp2',35);
 9insert into db1.person2(name,password, age) values('AshleyRamirez','TgF$35lkPd',19);
10insert into db1.person2(name,password, age) values('JessicaTaylor','Wq@vbn45Rt',48);

1INSERT INTO 表名 VALUES(1,值2,…);
2INSERT INTO 表名(字段1,字段2,…)VALUES(1,值2,…);
3INSERT INTO 表名 SET 字段名1=1[,字段名2=2,…]
4# 同时添加多条数据
5INSERT INTO 表名[(字段名1,字段名2,…)]VALUES (值1,值2,…),(值1,值2,…),

1DELETE FROM 表名 [WHERE 条件表达式]

改(更新)

1UPDATE 表名 SET 字段名1=值1,[ ,字段名2=值2,…][ WHERE 条件表达式 ]
2
3update users set  password='123456',username='moon' where id=1
4update users set  password='aaaa' where id=1;
5update users set  password=456789;

基础查询

 1select * from db1.person2; #展示表中所有数据
 2delete from db1.person2 where id <= 10; #删除id为1的数据
 3select * from person2 where name like 'J%'; #查询name以J开头的数据
 4select * from person2 where name like '%n'; #查询name以n结尾的数据
 5select * from person2 where name like '%Allen%'; #查询name中包含Allen的数据
 6
 7# and  or 的优先级是and > or
 8SELECT * FROM person2 WHERE name = 'AshleyRamirez' AND password = 'TgF$35lkPd'; #一般的登录查询密码语句
 9# 基于单引号的注入:在用户输入中插入单引号('),从而破坏SQL语句的完整性。or 1=1 为真,所以查询出所有数据
10SELECT * FROM person2 WHERE name = 'AshleyRamirez' AND password = '' OR 1=1 -- ' ; #这个语句会查询出所有数据
11# 基于分号的注入:在用户输入中添加分号(;)可以执行多个SQL语句
12SELECT * FROM person2 WHERE name = 'AshleyRamirez' AND password = ''; DROP TABLE person2; -- '#这个语句会删除表

联合查询

1# COUNT() 返回某列的行数
2# SUM() 返回某列值的和
3# AVG() 返回某列的平均值
4# MAX() 返回某列的最大值
5# MIN() 返回某列的最小值
1select count(*) from person2; #查询表中数据总数
2select count(*) from person2 where age > 30; #查询表中年龄大于30的数据总数
3select avg(age) from person2; #查询表中年龄平均值
4select max(age) from person2; #查询表中年龄最大值
5select min(age) from person2; #查询表中年龄最小值

分组查询 groupby

1# groupby
2# 如果不能用,在my.ini/my.cnf中加入
3# sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
4SELECT * FROM person2 GROUP BY password;

快速备份一个表

1drop table backup_table; CREATE TABLE backup_table AS SELECT * FROM <yourtable>;

猛烈的删除一个表

1delete from db1.person2; #清空表,一行行地删除表中数据,可以恢复
2TRUNCATE TABLE db1.person2; #清空表,速度及快,重置自增列的值,无法通过 transaction logs 恢复,并且自动删除所有外键约束
3drop table db1.person2; #删除表,无法恢复

退出mysql命令行

1mysql > exit;
2mysql > quit;
3mysql > \q;

E-H阅读插件/E-H下载插件
代码审计 基础概念