我是SQL注入领域的初学者,如果你能帮助我,我很高兴。
场景:易受攻击的网络应用程序。
假设您有这样的网址:
http://www.site1.com/cms/login.php
另外假设为了访问该站点,您必须提供以下凭据:
用户名:foo,密码:bar
因此,上面的URL变为:
http://www.site.com/cms/login.php?username=foo&password=bar
如果您随后注入有效负载'OR'1'='1
,则更改为:
http://www.site.com/cms/login.php?username=foo&password=bar'OR'1'='1
这对我来说已经足够清楚,但我担心的是我被告知相应的 SQL查询(由后端RDBMS处理的查询)应为:
SELECT userid
FROM CMSUsers
WHERE user = 'foo'AND password = 'bar' OR'1'='1';
该查询是重言式,因为'1'='1'
始终为TRUE。
但有效负载为'OR'1'='1
且查询的条件语句似乎不同OR'1'='1';
(查看'
,有效负载中最后一个后没有重音)
我怀疑是否明智?
任何帮助都将受到高度赞赏。
答案 0 :(得分:4)
易受此类攻击攻击的应用程序将具有类似于以下内容的代码来构造SQL查询:
var query = "SELECT userid
FROM CMSUsers
WHERE user = '" + usernameValue + "' AND password = '" + passwordValue + "'";
请注意放置单引号。用户将通过passwordValue
变量传递的所有内容都将插入单引号内的该位置。
现在,要执行攻击,您需要尽早关闭密码的单引号,以便能够添加始终为true的部分。你会传递这样的内容:bar' OR '1' = '1
。请注意:开头或结尾没有单引号。它们来自应用程序中的硬编码查询字符串。
在上面的passwordValue
位置插入此值会产生以下结果:
... AND password = 'bar' OR '1' = '1'
<------- A --------><------- B ---->A
A
:程序中的硬编码内容B
:通过passwordValue
变量