命令注入漏洞与防护
字数 990 2025-11-03 18:01:32

命令注入漏洞与防护

1. 漏洞描述
命令注入(Command Injection)是一种安全漏洞,攻击者通过应用程序向操作系统传递恶意命令并执行。当应用程序未对用户输入进行严格过滤,直接将输入拼接到系统命令中时,攻击者可利用特殊字符(如;|&等)注入非法命令,从而控制服务器。

2. 漏洞产生场景

  • 示例场景:一个网络设备管理页面提供"ping测试"功能,用户输入IP地址后,后端执行命令ping <用户输入>
  • 危险操作:若用户输入8.8.8.8; cat /etc/passwd,拼接后的命令变为:
    ping 8.8.8.8; cat /etc/passwd
    
    系统会先执行ping,再执行cat命令泄露敏感文件。

3. 漏洞原理分析

  • 根本原因:用户输入被当作命令的一部分而非数据传递给系统Shell(如Bash、Cmd)。
  • 关键问题
    • 应用程序直接调用系统命令执行函数(如PHP的system()、Python的os.system())。
    • 未对输入中的命令分隔符进行转义或过滤。

4. 攻击手法举例
假设后端代码为:

$ip = $_POST['ip'];
system("ping -c 4 " . $ip);  // 直接拼接输入

攻击者可能输入:

  • 8.8.8.8 && rm -rf /(删除文件)
  • 127.0.0.1 | whoami(执行后续命令)
  • $(cat /etc/shadow)(命令替换)

5. 防护方案
原则:永远不信任用户输入,避免直接拼接命令。

  • 方案1:输入白名单验证

    • 只允许输入特定格式(如IP地址、域名)。
    • 示例:使用正则表达式验证^[0-9.]{7,15}$确保输入仅为IP地址。
  • 方案2:使用安全的API替代命令拼接

    • 例如:用PHP的filter_var($ip, FILTER_VALIDATE_IP)验证IP合法性后,直接调用网络库而非系统命令。
  • 方案3:转义或过滤危险字符

    • 对输入中的;|&等字符进行转义(如escapeshellarg()函数)。
    • 示例:
      $ip = escapeshellarg($_POST['ip']);
      system("ping -c 4 " . $ip);  // 输入会被单引号包裹,视为整体数据
      
  • 方案4:最小权限原则

    • 运行应用程序的操作系统账户应限制权限(如禁止读写敏感目录)。

6. 进阶防护:纵深防御

  • 部署WAF(Web应用防火墙)检测可疑命令模式。
  • 对服务器进行安全加固,限制系统命令的执行环境(如使用容器隔离)。

总结
命令注入漏洞的危害极大,防护核心是将用户输入与命令分离,通过白名单、转义或使用安全API确保输入仅作为数据处理,而非可执行代码。

命令注入漏洞与防护 1. 漏洞描述 命令注入(Command Injection)是一种安全漏洞,攻击者通过应用程序向操作系统传递恶意命令并执行。当应用程序未对用户输入进行严格过滤,直接将输入拼接到系统命令中时,攻击者可利用特殊字符(如 ; 、 | 、 & 等)注入非法命令,从而控制服务器。 2. 漏洞产生场景 示例场景 :一个网络设备管理页面提供"ping测试"功能,用户输入IP地址后,后端执行命令 ping <用户输入> 。 危险操作 :若用户输入 8.8.8.8; cat /etc/passwd ,拼接后的命令变为: 系统会先执行ping,再执行 cat 命令泄露敏感文件。 3. 漏洞原理分析 根本原因 :用户输入被当作 命令的一部分 而非数据传递给系统Shell(如Bash、Cmd)。 关键问题 : 应用程序直接调用系统命令执行函数(如PHP的 system() 、Python的 os.system() )。 未对输入中的命令分隔符进行转义或过滤。 4. 攻击手法举例 假设后端代码为: 攻击者可能输入: 8.8.8.8 && rm -rf / (删除文件) 127.0.0.1 | whoami (执行后续命令) $(cat /etc/shadow) (命令替换) 5. 防护方案 原则 :永远不信任用户输入,避免直接拼接命令。 方案1:输入白名单验证 只允许输入特定格式(如IP地址、域名)。 示例:使用正则表达式验证 ^[0-9.]{7,15}$ 确保输入仅为IP地址。 方案2:使用安全的API替代命令拼接 例如:用PHP的 filter_var($ip, FILTER_VALIDATE_IP) 验证IP合法性后,直接调用网络库而非系统命令。 方案3:转义或过滤危险字符 对输入中的 ; 、 | 、 & 等字符进行转义(如 escapeshellarg() 函数)。 示例: 方案4:最小权限原则 运行应用程序的操作系统账户应限制权限(如禁止读写敏感目录)。 6. 进阶防护:纵深防御 部署WAF(Web应用防火墙)检测可疑命令模式。 对服务器进行安全加固,限制系统命令的执行环境(如使用容器隔离)。 总结 命令注入漏洞的危害极大,防护核心是 将用户输入与命令分离 ,通过白名单、转义或使用安全API确保输入仅作为数据处理,而非可执行代码。