SQL 注入 - BadStore.net

SQL inject - BadStore.net

我正在研究软件安全的一些主题,我发现了这个网站: 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'/* 但输入 '-' 也是正确的。有人可以向我解释为什么吗?

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

在 MySQL 中,将非数字字符串转换为整数将导致零。此外,尝试对两个字符串进行算术运算将首先导致它们被转换为整数。那么我们来看一下值代入后的字符串:

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

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

WHERE 0 IN (itemnum, sdesc,ldesc)

出于与非数字字符串强制转换为零的相同原因,这次 MySQL 会将 varcharsdesc, ldesc 强制转换为整数。除非它们以数字开头,否则该转换的结果为零。 ''-'' 中的 0 然后起作用,因为 IN() 将匹配任何列出的列,并且 varchar 已全部转换为等效的 0.

这里是 MySQL 尝试对字符串进行算术运算:

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

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

 > select CAST('' AS SIGNED);
+--------------------+
| CAST('' AS SIGNED) |
+--------------------+
|                  0 |
+--------------------+

最后,MySQL 返回 TRUE,因为整数 0 匹配字符串值:

> SELECT 0 IN (123, 'abc', 'def');
+--------------------------+
| 0 IN (123, 'abc', 'def') |
+--------------------------+
|                        1 |
+--------------------------+