详细介绍:【2025PolarCTF秋季个人赛】WEB方向wp

news/2025/9/24 19:49:33/文章来源:https://www.cnblogs.com/lxjshuju/p/19109853

white

打开靶机,发现可以执行命令,但是进行了严格的过滤

可以执行的命令是一个白名单

ls
pwd
whoami
date
echo
base64
sh

白名单命令下方告知了过滤规则,比如禁止危险函数和过滤特殊字符等。有意思的是,这里虽然说过滤特殊字符(如;、&、|、@、!)等,但是我们随便输入一个被过滤的字符,会回显一个过滤字符的正则表达式

/[;&`$\'\"<>?*[\]{}()#@!%]/

而这个正则表达式过滤掉的字符有

/ [ ; & \ $ ' "  ? * [ ] { } ( ) # @ ! %`

可以发现,并没有管道符 | 。所以管道符拼接就是本题的利用点。

回到白名单,可以发现有echo base64 sh等可以利用,这样解法就很清楚了。

首先给ls命令base64编码为bHM=,然后执行

echo bHM=|base64 -d|sh

发现可以正常回显,证明这种方法可行

tac /flag编码dGFjIC9mbGFn,执行

echo dGFjIC9mbGFn|base64 -d|sh

拿到flag

俄罗斯方块

是一个小游戏

游戏开始页面提示够10分给奖励,我们控制台修改score=10,然后消除一行,看到弹窗提示

好吧是个假的奖励。

我们去翻js源码

在下面可以看到一个路由地址,访问拿到flag

在这里插入图片描述

flag{Polar_gift_of_Squirtle}

狗黑子的舔狗日记

进去之后是一个类似微信的页面,我们到处点一点,发现只有消息、朋友圈、我和退出登录这几个页面可以有效访问

dirsearch扫一下,发现flag.php和源码泄露

在这里插入图片描述

flag.php是一个类似表白女神的页面,没什么有用信息

www.zip解压出来是一串弱密码,留着备用

然后我们观察切换页面时url的变化,是通过?page参数来改变访问的页面

考虑文件读取漏洞,尝试目录穿越,但是严格过滤了特殊字符,所以目录穿越不可行

然后考虑php伪协议读index.php源码,尝试发现可行,并且在源码中找到了一个base64加密的flag字符串

在这里插入图片描述

解base64发现关键信息

在这里插入图片描述

注意output编码改为utf-8,否则汉字输出时会乱码

知道了女神的微信号,猜测刚才的弱密码其中有女神微信密码,爆破

在这里插入图片描述

拿到密码直接登录,发现可以进到女神和狗黑子的聊天记录

在这里插入图片描述

随便发送一条消息即可得到女神名字

在这里插入图片描述

md5加密名字即可得到flag

在这里插入图片描述

flag{aa1e3ea993e122de5de6e387db6c8609}

VIP

vip内容需要VIP才能查看,我们抓包查看,发现有一个post参数

vipStatus=no

给他改成yes拿到flag

在这里插入图片描述

polar快递

下载备忘录

在里面找到默认普通账号和默认密码,此时登录发现当前是普通用户权限,无法查看flag

登录时抓包,我们看到一个post参数id=user,给他改成root,登录拿到flag

在这里插入图片描述

狗黑子的登录

dirsearch扫一下发现git泄露,githack拿到源码

index.php

<?php
session_start();
if (isset($_SESSION['logged_in']) &&
$_SESSION['logged_in'] === true) {
header('Location: admin.php');
exit;
}
if ($_SERVER['REQUEST_METHOD'] === 'POST' &&
isset($_POST['seclients_can_register'])) {
$registerValue = $_POST['seclients_can_register'];
// 明确处理0和1两种情况
if ($registerValue == 1) {
$_SESSION['show_register'] = true;
} elseif ($registerValue == 0) {
$_SESSION['show_register'] = false;
}
}
// 处理登录
$error = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST' &&
isset($_POST['login'])) {
$username = $_POST['username'] ?? '';
$password = $_POST['password'] ?? '';
require 'config.php';
if (isset($users[$username]) &&
$users[$username] === $password) {
$_SESSION['logged_in'] = true;
$_SESSION['username'] = $username;
header('Location: admin.php');
exit;
} else {
$error = '用户名或密码不正确';
}
}
?>
<
!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="UTF-8"><title>狗黑子的小破站</title><style>body {font-family: Arial, sans-serif;display: flex;justify-content: center;align-items: center;height: 100vh;margin: 0;background-color: #f0f0f0;}.login-container {background-color: white;padding: 2rem;border-radius: 8px;box-shadow: 0 0 10px rgba(0,0,0,0.1);}.form-group {margin-bottom: 1rem;}label {display: block;margin-bottom: 0.5rem;}input {width: 100%;padding: 0.5rem;border: 1px solid #ddd;border-radius: 4px;}button {width: 100%;padding: 0.5rem;background-color: #007bff;color: white;border: none;border-radius: 4px;cursor: pointer;}button:hover {background-color: #0056b3;}.error {color: red;margin-bottom: 1rem;}.register-btn {margin-top: 1rem;font-size: 0.8rem;padding: 0.3rem;background-color: #6c757d;}.register-btn:hover {background-color: #5a6268;}</style></head><body><div class="login-container"><h2>用户登录</h2><?php if ($error): ?><div class="error"><?php echo $error;?></div><?php endif;?><form method="post"><div class="form-group"><label for="username">用户名</label><input type="text" id="username" name="username" required></div><div class="form-group"><label for="password">密码</label><input type="password" id="password" name="password" required></div><button type="submit" name="login">登录</button><?php if (isset($_SESSION['show_register']) &&$_SESSION['show_register'] === true): ?><button type="button" class="register-btn" onclick="window.location.href='register.php'">注册</button><?php endif;?></form></div></body></html>

admin.php

<?php
session_start();
if (!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] !== true) {
header('Location: index.php');
exit;
}
if ($_SERVER['REQUEST_METHOD'] === 'POST' &&
isset($_POST['seclients_can_upload']) &&
$_POST['seclients_can_upload'] == 1) {
$_SESSION['show_upload'] = true;
}
$upload_message = '';
if (isset($_SESSION['show_upload']) &&
$_SESSION['show_upload'] === true &&
$_SERVER['REQUEST_METHOD'] === 'POST' &&
isset($_FILES['file'])) {
$target_dir = "uploads/";
if (!file_exists($target_dir)) {
mkdir($target_dir, 0777, true);
}
$target_file = $target_dir . basename($_FILES["file"]["name"]);
$uploadOk = true;
if ($_FILES["file"]["size"] <
200 * 1024) {
$upload_message = "文件太小了。";
$uploadOk = false;
}
$image_types = array('image/jpeg', 'image/png', 'image/gif', 'image/webp');
$file_type = $_FILES["file"]["type"];
if (!in_array($file_type, $image_types)) {
$upload_message = "只允许上传图片文件 (JPG, PNG, GIF, WEBP)。";
$uploadOk = false;
}
if ($uploadOk &&
move_uploaded_file($_FILES["file"]["tmp_name"], $target_file)) {
$upload_message = "文件 " . htmlspecialchars(basename($_FILES["file"]["name"])) . " 上传成功。";
} elseif ($uploadOk) {
$upload_message = "文件上传失败。";
}
}
?>
<
!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="UTF-8"><title>狗黑子的小破站</title><style>body {font-family: Arial, sans-serif;padding: 2rem;}.upload-section {margin-top: 2rem;padding: 1rem;border: 1px solid #ddd;border-radius: 4px;}.message {margin: 1rem 0;padding: 1rem;border-radius: 4px;}.success {background-color: #d4edda;color: #155724;}.error {background-color: #f8d7da;color: #721c24;}button {padding: 0.5rem 1rem;background-color: #dc3545;color: white;border: none;border-radius: 4px;cursor: pointer;}button:hover {background-color: #c82333;}input[type="file"] {margin: 1rem 0;}input[type="submit"] {padding: 0.5rem 1rem;background-color: #28a745;color: white;border: none;border-radius: 4px;cursor: pointer;}input[type="submit"]:hover {background-color: #218838;}</style></head><body><h1>恭喜进来<?php echo htmlspecialchars($_SESSION['username']);?></h1><p><a href="logout.php"><button>退出登录</button></a></p><?php if ($upload_message): ?><div class="message <?php echo strpos($upload_message, '成功') !== false ? 'success' : 'error'; ?>"><?php echo $upload_message;?></div><?php endif;?><?php if (isset($_SESSION['show_upload']) &&$_SESSION['show_upload'] === true): ?><div class="upload-section"><h2>文件上传</h2><form method="post" enctype="multipart/form-data"><input type="file" name="file" id="file"><br><input type="submit" value="上传文件" name="upload"></form></div><?php endif;?></body></html>

思路很简单,首先注册,登录,然后传马拿flag

首先post传参seclient_can_register=1拿到注册按钮,注册账号

这里注意账号密码需要保持统一

注册后登录

在admin.php页面post传seclient_can_upload=1拿到文件上传按钮,这里只检测MIME类型和文件大小,我们在shell.php中写入一句话木马,后面跟上200k的数据即可

代码审计easy

<?php
$page = 'hello.php';
if (isset($_GET['page'])) {
$page = $_GET['page'];
}
$base_dir = __DIR__ . '/pages/';
$target = $base_dir . $page;
if (preg_match('/https?:\/\//i', $page)) {
echo "远程 URL 不允许呦。";
exit;
}
if (file_exists($target)) {
$content = file_get_contents($target);
echo "<pre>" . htmlspecialchars($content, ENT_QUOTES|ENT_SUBSTITUTE, 'UTF-8') . "</pre>";
} else {
if (@file_exists($page)) {
$content = file_get_contents($page);
echo "<pre>" . htmlspecialchars($content, ENT_QUOTES|ENT_SUBSTITUTE, 'UTF-8') . "</pre>";
} else {
echo "No!: " . htmlspecialchars($page);
}
}

其实就是一个简单的目录穿越,但是试了好多都不可以,到最后才发现其实就在上一层

?page=../flag.txt

拿到flag

flag{simple_lfr_ctf_2025}

老刘的小店

首先随便注册一个账号登录,我们发现可以用polar coins买东西,经过测试前三个都是没有用的,那么猜测flag就在最后一个admin secret里面

又因为我们登录可以获得一个硬币,登录又可以直接get 3 coins

又因为这里还有一个transfer转移硬币的功能,transfer是把当前账号的硬币转移一定数量到目标账号下

所以我们大胆假设:我们可以注册超多账号,然后把注册的超多账号送的4个币全部转移到我们账户下!

我们利用burpsuite抓包,这里我们使用burpsuite自带工具:Copy As Python-Requests

我们可以复制请求包转为python requests请求。

我们需要三个请求包:注册账号,获得三个硬币,转移硬币。因此我们需要获得三个相应的请求包。

burp0_url = "http://cfd01d45-3b32-433c-9069-8a19ce1343da.www.polarctf.com:8090/register.php"
burp0_data = {"username": "Acc", "password": "123123"}
res1 = session.post(burp0_url, data=burp0_data)
burp1_url = "http://cfd01d45-3b32-433c-9069-8a19ce1343da.www.polarctf.com:8090/dashboard.php"
burp1_data = {"get_coins": ""}
session.post(burp1_url, data=burp1_data)
burp2_data = {"transfer": "1", "to_user": "moyuanw", "amount": "4"}
session.post(burp1_url, data=burp2_data)

本地运行这个脚本,不断刷新页面,可以发现硬币数是不断增加的。等待它变成10000,买下admin secret

拿到了admin的账户密码,登录发现老刘的生平,查看源代码发现php代码,是一个过滤比较严格的rce

参考安洵杯 2019 easy_web,两个题一模一样

这里其实反斜杠并没有过滤,具体参考https://www.cnblogs.com/hetianlab/p/18124378

所以我们直接ta\c /fl\ag即可拿到flag。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/916161.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

英语_阅读

当然可以,以下是英文与中文交替的逐句翻译:Six-year-old Brooke Neitzel wanted a dollhouse. 六岁的布鲁克奈策尔想要一个娃娃屋。 So she ordered one just by telling the familys smart speaker what she wanted…

Nuget安装以及西门子PLC通信

安装S7NetPlus库 ​添加命名空间 ,using S7.Net​创建一个西门子PLC通信对象——成员变量实例化 ,this:表示的是当前对象建立简介 ,对象名.方法名 , this.siemens.Open()​读取变量 , 装箱的一个过程 ,解析变量 ,…

wordpress捐赠按钮如何做网站导航栏的seo优化

2.1.9 调度算法 知识总览 学习各种调度算法的思路 算法思想算法规则这种调度算法是用于作业调度还是进程调度&#xff1f;抢占式或是非抢占式优点和缺点是否会导致饥饿&#xff08;某进程/作业长期得不到服务&#xff09; 2.1.9.1 先来先服务 知识点说明英文名FCFS&#xff0…

网站怎么做成二维码做网站找顺的

二叉树垂直遍历题目描述输入输出示例输入实例输出DFSBFS更简单的方法二叉树垂直遍历题目描述对于一个二叉树&#xff0c;输出它的垂直遍历结果&#xff1b;对于同一列的节点&#xff0c;按照从左向右&#xff0c;从上向下的顺序排列。例如&#xff0c;对于以下二叉树&#xff1…

与狗狗做网站互联网广告价格

创建工程&#xff1a; 2.1.程序的耦合 耦合&#xff1a;耦合指的就是对象之间的依赖关系。对象之间的耦合越高&#xff0c;维护成本越高。 案例&#xff1a;没有引入IOC容器时系统的Web层、业务层、持久层存在耦合 /*** 持久层实现类*/ public class UserDaoImpl implements U…

每日反思(2025_09_24)

今天跟着左神视频学些了快速排序以及逆序对和荷兰国旗问题,了解了双指针三指针递归解决问题,并解决了leetcode第75题颜色分类,正在解决力扣LCR170题。 明天继续跟视频学习,并写涉及到的力扣题,晚上总结这三天的学…

普通用户之间免密互信时因权限问题致使配置失败

[student@master ~]$ ssh-copy-id user1@node1 /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/student/.ssh/id_rsa.pub" /usr/bin/ssh-copy-id: INFO: attempting to log in with…

安装Flask库

安装Flask库 1、下载安装python官网下载 python-3.9.10-amd64.exe 安装,勾选Add Python 3.9 to PATH 2、验证安装cmd输入:python --version cmd输入:pip --version 升级pip:python -m pip install --upgrade pip …

《新概念英语》在线朗读,单句点读,随时随地在线学习。

新概念英语-全四册 New Concept English 在线课文点读 在线朗读,单句点读,随时随地在线学习。📕 第一册:《First Things First》 目标:打基础,日常交流入门内容概述:共144课,都是非常短的小对话和故事。 涉及…

深入解析:[p2p-Magnet] docs | HTTP API与Web界面 | 搜索查询引擎

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

南京网站制作学校怎么注册一个网站

戳蓝字“CSDN云计算”关注我们哦&#xff01; 文 | 阿晶、丹丹、王银发于上海华为HC大会现场出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09; 科技的不断发展正逐步加速智能世界的到来。一直&#xff0c;华为致力于提供经济且充裕的算力&#xff0c;力图像使…

为什么用MyEclipse做网站ps如何做音乐网站

观察者模式是一种设计模式&#xff0c;其中一个对象&#xff08;称为主题&#xff09;维护一组依赖于它的对象&#xff08;称为观察者&#xff09;&#xff0c;当主题的状态发生变化时&#xff0c;它会通知所有观察者。这种模式常用于实现分布式事件处理系统。 下面是一个简单…

如何做分类网站信息营销网站设计的内容有哪些

学习网络开发过程中不想“污染”macOS&#xff0c;考虑到之后部署网络应用主要是与linux打交道&#xff0c;所以安装了 ubuntu 虚拟机以满足短期的知识学习需求。十里安装了 ubuntu 虚拟机&#xff0c;一般就是在 mac 中 ssh 连接 ubuntu 虚拟机在终端下进行操作学习&#xff0…

P10004 [集训队互测 2023] Permutation Counting 2

把排列写成一条路径 \(p_1\to p_2\to\cdots\to p_n\)。那么 \([p_i<p_{i+1}]\) 就是第 \(i\) 步往右走,\([p^{-1}_i<p^{-1}_{i+1}]\) 是 \(i\) 要先于 \(i+1\) 访问。 如果我们已知了 \(p^{-1}_{i}<p^{-1}_{…

java数组拷贝主要有四种方法,浅拷贝

java数组拷贝主要有四种方法,浅拷贝java数组拷贝主要有四种方法,浅拷贝 在Java中,数组拷贝可以通过多种方式实现,每种方式有其特定的用途和性能特点。下面列举四种常见的方法: 1. 使用System.arraycopy() System.…

毕赤酵母细胞工厂升级:CRISPR 技术破局传统局限,解锁多基因代谢工程新可能

在合成生物学与代谢工程的推动下,微生物细胞工厂已成为 bulk 化学品、高价值天然产物及重组蛋白的核心生产平台 —— 其温和的反应条件、高特异性的催化能力,可大幅降低传统化学合成的污染与能耗。在众多微生物宿主中…

日总结 7

今天上课老师让我们讲我们为大作业准备的ppt,详细内容就是介绍自己的产品,每个队3分钟时间,所以ppt的量要少而精,跟我们要介绍产品时一样,要在有限的时间内介绍出自己产品的核心和亮点,同时ppt的制作也有讲究,不…

React学习教程,从入门到精通,React Router 语法知识点及使用手段详解(28)

React学习教程,从入门到精通,React Router 语法知识点及使用手段详解(28)2025-09-24 19:33 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x…

网站制作网站设计沈阳关键字优化公司

目录 一.format 函数简介 1.format 函数不设置下标2.format 函数设置下标 二.format 函数实战三.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 一.format 函数简介 format 函数主要是用来构造字符串&#xff0c;基本语法是通过 {} 符号操…

读书笔记:OpenPBR 规范(1)

1. 历史背景和动机 ​​​  计算机图形场景资产的转换仍然是一个重大问题,尤其是在表面外观方面。不同的渲染器和3D引擎使用不同的着色系统、着色语言以及固定渲染管线,这些系统不易互相操作。此外,准确建模表面外…