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
相关产品推荐
相关产品推荐

