1.MySQL:是一个数据库,专门用于存放数据。
2.SQL语言:是用来操作数据库的简单命令。(大小写无影响)
(1)进入MySQL数据库
打开小皮开启MySQL5.7.26;
win+R输入cmd,进入命令行界面,输入:
mysql -uroot -proot
(2)创建数据库和表
创建study数据库:
create database IF NOT EXISTS study;
使用study数据库:
USE study;
创建xsb表(学生表):
create TABLE IF NOT EXISTS xsb (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50) NOT NULL,gender CHAR(1) CHECK (gender IN ('M', 'F')),age INT,major VARCHAR(50),enrollment_date DATE);
(3)向表中添加5条数据
插入5条学生记录:
insert into xsb (name, gender, age, major, enrollment_date) VALUES('张三', 'M', 20, '计算机科学', '2022-09-01'),('李四', 'F', 19, '数学', '2023-09-01'),('王五', 'M', 21, '物理', '2021-09-01'),('赵六', 'F', 20, '化学', '2022-09-01'),('钱七', 'M', 22, '生物', '2020-09-01');
(4)表的“增删改查”
查询操作select
查询所有学生:
select * from xsb;
查询计算机科学专业的学生:
select * from xsb where major = '计算机科学';
查询年龄大于20的学生:
select name, age, major from xsb where age > 20;
按年龄升序排列 (order by语句):
select * from xsb ORDER BY age ;
order by语句通常用来做排序,默认按照升序排序,在SQL注入中主要用来判断当前表有多少列,配合联合查询(union)来爆数据。
例如http://172.172.3.250/cms/show.php?id=35利用order by查看当前列表有多少列
http://172.172.3.250/cms/show.php?id=35 order by 10 --回显正常
http://172.172.3.250/cms/show.php?id=35 order by 15 --回显正常http://172.172.3.250/cms/show.php?id=35 order by 16 --回显不正常
则说明当前表有15列。
union(联合查询):联合多个表进行查询。
利用联合查询把2个表数据合在一个表中:
select * from 表1 union all select *from 表2;
DESCRIBE(DESC):用于显示表的结构信息
DESC 表名;
插入操作insert
添加新学生:
insert into xsb (name, gender, age, major, enrollment_date)VALUES ('孙八', 'M', 19, '历史', '2023-09-01');
更新操作updat
将李四的专业改为“计算机科学”:
UPDATE xsb SET major = '计算机科学' where name = '李四';
将所有的学生年龄加1:
UPDATE xsb SET age = age + 1;
删除操作delete
删除名为钱七的学生记录:
delete from xsb where name = '钱七';
删除年龄大于等于22的学生:
delete from xsb where age >= 22;
3.MySQL系统数据库
SQL注入中最常见利用的系统数据库,经常利用系统数据库配合union查询来获取数据库信息。所有的数据库名、所有的表名、列名以及列名的数据库类型等。
主要关注MySQL系统数据库information_schema,关注系统数据库的表columns(给出了表中的列信息)、表schema(提供了关于数据库的信息)、表tables(给出了关于数据库中的表的信息)。
(1)schemata表
这个表存放了数据库信息,最关键的在于schema_name列,这里存放了所有数据库名称,查询这个列所有的值即可拿到所有数据库名:
select distinct schema_name from schemata;
(2)columns表
这个表给出了所有表中的所有列信息,同时也包含了数据库名,所有表名,所有列名值对应的列column_name,所有数据库名值对应列table_schema,所有表名值对应table_name列。
columns表查询数据库名
查询columns表中的table_schema列也可以得到所有数据库名:
select distinct table_schema from information_schema.columns;
columns表查询列名
查询当前数据库所有列:
select distinct column_name from information_schema.columns;
columns表查询表名
查询当前所有表名:
select distinct table_name from information_schema.columns;
(3)tables表
这个表给出了所有表的信息,但是同时也包含了数据库名,所有表名,所有数据库名值对应列table_schema,所有表名值对应table_name列。
tables表查询数据库名
查询tables表中的table_schema列也可以得到所有数据库名:
select distinct table_schema from information_schema.tables;
tables表查询表名
从tables表里面查询所有表名:
select distinct table_name from information_schema.tables;
4.MySQL函数
经常利用SQL函数来判断数据库的版本,当前用户,当前用户权限以及数据库的安装路径等。
常用MySQL函数如下(前加select):
数据库注释语法
5.静态页面(html或htm):不需要服务器解析其中脚本,不依赖数据库,在功能上有较大限制。但是安全,不存在SQL注入漏洞。
6.动态页面(asp、aspx、php、jsp等):由相应的脚本引擎来解释执行,根据指令生成静态网页。
——依赖数据库;
——灵活性好,维护简便;
——交互性好,功能强大;
——存在风险,可能存在SQL注入漏洞。
web应用工作原理图