MySQL
MySQL简介
- MySQL是一个关系型数据库管理系统
- 由瑞典MySQLAB公司开发,目前属于Oracle旗下产品
- 是WEB应用中最好的RDBMS(关系数据库管理系统))应用软件
- 官网https://www.mysql.com/
- 支持结构化查询语言SQL
什么是数据库
数据库是按照数据结构来组织、存储和管理数据的仓库
什么是关系型数据库
建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据
关系型数据库相关术语
数据库:数据库是一些关联表的集合
数据表:类似一个简单的电子表格
主键:主键是唯一的,一个数据表中只能包含一个主键。
外键:外键用于关联两个表
索引:使用索引可快速访问数据库表中的特定信息,类似于书籍的目录
MySQL-Front简介
MySQL-Front是一款小I巧的MYSQL图形化管理工具
phpStudy套件中已经集成了MySQL-Front
进入MySQL-Front管理主界面
点击MySQL管理器,选择MySQL-Front菜单,点击属性----输入用户名密码即可登录
SQL
SQL简介
SQL全称是StructuredQueryLanguage,结构化查询语言
是一种数据库查询和程序设计语言
用于存取数据以及查询、更新和管理关系型数据库系统
SQL语言大小写不敏感
SQL具有数据定义、数据操纵和数据控制的功能
1.数据定义语言DDL(DataDefineLanguage)
通过CREATE,ALTER和DROP实现创建新表或修改、删除表
2.数据查询语言DQL(DataQueryLanguage)
通过SELECT、WHERE,ORDERBY,GROUPBY和HAVING实现数据的查询
3.数据操作语言DML.(DataManipulation Language)
通过INSERT、UPDATE和DELETE实现数据的添加、修改和删除
4.数据控制语言DCL(DataControl Language)
通过GRANT或REVOKE实现权限控制
SQL数据类型
SQL的数据类型大致可以分为三类:数值、日期/时间和字符串类型
1.常用数值类型
INTEGER、SMALLINT、DECIMAL
2.常用日期/时间类型
DATETIME、DATE、TIME
3.常用字符串类型
VARCHAR、TEXT
创建数据库
CREATE DATABASE 数据库名;
示例:
CREATE DATABASE IFNO TEXISTS myDBD EFAULT CHARSET utf8;
如果数据库不存在则创建数据库
创建myDB数据库,并设定编码集为utf8
选择数据库语法
USE数据库名;
示例:
USE myDB;
删除数据库语法
DROP DATABASE 数据库名;
示例:
drop databse if exist myDB;
如果数据库存在则删除数据库myDB
创建表
CREATETABLE 表名 (字段名字段类型);
示例:
CREATE TABLE IF NOT EXISTS admin(
id INT UNSIGNED AUTO_INCREMENT,
name VARCHAR(5O) NOT NULL,
pwd VARCHAR(32) NOT NULL,
PRIMARY KEY(id)
);
设置字段的属性为NOT NULL,该字段的数据输入为空时报错
AUTO_INCREMENT定义列为自增的属性
PRIMARY KEY关键字用于定义列为主键
删除表语法
drop table 数据表名;
示例:
drop table if exists admin;
如果数据表存在则删除表admin
插入数据/增加一条数据
insert into table_name (name1, name2) values (value1, value2);
示例:
insert into admin(name, pwd) values('admini', '123456');
如果数据是字符型或日期型,必须使用单引号或者双引号
查询数据
select *[列名] from table_name [where 条件];
示例:
select * from admin;
select name,pwd from admin;
select name from admin name='admini';
select name from admin name='admini' and pwd='123456';
修改数据
update 表名 set 列名1=值1, 列名2=值2 [where 条件];
示例:
update admin set pwd='ice' where id = 1;
删除数据
delete from 表名 [where 条件];
示例:
delete from admin where id =2;
如果没有指定 where 条件,则删除所有记录
查询示例练习:
环境pikachu靶场的数据库pikachu;
select * from member where sex = 'boy';
select * from member where id >=1;
select * from member where id !=1;
select * from member where id <>1;
select * from member where id in (1,3,5);
select * from member where id not in (1,3,5);
select * from member where id between 3 and 6;
select * from member where id >=4 and sex='boy';
select * from member where id >=4 or sex='boy';
select * from member where username like '%c';
select * from member where username like '_u%'';
SQL注入
SQL注入利用Web应用对后台数据库查询语句处理时存在的安全漏洞
设计程序时忽略了对某些字符串的检查
原本程序要执行的代码,拼接了用户输入的数据(嵌入指令)
SQL注入攻击流程
第一步:注入探测
自动方式:使用web渗透测试工具,自动探测
手动方式:手工构造SQL注入测试语句
·第二步:信息获取
环境信息:数据库类型,数据库版本,操作系统版本,用户信息等
数据库信息:数据库表,表字段,字段内容等(加密内容破解)
第三步:获取权限
获取操作系统权限:通过数据库执行shell,上传木马
SQL注入常用函数
查询MySQL上有哪些数据库
show databases;
选择数据库
use 库名;
例如:use pichachu;
查看当前数据库中有那些表
show tables;
查看表中的内容
select * from [库名.]表名;
示例:
select * from member;
数据筛选
select * from [库名.]表名 where 条件;
select username,sex,phonenum,email from member where sex='girl';
比较运算符:
= 等于
!=、<> 不等于
>、>= 大于或大于等于 用于数值
<、<= 小于或小于等于 用于数值
in、not in 在 不在
between 在两值之间
or 或
and 与
多个条件时,通过逻辑操作进行组合(and优先级高于or)
select id,username from member where sex='girl' or id<3;
使用like语句实现像是性检查
通配符 _ 代替单个不确定字符, % 代替0~N个字符
select username,sex,address from member where address like 'nba%';
mysql注释分为单行注释和多行注释
# #注释内容
-- -- 注释内容,杠杠后需要加一个空格
/*......*/ /*注释多行内容*/
select database(); #当前所在数据库
length(s) #字符串的长度
substr(string,n ,len) #截取字符创的长度为len 从n的位置开始
concat(str1, str2, str3) #s1,s2,s3等多个字符串合并为一个字符串
group_concat() #同一组多个字符串合为一个字符串
ascii(s) ord(s) #返回字符串的ascii值
hex(s) #将字符串转化为16进制
if(a>b,a+1, b+1) #表达式成立执行a+1, 否则执行b+1
sleep(n) #暂停n秒
rang() #返回0到1的随机数
load_file() #读取文件,并返回文件内容secure_file_priv=
示例:
select username,length(username) from member;
select username,substr(username,3,1) from member;
select username,left(username,2) from member;
select concat(username,address) from member;
select username,address,concat(username,address) from member;
select username,address from member;
select group_concat(username,address) from member;
select username, ascii(username) from member; #判断是username的第一个字符
select username, ascii(substr(username,2,1)) from member;
select username, hex(username) from member;
version() #返回数据库的版本号
database() #返回当前数据库名
user() #返回当前用户 system_user()
@@datadir #返回数据库路径
select version();
select database();
select user();
select @@datadir;
select * from member where id = if(1=1,3,5);
select * from member where id = if(1=2,3,5);
select * from member where id=3 and sleep(5); # sleep(n):暂停n秒 返回值是0
select rand(); #返回0-1之间的随机数
select * from member order by phonenum; -- 从小到大排序以phonenum进行排序
select * from member order by 1; -- 按ID进行排序
select * from member union select 1,2,3,4,5,6,7;
select *,8 from member union select 1,2,3,4,5,6,7;
select union 在联合注入查询的时候,当两张表的字段一样多时,不会报错直接就显示在一样了,字段不一样多时,会报错,无法显示在一样,可以添加一个数字字段来解决报错。
当联合查询时前面的数据查不到,后面的能查到将会显示后面的数据,页面展示数据是不会展示全部数据,只会展示其中的几个字段,故而显示其中的几个数字;当把这几个数据换成information_schema.tables中的字段,改成select * from infomation_schema.tables where table_schema = '当前库名',就能查询到当前库里的表名。
然后呢!union select 改成select * from infomation_schema.columns where table_schema = '当前库名' and table_name='库中的表命',就能查询到当前库里表中的字段。
知道了表中的字段,在改成查询表的语句就能拿到表的数据
select * from information_schema.tables where table_schema='pikachu';
select table_name from information_schema.tables where table_schema='pikachu';
#information_schema 库中存放着所有数据库的表名还有字段名,通过查询information_schema库中的数据可以得到其他库中的表名和字段名
select * from information_schema.columns where table_schema='pikachu' and table_name='users';
select column_name from information_schema.columns where table_schema='pikachu' and table_name='users';
仅供学习使用