SQL注入 - BadStore.net

时间:2015-10-03 22:18:57

标签: sql security sql-injection

我正在研究软件安全的一些主题,我找到了这个网站: http://teachcryptography.blogspot.com.br/2015/03/badstore-funway-of-exploiting-web.html

我试图在快速项目搜索表单中使用SQL注入泄漏数据。 这是查询:

"SELECT itemnum, sdesc, ldesc, price FROM itemdb WHERE '$squery' IN
(itemnum,sdesc,ldesc)";

我通过此输入获得了正确的答案:1=1'/*但输入'-'也是正确的。有人可以向我解释原因吗?

1 个答案:

答案 0 :(得分:2)

字符串'-'(单引号,连字符,单引号)起作用,因为某些RDBMS的整数到字符串转换行为。由于你发布的内容看起来像PHP代码,我将假设所涉及的数据库是MySQL。

在MySQL中,强制转换为整数的非数字字符串将导致零。此外,尝试对两个字符串进行算术运算将首先使它们被转换为整数。因此,让我们看看替换值后的字符串:

WHERE ''-'' IN (itemnum, sdesc,ldesc)

MySQL会尝试对两个空字符串''进行减法,所以字面意思是:'' minus ''。要实现这一点,首先必须将它们转换为整数,这些整数为零(0-0=0)。现在看起来像:

WHERE 0 IN (itemnum, sdesc,ldesc)

出于同样的原因,非数字字符串转换为零,这次MySQL会将varcharsdesc, ldesc转换为整数。除非他们以数字开头,否则该演员的结果为零。来自0的{​​{1}}然后有效,因为''-''将匹配任何列出的列,并且IN()已全部转换为等效的varchar

这是MySQL在字符串上尝试算术:

0

这是MySQL将空字符串转换为0:

> select ''-'';
+-------+
| ''-'' |
+-------+
|     0 |
+-------+

最后,这里的MySQL返回 > select CAST('' AS SIGNED); +--------------------+ | CAST('' AS SIGNED) | +--------------------+ | 0 | +--------------------+ ,因为整数TRUE匹配字符串值:

0