' 1=1 GROUP BY CONCAT_WS ('~',version(), FLOOR(rand(0)*2)) having min(0)
1>>我的第一个问题是CONCAT
这个查询中使用的函数是什么
2>>以及为什么我们min(0)
在这里使用have in。
' 1=1 GROUP BY CONCAT_WS ('~',version(), FLOOR(rand(0)*2)) having min(0)
1>>我的第一个问题是CONCAT
这个查询中使用的函数是什么
2>>以及为什么我们min(0)
在这里使用have in。
好吧,让我们剖析一下:
CONCAT_WS
- 与分隔符连接。version()
- 返回 MySQL 的版本。FLOOR(rand(0)*2)
- 发出以下数字序列:0, 1, 1, 0, 1, ...having min(0)
- 就其本身而言,这是非法的,因为该HAVING
条款需要一个条件。这一点,以及最后没有的事实; --
意味着注入在最后期待一个条件。因此,这会将版本字符串和一组数字连接起来。group 子句的数字序列源自FLOOR(rand(0)*2)
.
问题GROUP
是它需要唯一的组键。由于version()
每次都将返回相同的值,将其与FLOOR(rand(0)*2)
三次的输出连接起来将产生两个不同的数字 (0, 1),然后是 1 的第二个实例,这会导致错误(组键的重复条目),并显示回给用户。该错误看起来像这样:
键 'group_key' 的重复条目 '5.6.24-1~1'
这会导致版本号作为基于错误的 SQL 注入攻击的一部分在响应中泄露回来。然后可以将其扩展以执行其他攻击。
至于攻击者为什么选择FLOOR(rand(0)*2)
,这是一个非常简单的表达式,它是可靠的(该rand()
函数是一个 PRNG,它带有一个种子参数;相同的种子总是产生相同的序列)并且可以相对较快地满足重复输出的要求。您可以选择 0 以外的值,它仍然可以工作。