CTFer成长记录——CTF之Web专题·buuctf—admin
一、题目链接
https://buuoj.cn/challenges#[HCTF%202018]admin
二、解法步骤
本题页面十分简单,
在源代码中发现:
猜测需要用admin进行登陆,如果在注册模块用admin进行注册的话,会提示已被注册,那么可以肯定与admin有关。
在登陆页面用弱口令试试,发现不行。
那么注册账号,在修改密码的网页源代码发现:
访问该网址,下载源码发现是flask,python的框架:
解法一:unicode覆盖
通过代码审计,发现在注册时候使用了nodeprep.prepare()函数,这个函数曾有个unicode欺骗漏洞:nodeprep.prepare函数会将unicode字符ᴬ
转换成A
,而A
在调用一次nodeprep.prepare函数会把A
转换成a
。所以我们需要想办法调用两次该函数,一次绕过重复用户检查,另一次将大写改成小写进行重复用户覆盖:
其方式是:使用ᴬᴰᴹᴵᴺ
进行注册,
登录后发现成了大写
然后用进行密码修改:
然后用admin进行登录:
解法二:flask的session伪造
在对网页进行抓包的时候可以发现其中还有session信息:
本题核心是用admin的身份进行登陆,最后拿到flag,而像cookie,session,token这些就是识别用户的。之前已经知道该网页使用flask框架构成的,其中就存在session伪造漏洞:
简介:flask的session是通过加密之后放到了cookie中。所以有加密就有密钥用于解密,所以,只要用到了flask的session模块就一定要配置“SECRET_KEY”这个全局宏。一般设置为24位的字符。配置方法一般有两种。新建一个config.py的文件配置secret_key;直接在主运行文件里面配置。配置config的时候也是和操作字典是一样的,main.py
在刚才的github上找到config.py文件:
发现默认密钥是:ckj123,然后在kali中git解密脚本(需要梯子):git clone https://github.com/noraj/flask-session-cookie-manager.git
使用方法:python3 flask_session_cookie_manager.py decode -s "SECRET_KEY" -c "SESSION"
,SESSION的获取可以通过抓包:
{'_fresh': True, '_id': b'aa2f3880e10d7de7d5929f922bc7dd299f4b78e3fdca2b4870f82f312b38657e49a8c9d178719d06f7dcc42f609253aa1ee3173cc2bd305d368255b2ee7b164a', 'csrf_token': b'1cfacd29e9df8172fbd80437e8de8bdecbbe9e64', 'image': b'aKkt', 'name': 'abc', 'user_id': '10'}
最后解码结果,然后把name中的abc换成admin:
然后进行加密:python3 flask_session_cookie_manager.py encode -s "SECRET_KEY" -t "解密的SESSION结构"
把这串SESSION代替原来的即可:
成功得到flag
三、总结
本题考察了flask框架中函数漏洞以及session伪造漏洞,session伪造在CTF中考的还是比较多的。本题很适合做知识积累