You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL字符串转布尔规则探究及SQL注入异常Payload分析

MySQL字符串转布尔逻辑:为什么你的SQL注入Payload表现不一致?

问题本质拆解

你碰到的这个差异,核心原因是MySQL在布尔运算场景下对字符串的隐式数值转换规则。当字符串参与AND/OR这类布尔逻辑运算时,MySQL会自动把字符串转成数值,再判断真假——这就是'test'和'1test'表现天差地别的根源。

具体转换规则详解

我们把你测试的情况对应到规则里,就一目了然了:

  • 以数字开头的字符串:MySQL会提取开头连续的数字部分转成数值,后面的非数字内容直接忽略。所以:
    • '1test'、'11'、'1x'都会被转成1(布尔值为真),和SLEEP(5)做AND运算时,会触发延迟
  • 不以数字开头的字符串:不管内容是什么,直接转成0(布尔值为假)。比如:
    • 'test'、'x'、'x0'、'0x'全转成0,和SLEEP(5)做AND时,因为逻辑与的短路特性,SLEEP(5)根本不会执行
  • 纯数字的非1字符串:比如'0'、'00',自然转成0,布尔值为假,同样不会触发后续逻辑

官方文档的明确说明

MySQL官方文档专门在**「Type Conversion in Expression Evaluation」**章节里定义了这个规则,核心描述是:

当字符串在数值上下文中使用时,MySQL会将其转换为数值。转换从字符串起始位置开始:如果字符串以非数字字符开头,转换结果为0;如果以数字开头,则提取连续的数字字符(直到遇到非数字字符)并转换为对应数值。

这个规则是MySQL类型系统的基础特性,所有涉及字符串与数值混合运算的场景都会遵循它。

对SQL注入测试的小提示

知道这个规则后,以后构造布尔盲注的Payload时就能更精准:

  • 要让字符串在布尔条件中为真,记得让它以非0数字开头(比如'1abc')
  • 如果字符串开头是非数字,直接会被判定为假,后续的时间延迟、报错等逻辑都不会触发

内容的提问来源于stack exchange,提问作者andrzej1_1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:51:44