为何双短横线(--)会使MariaDB的条件子句判定为真?
MySQL/MariaDB中无空格
--的解析规则及注入成功原因 核心规则说明
MySQL及其分支(包括MariaDB)对--注释的判定有严格要求:只有当--后面紧跟空格、换行或其他空白字符时,才会被识别为单行注释。如果--后面没有空白字符,它会被解析成两个连续的一元负号运算符,而非注释或字符串的一部分。
注入成功的具体逻辑
学生构造的查询语句是:
SELECT * FROM users WHERE username='admin' AND password=''--'';
其中password=''--''会被数据库解析成如下表达式:
password = ('' - (-''))
一步步拆解:
- 空字符串
''在与数字运算时,会被MySQL隐式转为数字0; - 连续的两个
-是一元负号,-''等价于-0,结果还是0; - 整个表达式简化为
password = 0 - 0,也就是password = 0; - 当字符串类型的密码(比如admin的
'S3cur3P4ssw0rd!')和数字0比较时,数据库会自动把字符串转成数字:如果字符串开头没有有效数字,转换结果就是0; - 这样
password = 0的判定结果为真,再加上username='admin'的条件,自然就能查询到admin用户。
对应测试用例的验证
结合给出的测试场景:
password='':直接匹配空字符串,和admin的非空密码不对应,返回0结果;password=''-- '':--后面有空格,被识别为注释,等价于password='',同样返回0结果;password=''--;:解析为password = '' - -;,;直接结束语句导致表达式缺少操作数(或视为匹配字符串--;),和admin密码不匹配,返回0结果;password=''--1;:解析为password = '' - -1,计算结果是1,admin密码转成数字是0,0≠1,条件不成立,返回0结果。
内容的提问来源于stack exchange,提问作者Wrench
相关产品推荐
相关产品推荐

