本章目的
熟悉 MySQL( MariaDB)薮据库的基础与进阶语法,加深对SQL命令语句的理解,
为后续SQL注入攻击与防护实验打下坚实的基础。
操作环境
(1)操作系统: Centos7
(2)安装的应用软件: Apache、 MySQL( MariaDB)、PHP;DWA、 SQLi-Labs
Debug3.0漏洞网站环境
MySQL( MariaDB)数据库帐号root,密码为空
实验原理
MySQL( MariaDB)数据库基本命令的功能
实验步骤
第一部分: MySQL( MariaDB)基础操作
1.连接数据库
(1)本地连接
输入命令:
mysql -u root -p
mysql -hlocalhost -u root -p
mysql -h127.0.0.1 -u root -p
mysql -h ip(本地)-u root -p
若其因ip未授权而登不上mysql则报错'FPPP'
只需添加上即可:
grant all privileges on *.* to root@"需登ip" identified by "666666";
密码666
flush privileges;
立刻生效
select user,password,host from user;
查看:
(2)kali远程链接
mysql -h ip(目标ip)-u root -p
若报错:
grant all privileges on *.* to root@"%" identified by "666666";
同上即可。
或直接打开
之后出现“ Enter password:"的提示,,输入密码即可登录一般为root。
若密码为空,则直接按下回车键登录。——cmd的字体颜色永久改变
成功登录数据库后,会出现“ MariaDB[(none)]"的提示符。
注意:绝大部分SQL命令都以分号作为结束符,请不要遗漏!
3.新建数据库 studenta
命令
create database student;
新建成功后,可再次使用下列命令查看结果:
show databases;
4.使用数据库 studenta
命令:
use studenta;
5.在数据库 studenta中创建表 result
命令:
create table result(id int(8), name varchar(20), city varchar (20), score int(5));
6.在表 result中增加数据
本步骤在 result中插入如下5行数据:
命令:
insert into result(id, name, city, score) values(1,"wang","beijing",75);
insert into result(id, name, city, score)values(3, "11","shanghai",80);
insert into result(id, name, city, score) values(5, "chen","fuzhou",70);
insert into result(id, name, city, score) values(2,"zhou","xian",90);
insert into result(id, name, city, score) values(7,"han","guangzhou",65);
注意:如果数据是字符型( varchar),必须使用单引号或者双引号包裹!
插入成功后,可用如下命令查询 result表中的全部内容:
select from result;
7.在表 result中删除1条数据
例如,删除id=7的数据,可使用以下命令:
delete from result where id=7;
删除成功后,仍然可以用以下命令查看结果:
select from result;
8.修改表 result中的1条数据
例如,修改id=5的数据,将其 score设置为666,可使用以下命令:
update result set score=666 where id=5;
修改成功后,仍然可以用以下命令查看结果:
select *from result;
9.查询表 result中的数据
例如
select *from result;
查询表中所有字段:
select name, score from result;
查询表中的name和 score字段
select score from result where name="11";
//查询name为1的学生的分数
第二部分: My SQL( MariaDB)进阶操作
1. order by的用法
(1)将 result表中的数据按照分数( score)从高到低进行排序:
select *from result order by score desc;
其中,desc表示降序(递减);如果从低到高(升序)进行排列,则可以将desc
换成asc;如果不加此参数,默认情况下按升序方式排列。
分别尝试:
select id, name, score from result order by 1;
select id, name, score from result order by 2;
正常显示以name升序排列的结果:
select id, name, score from result order by 3;
正常显示以 score升序排列的结果:
select id, name, score from result order by 4;
报错。
从以上结果可以总结出,对于以下命令:
select cl, c2,..., cn from result order by M;
order by后面的数字(M)必须小于或等于n(数据库查询的字段数),才能正
常显示。如果M>n,数据库就会报错。可以利用这个特点判断数据库查询的字段数。
2.imit的用法:
基本格式为
limit MN
//表示从第M1条数据开始,顺序往下查询N条数据
limit
//表示查询前M条数据
尝试执行以下两条命令:
select *from result limit 0,2;
//查询表中的前2条数据
select *from result limit 1,3;
//从第2条数据起,往下查询3条数据的id、name和score字段
3.unionselect的用法
(1)分别尝试:
select * from result union select 1,2,3,4;
此语句的查询结果,即是select *from result和select 1.2,3.4查询结果的拼接。
(2)分别尝试:
select id,name,score from result union select 1,2,3;
select id,name,score from result union select 1,2;
select id,name,score from result union select 1,2,3,4;
从以上结果可以总结
对于以select c1,c2,...cn from result union select d1,d2,...dm;
后半句union select查询的字段数(m)必须与前半句select查询的字段数(n)
相等,数据库才能正常显示结果。与order by相似,可以利用这个特点判断数
据库查询的字段数。
(3)尝试:
select id,city from result where id=1 and 1=2 union select name,score from result;
前部否定,后部 则显示
从以上结果可以总结,在已知字段名的情况下,攻击者只要将该字段置于任何能够显示的位置,就可以暴露该字段的值。
4.union select结合information_schema数据库
MySQL(MariaDB)5.5以上版本自带information_schema数据库,其中保存着
关于MySQL服务器所维护的所有其他数据库的信息,如数据库名、数据库的表、
表栏的数据类型与访问权限等。可以把information_schema数据库看作MySQL
(MariaDB)的”目录”!
(1)尝试执行以下两条语句:
show databases;
select schema_name from information_schema.schemata;
结果相同
(2)尝试执行以下两组语句:
第一组:
use studenta;
show tables;
第二组:
select table_name from information_schema.tables where table_schema='studenta';
依然相同
MySQL中的“骚操作”