BUUCTF [HCTF 2018]admin

第一步打开网址,就一个欢迎界面 旁边下拉菜单有个登录和注册界面
BUUCTF [HCTF 2018]admin_第1张图片
查看一下源码
在这里插入图片描述
有个注释 应该是提示我们用admin账号登录

先随便注册一个账号看看 登录成功后有三个界面

BUUCTF [HCTF 2018]admin_第2张图片
随便看了看 先去登录注册页面试试有什么注入没有

在注册界面试了一下约束攻击,密码随便输了一个123 — 这时的我还不明白事情的严重性
BUUCTF [HCTF 2018]admin_第3张图片
BUUCTF [HCTF 2018]admin_第4张图片
报错了 ,好像没行。不过这界面还能运行python
在这里插入图片描述
可以看见一些东西 ,感觉这好像可以利用的样子,不过对我来说应该太难了,先看看别处
在这里插入图片描述
返回登录界面 顺手把admin 123 试了一下
BUUCTF [HCTF 2018]admin_第5张图片
卧槽 进去了???
BUUCTF [HCTF 2018]admin_第6张图片
此刻我有点蒙蔽,咋回事,难道注入成功了?不是报错了吗, 然后我又去试了一试,密码换了一个,果然,不行,看来就是admin的密码是123了。 /吐血

可以在这提建议嘛 既然知识点不是爆破 就把密码设复杂点好吧。。。

就这样把 看大佬的wp去吧

大佬说有三种解法 我就试了第一个

flask session
伪造 unicode欺骗
条件竞争

原来在修改密码那可以看见源码的网址
在这里插入图片描述

解法一:flask session伪造

关于 flask 的 session 机制,可以参考这篇文章:flask 源码解析:session

关于客户端 session 问题,可以参考这篇文章:客户端 session 导致的安全问题

解密的代码

#!/usr/bin/env python3
import sys
import zlib
from base64 import b64decode
from flask.sessions import session_json_serializer
from itsdangerous import base64_decode

def decryption(payload):
    payload, sig = payload.rsplit(b'.', 1)
    payload, timestamp = payload.rsplit(b'.', 1)

    decompress = False
    if payload.startswith(b'.'):
        payload = payload[1:]
        decompress = True

    try:
        payload = base64_decode(payload)
    except Exception as e:
        raise Exception('Could not base64 decode the payload because of '
                         'an exception')

    if decompress:
        try:
            payload = zlib.decompress(payload)
        except Exception as e:
            raise Exception('Could not zlib decompress the payload before '
                             'decoding the payload')

    return session_json_serializer.loads(payload)

if __name__ == '__main__':
    print(decryption(sys.argv[1].encode()))

在这里插入图片描述
indexheml

{% include('header.html') %}
{% if current_user.is_authenticated %}

Hello {{ session['name'] }}

{% endif %} {% if current_user.is_authenticated and session['name'] == 'admin' %}

hctf{xxxxxxxxx}

{% endif %}

Welcome to hctf

{% include('footer.html') %}

可以看见需要session name为admin时可以显示flag

想要伪造session我们还需要SECRET_KEY,在config.py里可以找到key

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

flask session加密的脚本
https://github.com/noraj/flask-session-cookie-manager

把session通过SECRET_KEY加密
BUUCTF [HCTF 2018]admin_第7张图片
然后修改请求发送请求 得到flag
BUUCTF [HCTF 2018]admin_第8张图片

只测试了解法一,解二就没去试了,解三据说只是理论

不过在查资料的时候发现这个框架还存在验证码泄漏的问题

在注册界面拿到session
BUUCTF [HCTF 2018]admin_第9张图片
解密
在这里插入图片描述
可以看见验证码就在session里面

你可能感兴趣的:(CTF)