【问题标题】:Select more tables after FROM statement?在 FROM 语句后选择更多表?
【发布时间】:2009-09-03 00:26:09
【问题描述】:

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

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

$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**

这是否合理?

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

【问题讨论】:

  • 您是在问如何进行 SQL 注入或如何防止它?
  • 如何构建 SQL 注入查询

标签: php sql mysql


【解决方案1】:

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

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

但仅此而已。

【讨论】:

  • 是的,谢谢。那么有没有办法做到这一点呢?我可能会发布一个 MySQL 错误。 xD
  • @Jose:这不是 MySQL 的问题。 PHP 驱动模块根本不支持它。
  • 你实际上可以在一个查询中从多个表中删除,但它们必须在 FROM 子句中指定(在 WHERE 之后为时已晚)。 PHP 配置不允许在一次调用中进行多个查询,其他语言可能更宽松。
  • @Jose:其他模块,例如 MySQLi,确实支持这一点。见 MySQLi 的multi_query():php.net/manual/en/mysqli.multi-query.php
  • @zombat 是的,但您实际上可以启用它:dev.mysql.com/doc/refman/5.1/en/mysql-set-server-option.html
【解决方案2】:

也许我没有完全理解这个问题,但我想知道的是,您正在将 SQL 命令构建为字符串并直接针对 MySQL 数据库运行该字符串。

您可以使用命令分隔符(通常是“;”)分隔多个命令,因此您可以运行几乎任何您想要的命令,正如 this comic 恰当地说明的那样。

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

【讨论】:

  • 大声笑,这很有趣 xD。但回到我们的业务,分号在 MySQL API(PHP 使用)中不起作用,因此无法运行“多个”命令。
  • 是的,这个答案在技术上是不正确的。用于 PHP 的标准 MySQL 驱动程序模块不支持查询中的多个语句,因此您的数据库设置是什么或用什么分隔语句都无关紧要。然而,其他模块对此也有支持,例如 MySQLi 的 multi_query()。
  • 好吧,实际上它支持它,如果它被启用。
【解决方案3】:

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

mysql_query() 发送一个唯一的查询 (不支持多个查询) 到当前活动的数据库 与 指定链接标识符。

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

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

【讨论】:

  • 是的,谢谢,虽然它并没有真正造成破坏,但正如我所提到的,它是安全试镜的一部分:P
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-03
  • 2013-06-07
  • 2021-08-25
相关资源
最近更新 更多