我有一个简单的问题:假设有一个网站有这样的查询: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 OUTFILE
或 INTO DUMPFILE
MySQL select 上的子句将结果转储到文件中。因为,通过使用 UNION
, 任意结果都可以是 SELECT
ed,这允许在用户运行的任何位置写入具有任意内容的新文件 mysqld
可以访问。可以想象,这不仅可以用来修改 MySQL 数据库中的数据,还可以用来获取对运行它的服务器的 shell 访问权限 - 例如,通过将 PHP 脚本写入 webroot 然后向它发出请求,如果MySQL 服务器与 PHP 服务器共同托管。在缓解
许多因素降低了这种听起来令人印象深刻的攻击的实际可利用性:
INTO OUTFILE
或 INTO DUMPFILE
覆盖现有文件,也不写入不存在的文件夹。这可以防止诸如创建 .ssh
之类的攻击。 mysql
中带有私钥的文件夹用户的主目录,然后通过 SSH 连接或覆盖 mysqld
二进制本身带有恶意版本并等待服务器重启。 mysql
)来运行 mysqld
,并仅授予该用户非常有限的权限。因此,它不应该能够写入文件系统上的大多数位置——当然也不应该通常能够执行诸如写入 Web 应用程序的 webroot 之类的操作。 --secure-file-priv
默认设置,防止 MySQL 写入指定数据导入/导出目录以外的任何地方,从而使这种攻击几乎完全无效……除非服务器的所有者故意禁用它。幸运的是,没有人会完全禁用这样的安全功能,因为这显然是 - oh wait never mind . 4. 拨打
sys_exec()
函数来自 lib_mysqludf_sys
运行任意 shell 命令有一个名为
lib_mysqludf_sys
的 MySQL 扩展那 - 从它的星星来看on GitHub和 a quick Stack Overflow search - 至少有几百个用户。它添加了一个名为 sys_exec
的函数运行shell命令。如#2 中所述,可以从 SELECT
中调用函数。 ;其影响是显而易见的。引自 the source ,此功能“可能存在安全隐患”。在缓解
大多数系统没有安装这个扩展。
关于MySQL 注入(inject) - 使用 SELECT 查询来更新/删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5759603/