SQL注入学习之路专栏,里面的内容是基于Sqli-labs这个环境来进行学习的,从原理一步一步来学习。(我在window Sever 2003虚拟机中通过phpstudy 2016搭建了Sqli-labs环境。)

下面开始我们的学习之旅:

1.启动 mysql,然后通过查询检查下数据库:

show databases;

2. Sqli-labs环境中使用的数据库名为 security,所以我们选择 security数据库来执行命令。

ues security;

3.查看下security数据库中有哪些表

4.我们可以在security数据库中看到有四张表,然后我们查看这四张表的结构。

desc emails;

desc referers;

desc uagents;

desc users;

5.我们还要了解下系统数据库,即 information_schema。

use information_schema;

6.看下有哪些表。

show tables;

7.我们枚举这整张表。(注意该表中的TABLE_SCHEMA和TABLE_NAME)

desc tables;

8.现在我们来使用下面这个语句查询,使用这个查询,我们可以看到表名。

select table_name from information_schema.tables where table_schema = "security";

9. 注:MySQL 中 Schema 等价于 数据库。(便于理解,要想知道他们的关系可自行查阅资料。)


10.Mysql 有一个系统数据库 information_schema,存储着所有的数据库的相关信息,一般的,
我们利用该表可以进行一次完整的注入。以下为一般的流程。


猜数据库
select schema_name from information_schema.schemata


猜某库的数据表------以security数据库为例。
select table_name from information_schema.tables where table_schema='xxxxx';


猜某表的所有列------以emails表为例。
select column_name from information_schema.columns where table_name='xxxxx';


获取某列(字段)的内容---以emails表中的id,email_id 为例。
select *** from ****

1.limit子句(top子句)

用于规定要返回的记录的数目:
select * from users limit 3——返回前3条


select * from users limit 1,2——返回索引1开始的前2条(索引从0开始)

2.concat()函数

用于连接字符串:
select concat('11','22','33')——输出"112233"
select concat_ws('-','11','22','33')——输出"11-22-33",第一个参数是其它参数的分隔符
group_concat(column_name)——将字段的所有数据用,(逗号)连接作为字符串输出

3.内置数据库information_schema

系统数据库information_schema数据库中含有很重要的三张表:schemata,tables和columns。

schemata表中存储了Mysql中所有数据库的信息,包括数据库名,编码类型等,show databases的结果取之此表。
tables表有schema_name一个字段,为数据库名。

tables表中存储了Mysql中所有数据库的表的信息(索引根据数据库名),show tables from schema_name的结果取之此表。
tables表有table_nametable_schema两个字段,分别为表名和表所在数据库。

columns表中存储了Mysql中所有表的字段信息,show columns from schema_name.table_name的结果取之此表。
columns表有column_nametable_nametable_schema三个字段,分别为字段名、字段所在表名和表所在数据库。

4.order by关键字

select * from table_name order by 3——按第三列(第三个字段)排序
order by column_name asc/desc——升序/逆序

通常利用order by num和回显来判断该表有几个字段:若num=4时报错,num=3不报错,则说明该表有3个字段。

5.union操作符---(可自行百度)

两个查询返回的列(字段)数必须相同。
两个select语句对应列所返回的数据类型必须相同(或至少是兼容的)。

通常利用联合查询的特点,使原查询左边为空,使我们定义的查询结果返回出来。

如users表共3个字段,界面显示第2、3个字段,我们便可以构造:
select * from users where id=-1 union select 1,2,3 from users
这里的2,3可以换成任意想要的结果。

 还有就是如果只出现两个字段就得这么构造这样:(两个查询返回的列(字段)数必须相同)

select username,password from users where id=-1 union select 1,2 from users

来自:https://www.jianshu.com/p/b5ab19751955的一段小知识点。

再补充:

