这篇文章指出了MySQL的以下安全问题:
USERS
id | email | password_reset_token
1 | one@example.com | QTlXww)uV!Hdg3U6aGwKV2FPvAqzVgPx
2 | two@example.com | CZor5t7WbX#LTeqiG3v@6f3@z#)BfK*n在这里,我们有一个很好的,随机的标记,用户必须证明他们有,以重置他们的帐户。但是用户设法提交了0的重置令牌,因此我们运行以下查询:
SELECT * FROM `users` WHERE `email` = 'one@example.com' AND `password_reset_token` = 0为了进行比较,MySQL将令牌VARCHAR转换为INT。它考虑不以数字开头的VARCHAR等于0。因此,攻击者可以匹配任何非数字字符串并接管帐户.
即使重置令牌启动了一些数字,情况也不会好多少。MySQL在进行此比较时忽略了所有字符,但忽略了初始值,因此它认为12blahblah3blah4等于12,这使得猜测变得更加容易。
我可以将MySQL配置为不进行这种类型的类型转换吗?例如,如果它将INT转换为VARCHAR而不是反之亦然,则此攻击将无法工作。
如果查询是用'0'而不是0运行的,这是行不通的。本文从Rails接受XML的角度讨论了这个漏洞,其中type=integer属性说服Rails在查询中发送一个实际整数。
该bug已在Rails中得到修补;它现在将所有请求参数转换为字符串,因此它将永远不会构建带有整数的查询。但我仍然认为MySQL应该是可配置的,以防止出现这种情况。
发布于 2013-03-06 16:38:09
首先,如果您的结束查询是这样生成的,这似乎意味着您直接输入用户并将其粘贴到查询模板中,这本身就是sql注入的问题。此外,即使您这样做,查询模板需要在引号中,才能使charish输入的合法请求在语法上有效。
无论您的应用程序使用什么语言,ruby或其他语言,都会查找它们如何进行参数化查询和准备好的语句。API将为您处理所有正确的转义。
https://dba.stackexchange.com/questions/36078
复制相似问题