​SQL注入:order by注入

20 篇文章 0 订阅
15 篇文章 0 订阅

 SQL注入系列文章:

初识SQL注入-CSDN博客

SQL注入:联合查询的三个绕过技巧-CSDN博客

SQL注入:报错注入-CSDN博客

SQL注入:盲注-CSDN博客

SQL注入:二次注入-CSDN博客

目录

什么是order by?

order by 注入

与联合查询配合使用

与if语句配合使用

与时间盲注配合使用

与rand()函数配合使用

与报错注入配合使用


前面和大家分享了SQL注入的联合查询,报错注入,盲注,二次注入,本篇将会和大家分享一下SQL注入中的order by 注入ヾ(◍°∇°◍)ノ゙

什么是order by?

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

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

假设有以下用户表

如果我们现在需要按照username来进行由大到小,升序排列,则需要使用到order by来进行排序了

可以看到username那一列是按照字母从小到大的方式进行排序。

如果需要进行倒叙排列就加一个desc即可:

order by 注入

与联合查询配合使用

order by的一个用法:

对SQL注入有了解或者如果看过我前面文章的小伙伴应该知道我们手工进行注入的时候需要判断数据库中一共有多少列,因此需要使用select 1,2,3...不断变化数字来查找数据库一共有多少列,那么如果某个系统的数据库中有100列,那么我们需要一直到100,非常的麻烦且低消,因此我们可以使用order by 来进行判断:

可以利用 id=1‘ order by n --+不断变换n的值来来判断列数,不会像 1,2,3...那样的很麻烦需要写很多的数字,非常的耗时。

现在就已经知道列数了,然后再配合使用union select语句进行注入出数据即可。

与if语句配合使用

下面的语句只有order=$id,数字型注入时才能生效,order ='$id'导致if语句变成字符串,功能失效

如下图为演示:

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

数字型时排列顺序改变

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

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

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

  • 表达式为false是,根据username排序

不知道列名的情况:

?order=if(表达式,1,(select id from information_schema.tables))
  • 如果表达式为true时,则会返回正常的页面

  • 如果表达式为false,sql语句会报ERROR 1242 (21000): Subquery returns more than 1 row的错误,导致查询内容为空

与时间盲注配合使用

格式:

order by if(表达式,sleep(1),1)
  • 表达式为true时,延迟显示

  • 表达式为false时,正常显示

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

与rand()函数配合使用

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

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

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

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

order by rand(表达式)

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

select * from users order by rand(ascii(mid((select database()),1,1))>114)
select * from users order by rand(ascii(mid((select database()),1,1))>115)

 

与报错注入配合使用

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,则页面正常显示

到此order by注入就和大家一起学习完毕了,后面还会和大家分享更多的SQL注入的技巧和实验,我们后面再见(^▽^) 

SQL注入中,"ORDER BY"是一种常用的攻击手法之一。它通常用于利用应用程序对SQL查询结果的排序方式进行操作,从而获取额外的信息或者绕过安全措施。 "ORDER BY"子句用于对查询结果进行排序。它可以按照一个或多个列进行排序,并指定升序(ASC)或降序(DESC)。在正常情况下,应用程序会根据用户的选择或者默认设置来构建"ORDER BY"子句。 然而,在SQL注入攻击中,攻击者可以通过构造恶意输入来修改"ORDER BY"子句,以达到他们的目的。以下是一些常见的SQL注入中的"ORDER BY"攻击技巧: 1. 利用错误消息:攻击者可以通过在"ORDER BY"子句中使用不存在的列名或者无效的排序方式来触发错误消息。这些错误消息可能会泄露数据库的结构信息,如表名、列名等。 2. 盲注攻击:攻击者可以通过使用布尔逻辑来判断某个条件是否成立,从而逐位地猜测查询结果。例如,通过使用"ORDER BY"子句来判断某个列的值是否大于或小于某个特定值。 3. 时间延迟攻击:攻击者可以通过在"ORDER BY"子句中使用时间延迟函数,如SLEEP()或BENCHMARK(),来延长查询的执行时间。这可以用于判断某个条件是否成立,或者用于拖慢应用程序的响应时间。 为了防止SQL注入攻击中的"ORDER BY"攻击,开发人员应该采取以下措施: 1. 使用参数化查询或预编译语句:这可以防止攻击者通过注入恶意代码来修改"ORDER BY"子句。 2. 输入验证和过滤:对用户输入进行严格的验证和过滤,确保只允许合法的输入。 3. 最小权限原则:将数据库用户的权限限制在最小必需的范围内,以减少攻击者可以利用的漏洞。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未知百分百

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值