0

我是 SQL 注入领域的初学者,如果你能帮助我,我会很高兴。

场景:易受攻击的 Web 应用程序。

假设你有一个这样的 URL:

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 之后没有重音)

我的怀疑合理吗?

任何帮助将不胜感激。

4

1 回答 1

4

易受此类攻击的应用程序将具有类似于以下的代码来构造 SQL 查询:

var query = "SELECT userid
FROM CMSUsers
WHERE user = '" + usernameValue + "' AND password = '" + passwordValue + "'";

请注意单引号的放置。用户通过passwordValue变量传递的所有内容都将插入到单引号内的该位置。

现在,要执行攻击,您需要尽早关闭密码的单引号,以便能够添加始终正确的部分。你会传递这样的东西:bar' OR '1' = '1. 请注意:开头或结尾没有单引号。这些来自应用程序中的硬编码查询字符串。

在上面的位置插入这个值会passwordValue产生以下结果:

... AND password = 'bar' OR '1' = '1'
<------- A --------><------- B ---->A
  • A:来自程序的硬编码内容
  • B: 通过passwordValue变量传递的内容
于 2013-01-14T10:18:10.450 回答