MySQL如何将字符串转换为布尔值?
在利用SQL注入的过程中,我经历了类似有效负载的奇怪行为:MySQL如何将字符串转换为布尔值?,mysql,sql,Mysql,Sql,在利用SQL注入的过程中,我经历了类似有效负载的奇怪行为: test”和SLEEP(5))-不工作 1test'和SLEEP(5))-工作正常 我调查了这个问题,似乎在(我的)SQL中强制转换可能是意外的: 以下表达式导致0: 1和“0” 1及'00' 1和“x” 1和'xx' 1和'x0' 1和'x1' 1和“0x” 这些结果是1: 1和“1” 1及'11' 1和“1x” 您可以使用验证 我想知道这种行为背后的原因是什么。是否有相关文件记录或有任何参考资料?您可能会出现其中的情
-不工作test”和SLEEP(5))
-工作正常1test'和SLEEP(5))
- 以下表达式导致0:
- 1和“0”
- 1及'00'
- 1和“x”
- 1和'xx'
- 1和'x0'
- 1和'x1'
- 1和“0x”
- 这些结果是1:
- 1和“1”
- 1及'11'
- 1和“1x”
我想知道这种行为背后的原因是什么。是否有相关文件记录或有任何参考资料?您可能会出现
其中的情况,例如:
where 'test' and sleep(5)
这太可笑了,不是吗?布尔表达式应为的字符串。如果您是一个数据库,正确的做法是返回一个“test”在这里没有意义的错误
但是,MySQL更慷慨、更宽容。相反,它将字符串视为一个数字,并进行静默转换。因为数字没有前导数字,所以转换产生0
。布尔上下文中允许使用数字0
恰好是表示“false”的数字方式
所以
评估结果为:
where false and sleep(5)
where true and sleep(5)
“false”使和短路,并且未计算第二个表达式
同样地
where '1test' and sleep(5)
评估结果为:
where false and sleep(5)
where true and sleep(5)
没有短路,第二个表达式被计算。我们刚刚遇到了一个类似的问题,经过一点修补,我们发现了检查是如何工作的
在执行以下步骤的过程中,将字符串作为布尔值进行求值时:
查找第一个非数字字符并获取其前面的所有数字字符
若该数字的值高于零,则返回true,否则返回false
更好的注入方式是+符号'test'+SLEEP(5)
或'1test'+SLEEP(5)
始终执行。@RaymondNijland说得好!目前sqlmap工具缺少这种负载类型,所以我可能会准备它。我知道有这样的转换,但我询问了文档/参考。