MySQL如何将字符串转换为布尔值?

时间:2018-03-10 12:02:20

标签: mysql sql

在利用 SQL注入期间,我遇到了类似有效负载的奇怪行为:

  • test' AND SLEEP(5))# - 没有工作
  • 1test' AND SLEEP(5))# - 工作

我调查了问题,似乎在(My)SQL中强制转换可能是意外的:

  • 以下表达式导致0:

    • 1 AND' 0'
    • 1 AND' 00'
    • 1 AND' x'
    • 1 AND' xx'
    • 1 AND' x0'
    • 1 AND' x1'
    • 1 AND' 0x'
  • 这些导致1:

    • 1 AND' 1'
    • 1 AND' 11'
    • 1 AND' 1x'

您可以使用fiddle进行验证。

我想知道这种行为背后的原因是什么。是记录在案还是对此有任何参考?

2 个答案:

答案 0 :(得分:1)

您似乎有where条件,例如:

where 'test' and sleep(5)

这太荒谬了,不是吗?一个布尔表达式应该是的字符串。如果您是一个数据库,那么正确的做法是返回一个"' test'在这里没有意义!"。

但是,MySQL更慷慨和宽容。相反,它将字符串视为数字并执行静默转换。由于该数字没有前导数字,因此转换生成0。布尔上下文中允许使用数字。 0恰好是说" false"。

的数字方式

所以,

where 'test' and sleep(5)

评估为:

where false and sleep(5)

" false"将and短路,不评估第二个表达式。

同样,

where '1test' and sleep(5)

评估为:

where true and sleep(5)

没有短路,第二个表达式被评估。

答案 1 :(得分:1)

我们只是遇到了类似的问题,并且经过了一些修补,我们发现了支票的工作原理。

似乎在执行以下步骤期间将字符串评估为布尔值时:

  1. 查找第一个非数字字符并采用其前面的所有数字字符
  2. 如果该数字的值大于零,则返回true,否则返回false