Wil*_*don 5 mysql sql sql-server penetration-testing
在开始之前,我意识到我正在尝试的是奇异而骇人的行为。它仅用于隔离笔测试,特别是SQL Injection。
我需要做的是编写一条在MySQL数据库上执行与在SQL Server数据库上执行时行为不同的SQL语句。
我可以构建的查询的局限性在于,我只能更改“ WHERE id =”子句之后的内容。我不能影响查询的任何其他部分。具体来说,我需要能够将仅由SQL Server执行的“ 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)
Run Code Online (Sandbox Code Playgroud)
问题是,如果其中任何一条语句被原本不是由数据库执行的,它都会炸毁(而不是我需要的方式)。
SELECT * FROM USERS
WHERE id = /*! This will be executed but only by mysql */
Run Code Online (Sandbox Code Playgroud)
很好,但是我仍然无法阻止MySQL执行MSSQL!我只能阻止MSSQL执行MySQL代码。
我最初的想法是在MySQL条件语句中添加一条注释,例如:
SELECT * FROM USERS
WHERE id = /*! 4 or 1=1 --*/ MSSQL code that is ignored by mysql
Run Code Online (Sandbox Code Playgroud)
但这引发了一个错误,要求检查我的语法在“”附近没有任何一行。
我不完全理解为什么这行不通,但我知道不适用于我所知的任何形式的MySQL注释(尝试#,/ *)。
有没有办法让我奇怪的SQL语句起作用?还是有一种方法可以在MSSQL中进行条件注释?我真的只需要MySQL在有条件的情况下忽略任何东西,但是我不知道如何在没有注释的情况下实现这一点。
我不确定这是否是您所需要的,但如果我理解正确的话,您需要一个在 MySQL 和 SQL Server 上返回不同结果的 SQL 语句(如果这就是“行为不同”的意思?)。如果是这样,可以从使用具有相同名称和语法但行为不同的系统函数开始,例如SUBSTRING():
select substring('test', -1, 1)
Run Code Online (Sandbox Code Playgroud)
在 SQL Server 上返回空字符串,但在 MySQL 上返回t. 我不知道 usingSUBSTRING()在您的情况下是否可行,但如果不可行,您也许可以找到另一个在查询中更容易使用的函数。
如果这根本没有帮助,那么我建议您提供一些有关构建查询时的限制的更多详细信息。