flask-session

发布时间 2023-12-15 12:57:30作者: qingshanboy

flask-session

pyc文件

pyc文件是python源文件经过解释器编译为字节码后的文件

pyc文件的加载速度更快

可以通过反编译工具将pyc文件的字节码转换为py文件源码

生成的pyc文件放在__pycache__目录下面

flask-session

flask框架把session存储在客户端

flask生成session的过程如下:

1.先用json.dumps把对象转换为json数据
2.然后用zlib进行压缩
3.对数据进行bse64编码
4.使用hmac算法生成加密信息
最终格式为:base64编码后的数据.时间戳.hmac加密后的签名

什么是时间戳:

时间戳就是从1970年1月1日到现在的总秒数,用于认证数据的唯一性

关于hmac算法:

hmac算法是基于密钥的一种算法
想要获取经过hmac算法加密后的密文的明文需要密文以及密钥

flask-session伪造

从上面对flask-session的介绍我们知道session存储在客户端

并且json数据只是经过了base64编码,那么我们可以直接base64解码获取json数据

而如果我们拿到了hmac的密钥,那么我们就可以自己构造json数据,并进行加密生成签名信息,然后抓包发给服务端绕过一些认证

所以flask-session伪造的关键就是获取密钥

获取密钥的常见方式

flask有一个全局变量来存储密钥——secret_key

通过SSTI注入获取——{{config}}
通过SSRF读取有secret_key的flask配置文件——config.py
读取/proc/self/environ
爆破
一些网站泄露(ctf题目可能会在html页面源码中)
脚本使用:
python2 脚本2.py decode -c "session值" -s "key值"
python2 脚本2.py encode -s "key值" -t "我们需要伪造的值"
python3 脚本3.py decode -c "session值" -s "key值"
python3 脚本3.py encode -s "key值" -t "我们需要伪造的值"
自己电脑使用脚本:
python 脚本3.py decode -c "session值" -s "key值"
python 脚本3.py encode -s "key值" -t "我们需要伪造的值"