这题虽然BUU一分,但是知识点居多。拿出来单独总结一下(700多个师傅都做出来了TTTTQL)
这题有三种解法
- flask session 伪造
- unicode欺骗
- 条件竞争
其中最简单的不需要太多步骤的即第二种,unicode欺骗,我们来详细解释一下这题怎样使用
打开靶机,题目只有登录和注册吗,在源码中发现,<!-- you are not admin -->,我们可以理解为登录账户为admin,即可获得flag
在修改密码界面还发现了<!-- https://github.com/woadsl1234/hctf_flask/ -->
下载下来看看
@app.route('/code') def get_code(): @app.route('/index') def index(): @app.route('/register', methods = ['GET', 'POST']) def register(): @app.route('/login', methods = ['GET', 'POST']) def login(): @app.route('/logout') def logout(): @app.route('/change', methods = ['GET', 'POST']) def change(): @app.route('/edit', methods = ['GET', 'POST']) def edit():
1我们可以发现她只有简单的几个功能,
在观察源码后,我们发现,在修改密码的时候先将name转成小写,跟进一下register、login
发现都用strlower()来转小写,但是python中已经自带转小写函数lower(),跟进
之后利用就清晰了
假如我们注册ᴬᴰᴹᴵᴺ用户,然后在用ᴬᴰᴹᴵᴺ用户登录,因为在login函数里使用了一次nodeprep.prepare函数,因此我们登录上去看到的用户名为ADMIN,此时我们再修改密码,又调用了一次nodeprep.prepare函数将name转换为admin,然后我们就可以改掉admin的密码,最后利用admin账号登录即可拿到flag。