什么是命令注入漏洞?
命令注入漏洞如何让攻击者接管机器,以及如何防止这些漏洞。
命令注入漏洞可能是应用程序中可能发生的最危险的漏洞之一。当应用程序允许用户输入与系统命令混淆时,就会发生命令注入漏洞或操作系统命令注入漏洞。当用户输入在没有适当预防措施的情况下直接连接到系统命令中时,就会发生这种情况。让我们用一个例子来理解。
在代码中调用系统命令
假设Web应用程序具有允许用户通过站点下载网页的功能。要实现此功能,可以使用Python执行系统命令wget来下载网页。代码如下:
导入操作系统def下载(url):
os.system("wget-O- {}".format(url))显示(下载(user_input.url))
首先定义一个函数download,该函数调用wget从传入的URL下载内容。然后它调用download用户提供的输入并显示结果。如果用户提交以下请求,应用程序将下载Google的主页并将其显示给用户:
GET/download?url=google.com
主机:example.com
命令注入是如何发生的
在Linux命令行上,分号;字符分隔各个命令。而且由于这里的用户输入是直接传递给系统命令的,因此攻击者可以wget通过在分号后提交他们想要的任何命令来执行命令之后的任意命令。例如,如果恶意用户提交了这个请求会发生什么?
GET/download?url=google.com;ls
主机:example.com
此请求将导致应用程序同时执行wget-O-google.com和 ls,从而输出当前目录的内容。由于应用程序随后会将命令的结果显示给用户,因此恶意用户也将能够读取ls命令的输出。同样,攻击者也可以通过此漏洞读取敏感文件:
GET/download?url=google.com;cat/etc/shadow
主机:example.com
/etc/shadow是Unix系统上存储散列用户密码的文件。攻击者将能够执行运行Web应用程序的用户有权执行的任何系统命令。例如,他们可能能够读取敏感文件、访问和利用本地网络上的其他机器,或者修改服务器上的文件。
如何防止命令注入?
那么如何防止代码中的命令注入漏洞呢?
为防止命令注入,应避免将用户输入直接插入系统命令。可以使用的第一个替代策略是使用编程语言的系统API,而不是system()直接调用。大多数编程语言都有内置函数,允许您运行常见的系统命令,而不会冒命令注入的风险。
例如,PHP有一个名为
mkdir(DIRECTORY_NAME).
可以使用它来创建新目录
而不是调用
system("mkdirDIRECTORY_NAME").
如果必须将用户输入插入系统命令,请在将用户输入传递到系统命令之前实施强输入验证。可以使用字符串或字符的允许列表来指定允许的值并拒绝所有其他不符合该格式的用户输入。例如,如果想允许用户使用系统命令读取系统文件的子集,可以创建允许的文件名列表并拒绝所有其他输入。还可以使用正则表达式将用户输入限制为特定的字符子集,以防止用户提交允许他们操纵系统命令的特殊字符。例如,这个正则表达式字符串会将用户输入限制为字母数字字符。
并将用户输入限制为15个字符:^[A-Za-z0–9]{1,15}$.
纵深防御策略
最后,还有深度防御策略可以帮助将命令注入的风险降至最低。首先,可以部署WAF(Web应用程序防火墙)来帮助过滤掉可疑的用户输入。还应该仅使用完成其任务所需的权限来运行应用程序。例如,当应用程序只需要对文件进行读取访问时,不应授予它任何写入或执行权限。这被称为“最小特权原则”。这种做法将降低在攻击期间系统受损的风险,因为攻击者即使在应用程序上获得命令注入,也无法获得对敏感文件和操作的访问权限
转自:全栈网络空间安全
原文始发于微信公众号(LemonSec):什么是命令注入漏洞?
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论