目录
SQL注入的基本过程图
平常我们说MySQL、SQL Server、Oracle等等,都是数据库系统,它不是数据库,数据库是数据库系统里的database。
★数据库里有:库(database)、表(table)、列(current)
查看全部database才加"s" = databases (表和列同理)
SQL语言解析
select:查询语句
show:查看语句;显示
create:创建
drop:删除
use:使用
mysql里的函数后面要加括号“()”
mysql的指令后面一定要加一个分号“;”结束,否则mysql它并不承认你的语句结束了
select version(); #查看mysql版本
select user(); #查看当前用户
select nuw(); #查看当前日期和时间
select database(); #查看当前打开的数据库
show database; #查看mysql中共包含了哪些数据库
show columns; #查看表中字段信息,即表结构
use test; #打开test数据库表中字段信息,即表结构
show tables; #显示数据库中的表
create database database_name; #创建数据库
create table table_name; #创建表
drop database datavase_name; #删除数据库
drop table table_name; #删除表
说明1
@localhost:限制了root在哪里登录,只能通过本地或本机登录,不能够远程
如果是%号的话,就可以远程。所有都可以远程。
说明2
(none):是没有的意思,use security 库后,那就会显示是security,告诉你你正在使用security库。
一张完整的表包含了哪些?(字段名称,各字段数据类型)
如:创建表 (字段 空格隔开 数字类型 逗号 字段 空格隔开 数据类型);
数据类型:
int #整形(非浮点的数值)
char(#) #字符型
varchar #可以变化的字符型
数据表的管理:
-
创建数据表,表名称hack:
create table hack (id int,username varchar(30),password varchar(30));
-
查看表的结构:
desc table_name;
-
删除表:
drop table table_name;
-
向hack表中添加记录:
insert into hack values(1,'admin','456');
insert into hack values(2,'boss','123');
数据查询
-
基本查询语句
select * from users; #显示hack表中的所有记录
* :所有 查找的字段,例如:id
from :从哪个表里进行查询
select id,username from hack; #指定字段查看
id,username :指定id和username字段来查看
select * from hack where id=1; #从hack表中查找满足条件id=1的记录
where :条件是什么 (这里是id=1,查询users表里id=1的)
select id,username from from hack where id=1;
id,username:指定字段
where id=1:where指定条件 id=1
所以说,条件这些有两个位置:
1.满足条件的显示,不满足条件的记录不显示。
2.要看的哪些字段。
组合条件查询:
and #与 满足两个条件才为真
or #或 满足一个条件为真
not #非 非真就假,非假就真,取反
与
select * from hack where username="admin" and password="456"; #两个条件为真,才为真
两个条件为真就返回信息
例:在网站上登录,提交了用户名和密码,数据库就查询username=“admin”和password=“456”,两者都存在,则登录成功。
一真一假不返回信息,如下图:
存在这个用户,但密码不正确,所以不返回信息。
或
select * from hack where username="admin" or password="547"; #满足一个条件为真
or 满足一个条件为真,用户名为真,所以返回信息。
select * from users where id=1 and exists(select * from hack);
order by 排序
select * from hack order by id;
id:按照id来罗列,排序
默认升序:从小到大
select * from hack order by 3;
3:按照password来进行从小到大排序,因为password在第三列,所以是3
select * from hack order by 4;
超过列数就报错,第四列是不存在的没有的,所以报错。
select * from order by id desc;
desc:降序排序,从大到小
select username,password from hack order by 2;
#按照查询结果中的第二列(即password列)升序排序
order by 在注入时通常用来拆解字段。你指定字段的话,就字段排序。如果你指定数字,那么它就对应数字的字段来进行排序。
所以,在SQL注入时通常来判断它的字段数是多少。
union select 联合查询
union 联合查询,可以一次性执行两个或多个查询操作,并将结果输出。
注:union在查询的过程中,字段数量必须要相同,否则出错。
select * from news union select * from hack;
#字段数不匹配,查询报错
select * from news union select username,password from hack;
#查询正常
select * from hack union select 1,id,title from news;
#news表只有两个字段,hack表有3个字段,news就补一个空位上去,使查询正常
注释
单行注释
# :以“#”号开头,直到该行行尾,全部都是注释内容;
--空格 :以“-- ”开头,直到该行行尾,全部都是注释内容。
(“-- ”与注释内容之间要加空格)
多行注释
/*... ...*/ :“/*”用于注释文字的开头,“*/”用于注释文字的结尾。
select * from hack; -- union select 1,id,title from news;
--空格,注释掉了后面union的部分,只显示了hack表
不注释的话就是下图,两个表的内容一起显示出来。
select * from hack; # union select 1,id,title from news;
#号的注释,和--空格一样的