Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL如何将字符串转换为布尔值?_Mysql_Sql - Fatal编程技术网

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

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” 您可以使用验证 我想知道这种行为背后的原因是什么。是否有相关文件记录或有任何参考资料?您可能会出现其中的情

在利用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”
您可以使用验证


我想知道这种行为背后的原因是什么。是否有相关文件记录或有任何参考资料?

您可能会出现
其中
的情况,例如:

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工具缺少这种负载类型,所以我可能会准备它。我知道有这样的转换,但我询问了文档/参考。