SQL注入之order by注入与limit注入

  • order by注入
    • 什么是order by
    • 判断注入类型
    • 注入方式
      • 1.和union查询一块使用
      • 2.基于if语句盲注(数字型)
      • 3.基于时间的盲注
      • 4.基于rand()的盲注(数字型)
      • 5.报错注入
  • limit注入
    • 什么是limit
    • 注入方式
      • procedure analyse()报错注入

order by注入

什么是order by

在MySQL支持使用ORDER BY语句对查询结果集进行排序处理,使用ORDER BY语句不仅支持对单列数据的排序,还支持对数据表中多列数据的排序。语法格式如下

select * from 表名 order by 列名(或者数字) asc;升序(默认升序)
select * from 表名 order by 列名(或者数字) desc;降序

假设有以下用户表

当我们使用命令 select * from users order by username asc;的时候,是将users这张表按照username这一列进行升序,结果就变成了;可以看到username那一列是按照字母从小到大的方式进行排序。

将asc修改desc后,它就会按username降序打印。

mysql中order by还支持多个字段自定义排序,通过逗号隔开,但只能在数字之间进行自定义排序,若选择字符类型则会根据第一个列名的排序规则进行排序。
语法格式如下

select * from 表名 order by 列名(或者数字) asc;升序(默认升序) ,列名(或者数字) desc;降序(默认升序)

而order by注入就是通过可控制的位置在order by子句后,如下order参数可控:
select * from goods order by $_GET['order']

判断注入类型

数字型order by注入时,语句order by=2 and 1=2,和order by=2 and 1=1 显示的结果一样,所以无法用来判断注入点类型

而用rand()会显示不同的排序结果

当在字符型中用?sort=rand(),则不会有效果,排序不会改变

因此用rand()可判断注入点类型

注入方式

1.和union查询一块使用

前面经常利用order by子句进行快速猜解表中的列数

测试时,测试者可以通过修改order参数值,比如调整为较大的整型数,再依据回显情况来判断具体表中包含的列数。

再配合使用union select语句进行回显。

2.基于if语句盲注(数字型)

下面的语句只有order=$id,数字型注入时才能生效,

order ='$id'导致if语句变成字符串,功能失效

如下图为演示

字符串型时if()失效,排列顺序不改变

数字型时排列顺序改变

知道列名情况下
if语句返回的是字符类型,不是整型, 因此如果使用数字代替列名是不行的,如下图语句没有根据password排序。

这是在知道列名的前提下使用

?order=if(表达式,id,username)
  • 表达式为true时,根据id排序
  • 表达式为false是,根据username排序

不知道列名的情况
id总知道吧

?order=if(表达式,1,(select id from information_schema.tables))
  • 如果表达式为true时,则会返回正常的页面
  • 如果表达式为false,sql语句会报ERROR 1242 (21000): Subquery returns more than 1 row的错误,导致查询内容为空

3.基于时间的盲注

order by if(表达式,1,sleep(1))
  • 表达式为true时,正常时间显示
  • 表达式为false时,会延迟一段时间显示

延迟的时间并不是sleep(1)中的1秒,而是大于1秒。 它与所查询的数据的条数是成倍数关系的。

计算公式:延迟时间=sleep(1)的秒数*所查询数据条数

如果查询的数据很多时,延迟的时间就会特别长

在写脚本时,可以添加timeout这一参数来避免延迟时间过长这一情况。

4.基于rand()的盲注(数字型)

rand() 函数可以产生随机数介于0和1之间的一个数

当给rand() 一个参数的时候,会将该参数作为一个随机种子,生成一个介于0-1之间的一个数,

种子固定,则生成的数固定

order by rand:这个不是分组,只是排序,rand()只是生成一个随机数,每次检索的结果排序会不同

order by rand(表达式)

当表达式true和false时,排序结果是不同的,所以就可以使用rand()函数进行盲注了。
例:

order by rand(ascii(mid((select database()),1,1))>96)

5.报错注入

order by updatexml(1,if(1=2,1,(表达式)),1)
order by extractvalue(1,if(1=2,1,(表达式)));

因为1=2,所以执行表达式内容

例如order by updatexml(1,if(1=2,1,concat(0x7e,database(),0x7e)),1)获取数据库名

若改成1=1,则页面正常显示

limit注入

什么是limit

在mysql中limit ,主要用于提取前几条或者中间某几行数据。
使用语法:

select * from table limit m,n
其中m是指记录开始的index,从0开始,表示第一条记录
n是指从第m+1条开始,取n条。
select * from tablename limit 2,4
即取出第3条至第6条,4条记录

limit注入:注入点出现在limit后面的即可称为limit注入。

注入方式

procedure analyse()报错注入

此方法适用于<=MySQL 5.5中,在limit语句后面的注入
在mysql语法中limit后面只能跟PROCEDUREINTO OUTFILEFOR UPDATE | LOCK IN SHARE MODE三个函数。

