最近做了 ph 牛的 code-breaking,在做 picklecode 这一题时,没有搞懂那个 django 的 signed_cookies 引擎对 session 的操作,就 debug 了一下,做个总结,算是做了个代码审计吧
0x01 获取 session_auth_hash
题目 : https://github.com/phith0n/code-breaking/tree/master/2018/picklecode
django 使用的 SESSION_ENGINE 为
django.contrib.sessions.backends.signed_cookies
pycharm 开启 debug 模式,username 为 peri0d,password 为 123456
入口文件在
views.py
,第 34 行新建了用户并对密码进行了加密。第 35 行调用auth_login()
函数,跳转到auth\__init__.py
的login()
方法第 97 行,调用
user
类的get_session_auth_hash()
方法来获取session_auth_hash
的值,跟进get_session_auth_hash()
给
key_salt
赋值后调用salted_hmac(key_salt, self.password)
生成session_auth_hash
,这里的password
是经过加密的,跟进salted_hmac()
在第 39 行对
key_salt + secret
进行 sha1 加密并以 byte 类型返回给key
。这里的value
是经过加密后的password
。然后调用hmac.new()
返回一个 sha1 模式的hmac
对象流程梳理
key_salt = '***' # SECRET_KEY secret = '******' key = hashlib.sha1(key_salt + secret).digest() sha1_obj = hmac.new(key, msg=password_enc, digestmod=hashlib.sha1) session_auth_hash = sha1_obj.hexdigest()
0x02 初始化 sessionid
获取
session_auth_hash
后,单步调试,进入base.py
执行__contains__()
函数,参数为_auth_user_id
单步调试,然后执行
_get_session()
函数,返回缓存 session,是一个空字典