sqlilabs靶场学习(part2:mysql数据库与常用函数学习)

sqlilabs靶场学习(part2:mysql基础知识学习)

  • 0x00 基础知识学习
  • 0x01 mysql系统库
    • 1. information_schema数据库
    • 2. mysql 数据库
    • 3. PERFORMANCE_SCHEMA 数据库
    • 4.test数据库
    • 5.sys数据库
  • 0x02 mysql常用函数
    • 1.select ...from
    • 2.concat()函数
    • 3.concat_ws()函数
    • 4.group_concat()函数
    • 5. order by
    • 6.left()、right()、substring()、substr()、mid()字符串截取函数
    • 7.updatexml()、extractvaule()、floor()报错注入函数
  • 0x03 参考文献

0x00 基础知识学习

在CTF赛题中最常见的就是php+mysql的数据库注入题目,这类题目需要我们掌握基本的sql语言使用和mysql系统表基础,便于我们理解每次使用的句子,例如用户基本信息在哪里存放?共有多少个数据库?等一些需要我们知道的信息。

0x01 mysql系统库

在命令行下使用

mysql.exe -u root@127.0.0.1 -p

输入密码后进入mysql命令行界面。
在这里插入图片描述首先查看当前用户下的所有数据库名。

show databases;

在这里插入图片描述

可以看到我们的数据库版本为5.5.53,因此除了我们此次练习新建的数据库jokeDBsecuritychallenges外,还有4个系统数据库

information_schema  //系统库
mysql  //系统库
performance_schema  //系统库
test  //系统库
challenges   //sqlilabs库
jokeDB   //sqlilabs库
security  //sqlilabs库

1. information_schema数据库

在MySQL中,把 information_schema 看作是一个数据库,确切说是信息数据库。其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权 限等。在INFORMATION_SCHEMA中,有数个只读表。它们实际上是视图,而不是基本表。

使用下面的语句切换数据库,并查看当前数据中的所有表。

use information_schema;
show tables;

其中最常用,对我们了解未知数据库最有用的表有:

  • SCHEMATA;
    提供了当前mysql实例中所有数据库的信息。是show databases的结果取之此表。
  • TABLES;
    提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。是show tables from schemaname的结果取之此表。
  • COLUMNS;
    提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname.tablename的结果取之此表。
  • STATISTICS;
    提供了关于表索引的信息。是show index from schemaname.tablename的结果取之此表。

需要我们了解的有:

  • USER_PRIVILEGES(用户权限);
    给出了关于全程权限的信息。该信息源自mysql.user授权表。是非标准表。
  • SCHEMA_PRIVILEGES(方案权限);
    给出了关于方案(数据库)权限的信息。该信息来自mysql.db授权表。是非标准表。
  • TABLE_PRIVILEGES(表权限);
    给出了关于表权限的信息。该信息源自mysql.tables_priv授权表。是非标准表。
  • COLUMN_PRIVILEGES(列权限);
    给出了关于列权限的信息。该信息源自mysql.columns_priv授权表。是非标准表。

例如,我们可以通过语句select schema_name from information_schema.schemata;查询当前用户下的所有数据库,语句结果等效于show databases;
在这里插入图片描述在这里插入图片描述

通过select table_name from information_schema.tables where table_schema = 'jokeDB';来查询jokeDB数据库下的所有表名,结果等效于show tables from jokeDB;

在这里插入图片描述在这里插入图片描述

通过select column_name from information_schema.columns where table_schema='jokeDB' and table_name = 'users';查询对应表下的列名,其结果等效于show columns from jokeDB.users;.

在这里插入图片描述在这里插入图片描述
最后通过 select user,pass from jokeDB.users;查询数据库某一表下特定列的内容。在这里插入图片描述

2. mysql 数据库

mysql的核心数据库,类似于sql server中的master表,主要负责存储数据库的用户、权限设置、关键字等mysql自己需要使用的控制和管理信息。例如root用户的密码存储在mysql.user表中。

主要需了解:

  • user;
    包含用户账户、全局权限和其他非权限列表(安全配置字段和资源控制字段)。
  • db;
    数据库级别的权限表。该表中记录的权限信息代表用户是否可以使用这些权限来访问被授予访问的数据库下的所有对象(表或存储程序)。
  • tables_priv;
    表级别的权限表。
  • columns_priv;
    字段级别的权限表。
  • procs_priv;
    存储过程和函数权限表。
  • proxies_priv;
    代理用户权限表。

例如,通过语句select user from mysql.user;查询mysql数据库的所有用户名。
在这里插入图片描述

3. PERFORMANCE_SCHEMA 数据库

