网络安全&SQL注入相关总结 ½ (SQL语句分类,MYSQL数据库及函数)✍

SQL注入

首先我们先来了解一下,现在主流的数据库都有那些:
主流数据库介绍、点击查看
要明白下边几个定义

  • 数据

在计算机系统中,各种字母,数字符号的组合、语音、图形、图像等统称为数据。

  • 数据库

按照数据结构来组织、存储和管理数据的仓库

  • 数据库管理系统(DBMS)

数据库管理系统(database management
system)是一种操纵和管理数据的软件,用于建立、使用和维护数据库。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。

SQL 是什么?

结构化查询语言(Structured Query Language )简称SQL,结构化查询语言是一种数据库查询和程序设计语言,用于存储数据以及查询、更新和管理关系数据库系统。

SQL 语言分类

SQL语言可以分为以下六种

DQL 数据查询语句

举例说明:

select
 select * from user; //查询user表的所有数据
 select * from user where name="admin"; //查询user表“name”等于“admin”的数据;
order by

order by为排序表达式,用于指定排序的依据,它可以是字段名也可以是字段别名。

例–.对成绩表先按课程编号,再按成绩,然后按学号排列

select *
from 成绩表
order by 课程编号,成绩,学号

–.查询成绩表中成绩最高的前五条记录,显示与第五条成绩相同的记录

select top 5 with ties *
from 成绩表
order by 成绩 desc

ASC和DESC用于指定排序方式。
ASC指定字段的值按照升序排列,
DESC按照降序排列,默认顺序为升序

但是在SQL注入中order by主要用来判断当前表是有多少列,然后配合联合查询来爆数据

order by用法:

例如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 联合查询

联合查询语句是联合多个表进行查询

select * from user union all select * from  xxx ; //利用联合查询把2个表的数据合在一个表里面

在使用到SQL语句进行数据库查询的过程中,如果需要求两个数据集合的并集,一般会使用到联合查询关键字Union或者Union All,其实Union和Union All两者的使用有一定差别,查出来的数据在有些情况下会不一样。

  • Union对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序。
  • Union All对两个结果集进行并集操作,包括重复行,不进行排序。

如果要求查出来的数据集不包含重复行,则使用Union。
需要保留重复行的情况下,采取Union All语句。

备注:无论使用Union或者Union All进行联合查询,两个SQL语句的查询字段的顺序一定要对应一致,否则数据会出现相应错误。

DML 数据操作语句
insert (插入 增加)
  • insert into user values(“xxx”,“xxx123”,“13188888888”);
  • 往user表里面增加一个用户xxx,并且密码为xxx123,电话1318888888
update (更改)
update user set password="xxx@123" where name="xxx";
更改xxx用户的密码为xxx@123
delete (删除)
delete from user where name="xxx";
删除新增sangfor用户所在的行
DCL 数据控制语言
grant

授权命令 grant,语法格式(SQL语句不区分大小写):

  • Grant <权限> on 表名[(列名)] to 用户 With grant option
  • GRANT <权限> ON <数据对象> FROM <数据库用户>

//数据对象可以是表名或列名
//权限表示对表的操作,如select,update,insert,delete

注:授权命令是由数据库管理员使用的,若给用户分配权限时带With grant option子句,
则普通用户获权后,可把自己的权限授予其他用户。

revoke

回收权限 revoke

  • REVOKE <权限> ON <数据对象> FROM <数据库用户名>
DDL 数据定义语言
create
1.创建新表
  • 语法:CREATE TABLE 表名称
    (
    列名称1 数据类型,
    列名称2 数据类型,
    列名称3 数据类型,

    ) 部分数据类型:

decimal(size,d)、numeric(size,d) – 容纳带有小数的数字。“size” 规定数字的最大位数。"d"规定小数点右侧的最大位数。
char(size) – 容纳固定长度的字符串(可容纳字母、数字以及特殊字符)。
varchar(size) – 容纳可变长度的字符串(可容纳字母、数字以及特殊的字符)。

date(yyyymmdd) – 容纳日期。

2.创建索引

CREATE INDEX - 创建索引,索引使数据库应用程序可以更快地查找数据。只能被用来加速搜索/查询。
注释:更新一个包含索引的表需要比更新一个没有索引的表更多的时间,这是由于索引本身也需要更新。
语法
在表上创建一个简单的索引。允许使用重复的值:
CREATE INDEX indexName tableName (columnName)
注释:“columnName” 规定需要索引的列。
创建一个唯一的索引。唯一的索引表示两个行不能拥有相同的索引值。
CREATE UNIQUE INDEX indexName ON tableName (columnName)
示例:
1.CREATE INDEX PersonIndex ON Person (col1 DESC) – 以降序索引某个列中的值
2.CREATE INDEX PersonIndex ON Person (col1, col2) – 索引不止一个列

