SQLi查询说明

时间:2013-01-14 10:10:22

标签: sql sql-injection

我是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';(查看',有效负载中最后一个后没有重音)

我怀疑是否明智?

任何帮助都将受到高度赞赏。

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变量
  • 传递的内容