在我开始之前,我意识到我正在尝试的东西是奇怪的和骇人听闻的。这只是一个孤立的渗透测试,特别是 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 在有条件的情况下忽略任何内容,但我不知道如何在没有评论的情况下做到这一点。