现今的5.7版本后limit 关键字后面就不能和union联合查询一起使用了,但是还可跟PROCEDURE和 INTO两个关键字,但是 INTO 后面写入文件需要知道绝对路径以及写入shell的权限,这里就只演示使用procedure analyse()函数来实现错误注入,这个函数下有ANALYSE支持两个参数,首先尝试一下默认两个参数

select * from users order by id limit 0,1 procedure analyse(1,1);

#limit结合procedure analyse()报错注入
select * from users order by id limit 0,1 procedure analyse(extractvalue(1,concat(version())));

特别注意:在5.7.26中我执行时会报错原因是官方在mysql5.7.18版本起就将它弃用了,所以我这里无法执行

SQL注入之order by注入与limit注入相关推荐

  1. mysql limit asc_MySql sql优化之order by desc/asc limit M-阿里云开发者社区

    Order by desc/asc limit M是我在mysql sql优化中经常遇到的一种场景,其优化原理也非常的简单,就是利用索引的有序性,优化器沿着索引的顺序扫描,在扫描到符合条件的M行数据后 ...

  2. mysql 5.6.6_Mysql下Limit注入方法(此方法仅适用于5.0.0mysql5.6.6的版本)

    SQL语句类似下面这样:(此方法仅适用于5.0.0 SELECT field FROM table WHERE id > 0 ORDER BY id LIMIT (注入点) 问题的关键在于,语句 ...

  3. sql 数据库前两列值乘_SQL注入原理和方法汇总

    本文首发于先知社区 前言: SQL注入是web安全中最常见的攻击方式,SQL注入有很多方法,但如果只知道payload,不知道原理,感觉也很难掌握,这次就总结一下我所遇到的SQL注入方法,原理分析+题 ...

  4. 【SQL注入】通过实战教你手工注入MySql数据库

    [SQL注入]通过实战教你手工注入MySql数据库 Hello,各位小伙伴们大家晚上好~~ 不知不觉,已经是本公众号的第八篇技术文章了,你们都有认真阅读吗? 正当小编发愁下一篇写什么的时候,鲁迅发话了 ...

  5. mysql注入之limit 注入

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

  6. SQL注入教程——(三)简单的注入尝试

    本文将以简单的SQL注入实例来讲解SQL注入的基本思路与流程,当然本文实例只是注入的一种情况,初学者应重点理解思路,学会举一反三. GET与POST 进行SQL注入攻击,大家还需要了解两种基本的 HT ...

  7. SQL注入教程——(四)宽字节注入

    前言 在mysql中,用于转义(即在字符串中的符号前加上"\")的函数有addslashes,mysql_real_escape_string,mysql_escape_strin ...

  8. sql order by,desc和limit使用(mysql)

    (。ŏ_ŏ) 首先我们来看一个表: 在此我们要进行排序,按降序排序,就是从大到小.然后我们只要查询前2条数据. 意思就是我们需要把这个表从大到小排序后,取前两条,那么我们就需要使用到order by ...

  9. SQL(四) - 子查询和union以及limit分页

    子查询概念 什么是子查询?子查询都可以出现在哪里? select语句当中嵌套select语句,被嵌套的select语句是子查询. 子查询可以出现在哪里? select..(select). from. ...

最新文章

  1. 0基础学习数据分析必须掌握的技能有哪些?
  2. (原創) 鐵拳4真是超級好玩~~ (日記)
  3. P3806-【模板】点分治1
  4. 【ASP.NET Web API教程】2.3 与实体框架一起使用Web API
  5. javascript模块_JavaScript中的模块
  6. Mybatis源码研究5:数据源的实现
  7. java unsigined short_LDD之数据类型
  8. 短视频生产利器!视频裁剪之横屏转竖屏新技术,出自腾讯多媒体实验室
  9. 正则表达式 详解---2017-04-16
  10. IDEA工作常用第三方插件
  11. 一个可能是世界上最全的 API 接口集合库开源项目
  12. WordPress seo 插件
  13. C语言:基本语法汇总
  14. soui 设置边框_第三十四篇:在SOUI中使用异步通知
  15. SSH框架(spring+struts2+hibernate)+Mysql实现的会议管理系统(功能包含会议室管理、会议管理、用户管理、部门管理、设备管理、个人资料编辑等)
  16. Eclipse Theia:Eclipse的继承者?
  17. POP3 SMTP 协议分析学习笔记
  18. 单调队列java_单调队列单调栈
  19. 阿里云企业物联网平台推出千里传音播报服务 高效打造云端一体智能硬件
  20. Latex带序号的项目符号列表

热门文章

  1. Ceph: ceph基础知识
  2. 第二阶段>>>数据库/SQL/SSM/JDBC/核心总结
  3. android手机连接windows,四种方式将数据从Windows手机免费传输到Android设备
  4. undefined symbol
  5. SQLyog中如何导入mysql数据库
  6. HTML5历史状态管理history API-pushState/replaceState与popstate事件
  7. python模拟鼠标滚动
  8. 哪个牌子的护眼灯最好?
  9. 区块链技术的概念及作用
  10. app闪退之-- GL error: Out of memory!