babypython[国赛总决赛复现]
是个上传界面,经测试只能上传zip文件
看到页面提示,猜测只有admin才能得到flag,需要伪造session,伪造session要用到一个工具-flask-unsign
所以这道题关键是需要找到key.
可以上传zip文件,同时后台自动解压的情况下,从而实现任意文件读取。
软连接导致任意文件读取
我们可以压缩一个软链接,类似于windows下的快捷方式,然后网站后台会解压读取该软链接指向的服务器上的文件,就能达到读取任意文件的效果。
ln -s /etc/passwd passwd
zip -y passwd.zip passwd
生成了一个读取**/etc/passwd的zip软链接
再读取下环境变量/proc/self/environ**
同样执行上面两行命令,改下要读取的目录
这里读不到,会显示bad然后跳转到?error=1
再来读取下app/uwsgi.ini
/app/main.py
uWSGI是一个Web应用服务器,它具有应用服务器,代理,进程管理及应用监控等功能。它支持WSGI协议,同时它也支持自有的uWSGI协议
依旧没有读到源码。。。。。当时就溜了,可能是复现的问题
/app/hard_t0_guess_n9f5a95b5ku9fg/hard_t0_guess_also_df45v48ytj9_main.py
真正源码在上面读取下,源码太长就不上去了
其中有两行代码
*app.config[‘SECRET_KEY’] = str(random.random()100)
random.seed(uuid.getnode())
就是session是随机生成的,种子是uuid.getnode()
那么首先就是找到mac地址,有下面几种方法。
得到mac地址。
然后就是把mac地址处理下,转换成二进制,然后设置成seed,生成一下KEY。脚本如下
得到key
flask-unsign伪造session
丢这里踩坑了,这个工具貌似不能用浮点数,只能换个
https://github.com/noraj/flask-session-cookie-manager
得到cookie
先这一道,后续再补