CTFer成长记录——CTF之Web专题·buuctf—admin

发布时间 2023-08-10 20:11:35作者: MiracleWolf

一、题目链接

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中考的还是比较多的。本题很适合做知识积累