zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    LC.225. Implement Stack using Queues(using two queues)
    LC.232. Implement Queue using Stacks(use two stacks)
    sort numbers with two stacks(many duplicates)
    LC.154. Find Minimum in Rotated Sorted Array II
    LC.81. Search in Rotated Sorted Array II
    LC.35.Search Insert Position
    前后端分离:(一)
    Redis基本使用(一)
    GIT篇章(二)
    GIT篇章(一)
  • 原文地址:https://www.cnblogs.com/HelloCTF/p/13031814.html
Copyright © 2011-2022 走看看