我正在研究软件安全的一些主题,我找到了这个网站: 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'/*
但输入'-'
也是正确的。有人可以向我解释原因吗?
答案 0 :(得分:2)
字符串'-'
(单引号,连字符,单引号)起作用,因为某些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
的{{1}}然后有效,因为''-''
将匹配任何列出的列,并且IN()
已全部转换为等效的varchar
。
这是MySQL在字符串上尝试算术:
0
这是MySQL将空字符串转换为0:
> select ''-'';
+-------+
| ''-'' |
+-------+
| 0 |
+-------+
最后,这里的MySQL返回 > select CAST('' AS SIGNED);
+--------------------+
| CAST('' AS SIGNED) |
+--------------------+
| 0 |
+--------------------+
,因为整数TRUE
匹配字符串值:
0