5

在我开始之前,我意识到我正在尝试的东西是奇怪的和骇人听闻的。这只是一个孤立的渗透测试,特别是 SQL 注入。

我需要做的是编写一个 SQL 语句,它在 MySQL 数据库上执行时的行为与在 SQL Server 数据库上执行时的行为不同。

编辑

我可以构建的查询的限制是我只能更改“WHERE id =”子句之后的内容。我不能影响查询的任何其他部分。具体来说,我需要能够将仅由 SQL 服务器执行的“UNION SELECT * FROM some_other_table”附加到我输入的末尾。

这显然会炸毁 MySQL,因为它没有我正在合并的表。

具体来说:

SELECT * FROM USERS 
WHERE id = My input -> (MySQL code: 'x' or 1=1 )
                       (MSSQL code 'x' or 1=1 UNION SELECT * FROM table)

问题是,如果任一语句被数据库执行,它并不意味着它会爆炸(而不是以我需要的方式)。

这导致我在 MySQL 中发现了 Conditional/Executable Comments

SELECT * FROM USERS 
WHERE id = /*! This will be executed but only by mysql */

太好了,但我仍然无法阻止 MySQL 执行 MSSQL!我只能阻止 MSSQL 执行 MySQL 代码。

我最初的想法是在 MySQL 条件中添加一条评论,例如:

SELECT * FROM USERS
WHERE id = /*! 4 or 1=1 --*/ MSSQL code that is ignored by mysql

但这会引发一个错误,说要在“”附近没有任何内容的行检查我的语法。

我不完全理解为什么这不起作用,但我知道不适用于我所知道的任何形式的 MySQL 注释(已尝试 #,/*)。

有没有办法让我奇怪的 SQL 语句工作?或者有没有办法在 MSSQL 中进行条件注释?我真的只需要 MySQL 在有条件的情况下忽略任何内容,但我不知道如何在没有评论的情况下做到这一点。

4

1 回答 1

1

我不确定这是否是您所需要的,但如果我理解正确,您想要一个 SQL 语句在 MySQL 和 SQL Server 上返回不同的结果(如果这就是“行为不同”的意思?)。如果是这样,一个起点是使用具有相同名称和语法但行为不同的系统函数,例如SUBSTRING()

select substring('test', -1, 1)

在返回空字符串的 SQL Server 上,但在 MySQL 上返回t. 我不知道 usingSUBSTRING()在您的情况下是否可行,但如果不是,您也许可以找到另一个更易于在查询中使用的功能。

如果这根本没有帮助,那么我建议您提供更多详细信息,说明您在构建查询时有哪些限制。

于 2012-11-15T19:50:59.703 回答