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 "我们需要伪造的值"