詳細な分析を与えられる注入の床()メソッドのmysql

ただ、SQLインジェクションを学び始め、テーブル群から選択数(*)を満たした床で(RAND(0)* 2); そのような記述。ここで要約すること。
(アクセスより良い読書体験こちら

まず第一に、限り、文は明らかなように、その後、同様のselect count(*),(floor(rand(0)*2))x from table group by x;ように変形文は基本的に(ここでの唯一のエイリアスを果たす)作業することができます。
基本的なクエリは言うまでもなく選択し、いくつかの残りのキーワード数、床、グループによって、ランドがあります 。

いくつかの重要な機能を説明

ランド(0)* 2

ランド()は、0と1の間の乱数を生成することができます。

目に見える、ない同じたびに生成します。私たちは、シードパラメータ0を提供すると、再び次を参照してください。

見つけることができ、その都度生成された値は同じです。また、擬似乱数(生成されたデータが予測されている)と呼ぶことができます。
見て、より多くのデータを表示します。(私が作成する前にテストデータ・テーブルには9を持っています)

他のデータと一致したデータのちょうど単一のビューでの最初のデータがまったく同じであるが見つかりました。
なぜそれを2で乗算されますか?これは、床に必要な機能です。

床(RAND(0)* 2)

床()は以下の値に等しい最大の整数を返します。
我々が学習する前に、0と1の間の乱数を返す関数rand()は、2つの数値を製造することができるかを決定するために一緒に床()を用いて、2つの戻り0と2の間のランダムな番号の後に自然に掛けます。これは、0と1です。

なぜ、これらの2つの数字がありますか?

与回数によってグループ(*)

カウントに関連して本明細書で使用されるパケットデータ(同一のグループ化された)のために使用主によってグループ()。例えば、クリアします。

これは、繰り返しデータの統合のためにここで観察した後、カウントすることができます。

重点来了,也就是在这个整合然后计数的过程中,中间发生了什么我们是必须要明白的。
经过网上查询,发现mysql遇到该语句时会建立一个虚拟表。该虚拟表有两个字段,一个是分组的 key ,一个是计数值 count(*)。也就对应于上个截图中的 prod_price 和 count(*)。
然后在查询数据的时候,首先查看该虚拟表中是否存在该分组,如果存在那么计数值加1,不存在则新建该分组。

报错分析

rand()的特殊性

select count(*) from test group by floor(rand(0)*2);

而又因为 rand 函数的特殊性(如果使用rand()的话,该值会被计算多次)。
在这里的意思就是,group by 进行分组时,floor(rand(0)*2)执行一次(查看分组是否存在),如果虚拟表中不存在该分组,那么在插入新分组的时候 floor(rand(0)*2) 就又计算了一次。(其实在上述 rand(0) 产生多个数据的时候,也能观察出来。只要 rand(0) 被调用,一定会产生新值)。

这样,所有的理论细节就全部明朗了。

报错

还记得我们之前产生的疑问,为什么要用 floor(rand(0)*2 产生 0 和 1 这两个数吗?

当 group by 对其进行分组的时候,首先遇到第一个值 0 ,发现 0 不存在,于是需要插入分组,就在这时,floor(rand(0)*2)再次被触发,生成第二个值 1 ,因此最终插入虚拟表的也就是第二个值 1 ;然后遇到第三个值 1 ,因为已经存在分组 1 了,就直接计数加1(这时1的计数变为2);遇到第四个值 0 的时候,发现 0 不存在,于是又需要插入新分组,然后floor(rand(0)*2)又被触发,生成第五个值 1 ,因此这时还是往虚拟表里插入分组 1 ,但是,分组 1 已经存在了!所以报错!

总结

可见,floor(rand(0)*2的作用就是产生预知的数字序列01101,然后再利用 rand() 的特殊性和group by的虚拟表,最终引起了报错。

参考:Mysql报错注入原理分析(count()、rand()、group by)

おすすめ

転載: www.cnblogs.com/sfriend/p/11365999.html