在利用SQL 注入(inject) 期间,我遇到了类似负载的奇怪行为:
test' AND SLEEP(5))#
- 无效1test' AND SLEEP(5))#
- 有效
我调查了问题,似乎在 (My)SQL 中进行转换可能是意外的:
以下表达式的结果为 0:
- 1 和“0”
- 1 和“00”
- 1 和 'x'
- 1 和 'xx'
- 1 和 'x0'
- 1 和 'x1'
- 1 和“0x”
这些结果为 1:
- 1 和 '1'
- 1 和“11”
- 1 和“1x”
您可以使用 fiddle 来验证它.
我想知道这种行为背后的原因是什么。是否记录在案或对此有任何引用?
最佳答案
您似乎有一个 where
条件,例如:
where 'test' and sleep(5)
这很荒谬,不是吗? bool 表达式应该所在的字符串。如果您是一个数据库,那么正确的做法是返回“'test' 在这里没有意义!”这种错误。
但是,MySQL 更加慷慨和宽容。相反,它将字符串视为一个数字 并进行静默转换。因为该数字没有前导数字,所以转换生成 0
。 bool 上下文中允许使用数字。 0
恰好是表示“false”的数字方式。
所以,
where 'test' and sleep(5)
评估为:
where false and sleep(5)
“false”使 和
短路,不计算第二个表达式。
同样,
where '1test' and sleep(5)
评估为:
where true and sleep(5)
没有短路,第二个表达式被计算。
关于mysql - MySQL 如何将字符串转换为 bool 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49208823/