小知识点(原文链接:https://blog.csdn.net/dyyshb/article/details/82346699):

URL中的空格有时候被编码成%20,有时候被编码成加号+,曾经迷糊过一段时间,后来查了下资料才搞明白。

     一个URL的基本组成部分包括协议(scheme)、 域名、端口号、路径和查询字符串(路径参数和锚点标记就暂不考虑了)。路径和查询字符串之间用问号?分离。例如http://www.example.com/index?param=1,路径为index,查询字符串(Query String)为param=1。URL中关于空格的编码正是与空格所在位置相关:空格被编码成加号+的情况只会在查询字符串部分出现,而被编码成%20则可以出现在路径和查询字符串中。

      造成这种混乱局面的原因在于:W3C标准规定,当Content-Type为application/x-www-form-urlencoded时,URL中查询参数名和参数值中空格要用加号+替代,所以几乎所有使用该规范的浏览器在表单提交后,URL查询参数中空格都会被编成加号+。而在另一份规范RFC2396,定义URI)里, URI里的保留字符都需转义成%HH格式(Section 3.4 Query Component),因此空格会被编码成%20,加号+本身也作为保留字而被编成%2B,对于某些遵循RFC 2396标准的应用来说,它可能不接受查询字符串中出现加号+,认为它是非法字符。所以一个安全的举措是URL中统一使用%20来编码空格字符。
 

转载:

Mysql—用户表详解(mysql.user)

MySQL是一个多用户管理的数据库,可以为不同用户分配不同的权限,分为root用户和普通用户,root用户为超级管理员,拥有所有权限,而普通用户拥有指定的权限。

MySQL是通过权限表来控制用户对数据库访问的,权限表存放在mysql数据库中,主要的权限表有以下几个:user,db,host,table_priv,columns_priv和procs_priv,先带你了解的是user表。

通常用户信息、修改用户的密码、删除用户及分配权限等就是在mysql数据库的user表中。

用户列(用户连接MySQL数据库需要输入的信息)

Host:主机名,双主键之一,值为%时表示匹配所有主机。User:用户名,双主键之一。Password:密码名。

HostUserPassword
%domain_check*55B565DA3839E5955A68EA96EB735
localhostdomain_check*55B565DA3839E5955A68EA96EB735
127.0.0.1domain_check*55B565DA3839E5955A68EA96EB735
126.26.98.25domain_check*55B565DA3839E5955A68EA96EB735
localhost  
::1root*26C378D308851D5C717C13623EFD6
localhostroot*26C378D308851D5C717C13623EFD6
127.0.0.1root*26C378D308851D5C717C13623EFD6

(root,%),表示可以远程登录,并且是除服务器外的其他任何终端,%表示任意IP都可登录。
(root,localhost),  表示可以本地登录,即可以在服务器上登陆,localhost则只允许本地登录。
(root,127.0.0.1 ),表示可以本机登陆,即可以在服务器上登陆
(root,sv01),表示主机名为sv1可以登陆,sv01具体指的哪台机器,可以在cat /etc/hostname查看
(root,::1) ,  表示本机可以登陆, 看密码都是相同嘛,具体::1代表意义,待查

权限列

权限列决定了用户的权限,描述了用户在全局范围内允许对数据库和数据库表进行的操作,字段类型都是枚举Enum,值只能是Y或N,Y表示有权限,N表示没有权限。

权限字段名称备注说明
Select_priv确定用户是否可以通过SELECT命令选择数据
Insert_priv确定用户是否可以通过INSERT命令插入数据
Delete_priv确定用户是否可以通过DELETE命令删除现有数据
Update_priv确定用户是否可以通过UPDATE命令修改现有数据
Create_priv确定用户是否可以创建新的数据库和表
Drop_priv确定用户是否可以删除现有数据库和表
Reload_priv 确定用户是否可以执行刷新和重新加载MySQL所用各种内部缓存的特定命令,包括日志、权限、主机、查询和表重新加载权限表
 Shutdown_priv确定用户是否可以关闭MySQL服务器在将此权限提供给root账户之外的任何用户时,都应当非常谨慎
