(转载翻译)OS命令注入

nicky   ·   发表于 2020-03-12 20:18:26   ·   技术文章投稿区

什么是OS命令注入

OS command injection翻译过来是操作系统命令注入,它是一个web安全漏洞可以让攻击者可以在运行应用程序的服务器上执行任意的操作系统(Operating system)命令,并且通常会完全破坏应用程序及所有数据。

攻击者通常可以利用OS命令注入漏洞来破坏托管基础结构的其它部分,利用信任机制将攻击转移到组织内的其它结构。

执行任意命令

比如说一个购物应用程序,用户可以查看特定商店中的某个商品是否有库存。该商品的URL可以通过以下网站访问:
https://insecure-website.com/stockStatus?productID=381&storeID=29

为了提供库存信息,应用程序必须查询各种新旧系统,由于历史原因,该功能是通过使用产品和储存ID作为参数来调用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和window平台上的一些命令:
命令的目的 Linux Windows
当前用户名字 whoami whoami
操作系统 uname -a ver
网络配置 ifconfig ifconfig /all
网络连接情况 netstat -an netstat -an
运行的程序 ps -ef tasklist

OS注入命令盲注

OS命令注入很多都是盲注漏洞。这也意味着应用程序不会在其HTTP响应中返回命令的输出。盲注漏洞仍然可以利用,只不过需要不同的技术。

假设一个允许用户提交留言的网站。用户输入他们的邮箱地址和留言就可以在网站中出现。然后服务器端应用程序会向站点管理员生成一封包含反馈的电子邮箱。为此,它使用提交的详细信息调出邮箱程序例如:
mail -s “This site is great” -aFrom:peter@normal-user.net feedback@vulnerable-website.com

mail命令的输出不会在应用程序的响应中返回,因此使用echo有效负载将无效,在这种情况下,可以使用多种技术来检测和利用这个漏洞。

使用时间延迟检测盲注OS命令注入

可以使用注入的命令来触发延迟效果,从而允许你根据应用程序回应的时间来确认命令已执行。Ping命令是一种比较有效的方法,因为它可以让你指定要发送的ICMP数据包的数量,从而指定该命令执行所花费的时间:
& 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 所传来的检索文件,然后查看注入命令的输出结果。

注入OS命令的方式

各种shell字符可以用来执行OS命令注入攻击。许多字符串用来命令分割,使用者可以把它们连接在一起。以下命令分隔符可以用于window和UNIX服务器上:
&
&&
|
||

以下命令只用在unix服务器:
;
换行符(0x0a \n)

在基于unix系统上,你可以使用反引号或美元字符在原始命令中嵌套执行注入命令。要注意的是不同的shell具有小小不同的功能,这可能影响它们是否在某些情况下是否有效,以及它们是否允许带内检索命令输出或者仅仅只能盲注有效。

有时候,你控制的输入会出现在引号中,在这种情况下,你得先使用引号来终止上下文,然后使用适当的shell字符插入新命令。

如何防御?

到目前为止防御OS命令注入攻击的有效方法是永远不要从应用程序代码中调用OS命令。在几乎每种情况下,都有使用更安全的平台API来实现所需功能的替代方法。

如果认为无法通过用户提供的输入来调用OS命令,则执行更强大的输入验证,有效的验证方法包括:
根据输入值来对比白名单上的内容
验证是否为数字
验证它们的输入是否仅包含字母数字字符,不包含其它语法或者空格。
千万不用通过转义shell字符来清理输入。实际上很容易出现绕过

引用:Portswigger https://portswigger.net/web-security/os-command-injection

用户名金币积分时间理由
奖励系统 50.00 0 2020-08-07 11:11:10 投稿满 5 赞奖励

打赏我,让我更有动力~

1 Reply   |  Until 2020-8-8 | 1053 View

kidll
发表于 2020-8-8

雪梨师傅给力给力

评论列表

  • 加载数据中...

编写评论内容
LoginCan Publish Content
返回顶部 投诉反馈

© 2016 - 2022 掌控者 All Rights Reserved.