MySQL 5.5开始新增一个数据库:PERFORMANCE_SCHEMA,主要用于收集数据库服务器性能参数。并且库里表的存储引擎均为PERFORMANCE_SCHEMA,用户不能创建存储引擎为PERFORMANCE_SCHEMA的表。
具体内容可了解MySQL5.6 PERFORMANCE_SCHEMA 说明。

4.test数据库

前期版本系统自动创建的测试数据库,是一个空数据库,没有任何内容,可以删除。5.7版官方已经删除了test数据库。并新增一个sys系统库。

5.sys数据库

sys数据库中的信息来自PERFORMANCE_SCHEMA,为了让PERFORMANCE_SCHEMA表的可读性更强而产生的表,所以其内容也是以mysql服务器性能参数为主。
具体内容可了解学习使用MySQL 5.7的sys库。

0x02 mysql常用函数

数据库最基本的功能就是增、删、查、改,我们在SQL注入的学习中也需要了解各种字段操作函数和查询语句,帮助我们得到想要的信息。
下面的语句均以jokeDB数据库的users表为例。

1.select …from

select * from jokeDB.users;  //查询jokeDB数据库中users表的全部内容,这个结果是以行rows展示的。

在这里插入图片描述

2.concat()函数

select concat(user,pass) from jokeDB.users;  //查询jokeDB数据库中users表的user、pass列数据,并将每一条结果拼接。

在这里插入图片描述

3.concat_ws()函数

select concat_ws(',',user,pass) from jokeDB.users;  //查询jokeDB数据库中users表的user、pass列数据,并将每一条结果拼接,用逗号分割。

在这里插入图片描述

4.group_concat()函数

select group_concat(user,pass) from jokeDB.users;  //查询jokeDB数据库中users表的user、pass列数据,并将所有分组拼接,最后返回一行数据。

在这里插入图片描述

5. order by

order by的作用是将查询的结果依照某一字段的内容进行排序,需指定descasc,默认为升序,在升序状态下:

  • 如果字段类型为数字,则由小到大排序
  • 如果字段类型为日期,则时间早的在前
  • 如果字段类型为字符型,则按照ascii码顺序排序
  • 如果字段为空值,则显示在所有值的后面

例如,我们按照索引来对结果进行排序,索引的值从1开始,到最大字段数。

为了更直观的看到按照索引的不同来排序,将user字段的内容改为了zdminrootid则保留121

select * from jokeDB.users order by 1//以字段1为排序依据时,1<21,zdmin在第一行显示。

在这里插入图片描述

select * from jokeDB.users order by 2//以字段2为排序依据时,字符r<z,root在第一行显示。

在这里插入图片描述

select * from jokeDB.users order by 8//以字段8为排序依据时,超出了本来有的字段数,因此可通过这一语句判断目标表的字段数。

在这里插入图片描述

6.left()、right()、substring()、substr()、mid()字符串截取函数

  • left(str, length)
    left(被截取字段,截取长度)
    *right(str, length)
    right(被截取字段,截取长度)
  • substring(str, pos)
    substring(被截取字段,从第几位开始截取)
  • substring(str, pos, length)
    substring(被截取字段,从第几位开始截取,截取长度)
  • mid()、substr()函数等同于substring()函数。
select left(user1) from jokeDB.users;  //截取字段user的左边1位。

在这里插入图片描述

select substring/mid/substr(user,1,2) from jokeDB.users;  //截取字段user第1位开始的后2位,索引从1开始。

在这里插入图片描述

在后续盲注时,通常会需要将字符串一个个截取比较ascii的值来判断是否是正确的。

7.updatexml()、extractvaule()、floor()报错注入函数

  • updatexml()函数是MYSQL对XML文档数据进行查询和修改的XPATH函数。
    语法:UPDATEXML (xml_document, XPathstring, new_value)。
    xml_document,文档名称。
    XPathstring (Xpath格式的字符串),做内容定位。
    new_value,String格式,替换查找到的符合条件的值。
  • extractvalue()函数为MYSQL对XML文档数据进行查询的XPATH函数。
    extractValue(xml_document, xpath_string);
    其中XML_document是String格式,为XML文档对象的名称,
    XPath_string (Xpath格式的字符串);
    原理为:Xpath定位必须是有效的,否则则会发生错误;所以可以在这个位置植入表达式,做执行后报错。
  • floor()函数为向下取整
    原理为:count()+rand()+group_by()导致的主键重复。

对于以上盲注、报错注入、一般注入等等利用方式,会在后续刷题的过程中深入学习,这里先将可能需要的点都列出来,关于报错注入方面也参考学习了一些大佬的文章。

0x03 参考文献

1.Floor报错注入原理解析心得
2.sql注入之floor薛定谔报错注入以及报错原理
3.SQL注入-报错注入

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星辰照耀你我

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值