Process_priv 确定用户是否可以通过SHOW PROCESSLIST命令查看其他用户的进程 
File_priv 确定用户是否可以执行SELECT INTO OUTFILE和LOAD DATA INFILE命令

安全列

安全字段名称备注说明
ssl_type支持ssl标准加密安全字段
ssl_cipher支持ssl标准加密安全字段
x509_issuer支持x509标准字段
x509_subject支持x509标准字段
password_expired密码是否过期。Y:说明该用户密码已过期 N:没有过期
plugin5.5.7开始,mysql引入plugins以进行用户连接时的密码验证,plugin创建外部/代理用户
authentication_string通过authentication_string可以控制两者的映射关系,(PAM plugin等,PAM可以支持多个服务名)

资源控制列

控制字段名称字段类型是否为空默认值备注说明
max_questionsint(11)unsignedNO0每小时允许执行多少次查询:0表示无限制
max_updatesint(11)unsignedNO0每小时可以执行多少次更新:0表示无限制
max_connectionsint(11)unsignedNO0每小时可以建立的多少次连接:0表示无限制
max_user_connectionsint(11)unsignedNO0单用户可以同时具有的连接数:0表示无限制

常用命令

查询所有用户
mysql> select Host,User,Password from user;

查询用户权限:all表示所有权限,select表示只查权限,update表示只改权限,delete表示只删权限等。
mysql> show grants for "user"@"host";
mysql> show grants for "root"@"localhost";

添加授权用户(新创建的用户,默认情况下是没有任何权限的):使用root用户连接到服务器
mysql> create user "用户名"@"IP地址" identified by "密码";
mysql> create user "haidon"@"%" identified by "123456";
mysql> create user "haidon"@"localhost" identified by "123456";
IP地址的表示方式:
1.% 表示用户可以从任何地址连接到服务器
2.localhost 表示用户只能从本地连接到服务器
3.指定一个ip表示用户只能从此ip连接到服务器

分配用户权限(给用户授权)
mysql> grant 权限列表 on 库.表 to "用户名"@"ip地址" with grant option;
mysql> grant all privileges on *.* to "haidon"@"%" with grant option;
mysql> grant all privileges on *.* to "haidon"@"%" identified by 'test' with grant option; 
mysql> grant all privileges on domain_check.tb_user to "haidon"@"localhost" with grant option;
mysql> grant select on domain_check.tb_user to "haidon"@"localhost" with grant option;
mysql> grant select,insert on domain_check.tb_user to "haidon"@"132.24.98.25" with grant option;  
1.权限列表:select、update、delete、insert、alter、drop、create、...(show)
2.库.表:*.*表示所有库的所有表。with grant option表示它具有grant权限。密码是test。 
3.如果带了 with grant option,那么用户haidon可以将select ,update权限传递给其他用户( 如xiaodon)。
4.如果没带 with grant option,那么用户haidon不能给用户xiaodon授权。
5.all后面加上privileges,具体到哪些权限时得看MySQL版本,5.7版本不加privileges,8.0版本加privileges。
6.mysql> insert into user values("%","haidon",password("test"),"Y","Y","Y","Y","Y","Y","Y","Y","Y","Y"); 
  mysql> flush privileges; 这两句和上面第3句grant的效果是一样的。
7.mysql> insert into user (host,user) values("132.24.98.25","haidon");
  mysql> insert into db values("132.24.98.25","haidon","Y","Y","Y","Y","Y","Y","N","N","N","N") 
  mysql> flush privileges; 这三句和上面第6句grant的效果是一样的。

收回用户权限
mysql> revoke all on *.* from "haidon"@"localhost";
mysql> revoke all on domain_check.tb_user from "haidon"@"localhost";
mysql> revoke select  on *.* from "haidon"@"localhost";

删除授权用户
mysql> drop user "用户名"@"ip地址"
mysql> drop user "haidon"@"%"
mysql> delete from user where user='haidon'; 
mysql> flush privileges; 

 

 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