-1

在 hakipedia 上通过 sql 注入,我知道注入被假定为沿着一个参数(它成为服务器端 sql 查询的一部分)。

例如

select news from news_table where id=1

被攻击为

select news from news_table where id=NULL UNION ALL select * from users

但是,在信息模式(http://hakipedia.com/index.php/SQL_Injection#INFORMATION_SCHEMA)和 Mysql Benchmark(http://hakipedia.com/index.php/SQL_Injection#MySQL_BENCHMARK)注入向量中,UNION ALL 之前的 NULL 是没有明确说明。这是正确的还是我错过了什么?

4

3 回答 3

3

NULL仅用于使起始查询有效。这些可能只是用作起点的示例。您可能需要针对不同的查询调整攻击。例如,如果查询以字符串参数结尾:

... where id = 'abc'

代码可能如下所示:

"... where id = '${id}'"

攻击需要正确终止该语句以使其成为有效的 SQL。像这样的东西可能会起作用:

' UNION ALL select * from users --

这将导致:

... where id = '' UNION ALL select * from users --'

NULL 示例在这里可能不起作用。它会导致这样的事情:

... where id = 'NULL UNION ALL select * from users'
于 2013-05-05T13:46:19.257 回答
1

UNION 之前的 NULL 确保结果集中没有新闻,因为 news_table 中不应该有任何没有 id 集的行,即id=NULL。您也可以尝试 -1 而不是 NULL。

于 2013-05-05T13:45:33.743 回答
1

不,我相信您误解了上述查询中 NULL 的用途。查询的目的只是从新闻表中返回所选文章的新闻列。Hacker 提供一个 NULL 值,它从不等于任何值,因此第一个查询不会返回一行。作为 hack 提供的参数的一部分,他们尝试从 users 表返回结果。假设 id 的值是整数的正数集,提供一个攻击字符串-1 UNION ALL select * from users会做同样的事情。

除非它是已知架构的 COTS 产品,否则一旦您发现站点容易受到注入攻击,下一步就是弄清楚底层 RDBMS 是什么以及可用的数据。基准测试将是我用来查看通常是即时的 Web 响应现在是否需要 5、10、30 秒。这告诉我我有一个好主意,这是一个 MySQL 目标。

下一个挑战是获取数据。在上面,只返回一列数据,但我们已经请求了所有列。这不会编译,至少在 SQL Server 世界中是这样,因为引擎会看到第一个返回 1 列,第二个返回 N 列。相反,您需要有选择地返回列或将它们连接在一起。

如果您只是走恶意路线,这会更容易,因为您所做的只是替换您的删除/删除命令,而不必担心将受攻击的输出塑造成预定义的形状。

于 2013-05-05T13:51:54.083 回答