在利用 SQL注入期间,我遇到了类似有效负载的奇怪行为:
test' AND SLEEP(5))#
- 没有工作1test' AND SLEEP(5))#
- 工作我调查了问题,似乎在(My)SQL中强制转换可能是意外的:
以下表达式导致0:
这些导致1:
您可以使用fiddle进行验证。
我想知道这种行为背后的原因是什么。是记录在案还是对此有任何参考?
答案 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)
我们只是遇到了类似的问题,并且经过了一些修补,我们发现了支票的工作原理。
似乎在执行以下步骤期间将字符串评估为布尔值时: