在FROM语句后选择更多表?

时间:2009-09-03 00:26:10

标签: php sql mysql

这是安全试听的一部分,因此无法“更改”查询。

基本上,我发现的是一个允许语句操作的缺陷,所以基本上它就像:

$query = "DELETE FROM `products` WHERE `products`.`whatever` = $variable";

这是PHP,因此据我所知,无法执行多个查询。使用这个SQL注入,我能够通过运行“0 OR 1 = 1#”来“清除”该表。

这很好用,但它不允许我选择更多的表来删除。

这是伪代码我想做的事情:

DELETE FROM `products` WHERE `products`.`whatever` = **0 OR 1=1, FROM `othertable` WHERE `othertable`.`othercolumn` = 0 OR 1=1**

无论如何这有可能吗?

如果这不可靠,还有其他方法可以使用吗?

3 个答案:

答案 0 :(得分:2)

对于同一个DELETE语句,不能有多个FROM子句,因此您无法完全按照自己的方式进行操作。如果MySQL数据库启用了“允许每个语句多个查询”,您可以尝试终止一个DELETE查询,然后再将另一个查询添加到最后,以便它看起来像这样:

DELETE FROM `products` WHERE `products`.`whatever` = **0 OR 1=1; DELETE FROM `othertable` WHERE `othertable`.`othercolumn` = 0 OR 1=1**

但那是关于它的。

答案 1 :(得分:2)

也许我并不完全理解这个问题,但我带走的是你正在构建一个SQL命令作为字符串并直接针对MySQL数据库运行该字符串。

您可以使用命令分隔符(通常为“;”)分隔多个命令,因此您可以运行几乎任何您想要的命令,如this comic所示。

如果您的数据库配置支持多个命令(或者将来如果有人更改了今天的设置),您需要确保没有命令分隔符作为输入的一部分。有关清理输入以防止此类攻击的建议,请参阅this article

答案 2 :(得分:1)

正如您所说,普通的MySQL驱动程序模块不支持多个查询。来自the manual for mysql_query

  

mysql_query()发送一个唯一的查询   (不支持多个查询)   到当前活动的数据库   与之关联的服务器   指定link_identifier。

不幸的是,对于您的注入工作,DELETE语法仅通过在FROM子句中指定它们来支持多个表删除。您注入的变量是WHERE的一部分,因此您可以做的最大损害是单个指定的表。

与流行的看法相反,您实际上可以从PHP运行多个MySQL语句,您只需使用不同的数据库驱动程序模块,如MySQLi。请参阅MySQLi::multi_query()

相关问题