3.创建新数据库
  • CREATE DATABASE - 创建新数据库
语法:CREATE DATABASE database_name
drop
  1. DROP INDEX – 删除表格中的索引。
    MicrosoftSQLJet/Microsoft Access:DROP INDEX index_name ON table_name
    SQLServer:DROP INDEX table_name.index_name
    IBM DB2/Oracle:DROP INDEX index_name
    MySQL:ALTER TABLE table_name DROP INDEX index_name

  2. DROP TABLE – 删除表(表的结构、属性以及索引也会被删除):
    DROP TABLE 表名称

  3. DROP DATABASE – 删除数据库:
    DROP DATABASE 数据库名称

  4. TRUNCATE TABLE – 删除表格中的数据
    TRUNCATE TABLE 表名称 – 仅仅删除表格中的数据

CCL 指针控制语言
declare

声明的意思,具体用法是

declare @声明的变量名称 变量类型
如:
declare @intDeclare int
cursor

https://www.cnblogs.com/accumulater/p/6109056.html

fetch

作用就是把游标当前的值赋给变量

举例如下:

  1. --定义游标 cursor c_ITEM(var_BH number, var_GSID varchar2) Is SELECT *
    FROM THDITEM A WHERE A.GSID=var_GSID AND A.THD01=var_BH; v_ITEM
    c_ITEM%RowType;
  2. --使用游标 Open c_ITEM(p_BH, p_GSID); Fetch c_ITEM Into v_ITEM; While
    c_ITEM%Found Loop End Loop; Close c_ITEM;
TPL 事务处理语言
commit 提交

标志一个成功的隐性事务或显式事务的结束。

  • 如果 @@TRANCOUNT 为 1,COMMIT TRANSACTION
    使得自从事务开始以来所执行的所有数据修改成为数据库的永久部分,释放事务所占用的资源,并将 @@TRANCOUNT 减少到 0。
  • 如果 @@TRANCOUNT 大于 1,则 COMMIT TRANSACTION 使 @@TRANCOUNT 按 1
    递减并且事务将保持活动状态。
rollback 回滚

rollback是针对事务的,你如果没有在执行语句之前开启事务,那么无法rollback。

MYSQL系统 数据库

SQL注入中最常见利用的系统数据库,经常利用系统数据库配合union联合查询来获取数据库相关信息,因为系统数据库中所有信息都在这个数据库里面,比如所有数据库名、所有的表名、列名以及列名的数据库类型等

这里主要关注MYSQL系统数据库information_schema
关注系统数据库的表columns和schema表以及tables表

  • SCHEMATA表:提供了关于数据库的信息
    这个表里面存放的数据库信息,这个表里面最关键的就是schema_name列,这里面存放了所有数据库名称,查询这个列所有的值即可拿到所有数据库名,这里还有其他列名
查询这个表schema_name的值,即查询所有数据库名
select distinct schema_name from schemata;
  • COLUMNS表:给出了表中的列信息
    这个表给出了所有表中的所有列信息,但是同时也包含了数据库名,所有表名,所有列名值对应列column_name,所有数据库名值对应列table_schema,所有表名值对应table_name列,当然此表还有其他列信息.
同表schemata一样,查询columns表里面的table_schema列一样可以得到所有数据库名
select distinct table_schema from information_schema.columns;
查询当前数据库所有列
select distinct column_name from information_schema.columns;查询到当前有多少个列名
查询当前所有表名
select distinct table_name from information_schema.columns;查询结果当前有多少个表名
  • TABLES表:给出了关于数据库中的表的信息

这个表给出了所有表的信息,但是同时也包含了数据库名,所有表名,所有数据库名值对应列table_schema,所有表名值对应table_name列,当然此表还有其他表的信息

同表columns以及schemata一样,查询tables表里面的table_schema列一样可以得到所有数据库名
select distinct table_schema from information_schema.tables;
同columns表一样,从tables表里面的所有表名
select distinct table_name from information_schema.tables;

MYSQL 函数

SQL函数是在SQL注入中用的比较多的,经常利用SQL函数来判断数据库的版本,当前用户,当前用户权限以及数据库的安装路径等等,

以下是常用的MYSQL函数
system_user()系统用户名
user()用户名
current_user() 当前用户名
session_user() 连接数据库用的用户名
database()数据库名
version()mysql数据库版本
load_file()mysql读取本地文件的函数
@@datadir 数据库路径
@@basedir mysql安装路径
@@version_compile_os 操作系统
select current_user();查询当前用户
select version();查询当前数据库版本
select @@datadir;查询当前数据库路径
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值