SQL 注入解释这个查询

信息安全 sql注入 mysql
2021-09-10 07:56:19
' 1=1 GROUP BY CONCAT_WS ('~',version(), FLOOR(rand(0)*2)) having min(0)

1>>我的第一个问题是CONCAT这个查询中使用的函数是什么

2>>以及为什么我们min(0)在这里使用have in。

1个回答

好吧,让我们剖析一下:

  • 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 以外的值,它仍然可以工作。