SQL注入会导致远程代码执行吗?

信息安全 sql注入
2021-08-20 10:24:32

是否可以通过 SQL 注入在服务器上执行一些代码(例如基于 PHP 的 Web 应用程序上的 PHP 代码)?如果是,具体如何?

我知道未转义的字段可能导致 SQL 注入,攻击者可以直接在服务器上执行他选择的 SQL 命令。但我认为只运行 SQL 命令,而不是一些任意代码。我在这里错了吗?

4个回答

SQL 数据库系统通常有一个导出机制,可以在服务器上写入任意文件,例如SELECT ... INTO OUTFILE在 MySQL 中。如果攻击者能够组装这样的查询并且没有被限制性权限阻止,他们实际上可以创建 PHP 脚本。现在他们仍然需要让服务器执行脚本。在最简单的情况下,他们对 Web 目录具有写入权限。如果他们请求脚本,网络服务器将愉快地执行它。

这取决于数据库的类型(MySQL、Postgres、Oracle 等)和数据库用户的权限。

如果应用程序使用管理员帐户连接到数据库,则通常可以执行代码。在 SQL Server 上使用 xp_cmdshell 很简单。其他数据库需要更多涉及的技术。最流行的 SQL 开发工具SQLmap提到了这一点:

Support to execute arbitrary commands and retrieve their standard output 
on the database server underlying operating system when the database software 
is MySQL, PostgreSQL or Microsoft SQL Server.

至少对于 MySQL,我认为它使用了 Fleche 提到的写入 PHP 文件的技巧。

从防御的角度来看,这就是为什么您永远不应该让您的应用程序以管理员身份连接的原因。

许多重要的应用程序将对象存储在数据库中。具有 db 访问权限的攻击者(例如通过 SQL 注入获得)可以修改它们,当它们被反序列化时,它们会运行预期的代码。

这取决于 php 应用程序是否有一个可以滥用的带有__wakeup()方法的类,但是 webapp 作者并不完全负责,因为服务器上可能还安装了第三方类被滥用。

SELECT INTO OUTFILEFleche 指出的问题也值得注意,虽然 *nix mysql 服务器通常是用自己的用户设置的,这种攻击是不可能的)

除了上面已经提到的,一些数据库依赖于代码——例如,Oracle 本身的最大部分是用oracle 编写,即PL/SQL,运行在数据库服务器内部。如果你得到一个 SQL 注入,你可以很好地改变系统状态,有时超出数据库用户帐户允许的范围,特别是如果你有机会将它与本地权限升级结合起来。

至少,默认情况下,Oracle 还允许在数据库服务器中运行 Java™ 代码。也许还有更多的事情......

PostgreSQL 也是可扩展的。你可以运行 Perl 脚本之类的东西,而不仅仅是 PL/pgSQL……