MySQL 注入(inject) - 使用 SELECT 查询来更新/删除

标签 mysql security select code-injection sql-delete

我有一个简单的问题:假设有一个网站有这样的查询:
SELECT id, name, message FROM messages WHERE id = $_GET['q'] .

有没有办法在数据库(MySQL)中更新/删除某些内容?到目前为止,我从未见过能够使用 删除/更新的注入(inject)。 SELECT 查询 ,所以,这甚至可能吗?

最佳答案

在直接回答问题之前,值得注意的是,即使攻击者所能做的只是读取他不应该读取的数据,这通常仍然很糟糕。考虑使用 JOIN s 和 SELECT来自系统表(如 mysql.innodb_table_stats ),一个以 SELECT 开头的攻击者注入(inject)并且没有其他数据库知识可以映射您的架构,然后泄露您在 MySQL 中拥有的全部数据。对于绝大多数数据库和应用程序来说,这已经代表了一个灾难性的安全漏洞。

但是直接回答这个问题:我知道有几种方法可以通过哪种方式注入(inject) MySQL SELECT可用于修改数据。幸运的是,它们都需要合理的异常情况才能成为可能。下面的所有示例注入(inject)都是相对于问题中的示例可注入(inject)查询给出的:

SELECT id, name, message FROM messages WHERE id = $_GET['q']

1.“堆叠”或“批量”查询。

经典的注入(inject)技术,在被注入(inject)的语句之后放置一个完整的其他语句。正如 another answer here 中所建议的, 你可以设置 $_GET['q']1; DELETE FROM users; --以便查询形成两个连续执行的语句,其中第二个语句删除 users 中的所有内容。 table 。

在缓解

大多数 MySQL 连接器 - 特别是包括 PHP(已弃用)mysql_*和(未弃用)mysqli_*功能 - 根本不支持堆叠或批量查询,所以这种攻击是行不通的。但是,有些是这样做的——特别是包括 PHP 的 PDO 连接器(尽管支持 can be disabled to increase security)。

2. 利用用户定义的函数

可以从 SELECT 调用函数, 并且可以改变数据。如果数据库中已经创建了数据修改函数,则可以使 SELECT调用它,例如通过 0 OR SOME_FUNCTION_NAME()作为 $_GET['q'] 的值.

在缓解

大多数数据库不包含任何用户定义的函数——更不用说改变数据的函数了——因此根本没有机会执行这种利用。

3. 写入文件

正如 Muhaimin Dzulfakar 的(有点冒昧地命名)论文 Advanced MySQL Exploitation 中所述,您可以使用 INTO OUTFILEINTO DUMPFILE MySQL select 上的子句将结果转储到文件中。因为,通过使用 UNION , 任意结果都可以是 SELECT ed,这允许在用户运行的任何位置写入具有任意内容的新文件 mysqld可以访问。可以想象,这不仅可以用来修改 MySQL 数据库中的数据,还可以用来获取对运行它的服务器的 shell 访问权限 - 例如,通过将 PHP 脚本写入 webroot 然后向它​​发出请求,如果MySQL 服务器与 PHP 服务器共同托管。

在缓解

许多因素降低了这种听起来令人印象深刻的攻击的实际可利用性:
  • MySQL 永远不会让你使用 INTO OUTFILEINTO DUMPFILE覆盖现有文件,也不写入不存在的文件夹。这可以防止诸如创建 .ssh 之类的攻击。 mysql 中带有私钥的文件夹用户的主目录,然后通过 SSH 连接或覆盖 mysqld二进制本身带有恶意版本并等待服务器重启。
  • 任何半途而废的安装包都会设置一个特殊用户(通常名为 mysql )来运行 mysqld ,并仅授予该用户非常有限的权限。因此,它不应该能够写入文件系统上的大多数位置——当然也不应该通常能够执行诸如写入 Web 应用程序的 webroot 之类的操作。
  • MySQL 的现代安装附带 --secure-file-priv 默认设置,防止 MySQL 写入指定数据导入/导出目录以外的任何地方,从而使这种攻击几乎完全无效……除非服务器的所有者故意禁用它。幸运的是,没有人会完全禁用这样的安全功能,因为这显然是 - oh wait never mind .

  • 4. 拨打 sys_exec()函数来自 lib_mysqludf_sys运行任意 shell 命令

    有一个名为 lib_mysqludf_sys 的 MySQL 扩展那 - 从它的星星来看on GitHuba quick Stack Overflow search - 至少有几百个用户。它添加了一个名为 sys_exec 的函数运行shell命令。如#2 中所述,可以从 SELECT 中调用函数。 ;其影响是显而易见的。引自 the source ,此功能“可能存在安全隐患”。

    在缓解

    大多数系统没有安装这个扩展。

    关于MySQL 注入(inject) - 使用 SELECT 查询来更新/删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5759603/

    相关文章:

    mysql - 我如何在 mySQL 表中只显示日期而不显示时间?

    mysql - 如何删除早于某一年的行?

    security - 如何在多个位置重复使用 NGINX 代理设置

    spring - Spring中的错误NoSuchFieldException是什么意思?

    sql - 在 SQL 中使用两个 DISTINCT 语句

    php - 计算两个时间之间的差异()

    mysql - 如何搜索两个表

    java - Spring boot项目如何保存DB用户名和密码

    javascript - AngularJS - <select> 标签中的下拉菜单问题,使用 ng-option 时不能有 2 个自定义选项

    带有 WHERE 子句的 MySQL SELECT 查询返回的结果不严格相等