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 会将 varchar
列 sdesc, 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 |
+--------------------------+
我正在研究软件安全的一些主题,我发现了这个网站: 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 会将 varchar
列 sdesc, 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 |
+--------------------------+