Django是一個可以用于快速搭建高機能,優雅的網站的平臺,由Python寫成?;厥樟薓VC的軟件設計模式,即模子M,視圖V和節制器C。它 最初是被開拓來用于打點勞倫斯出書團體旗下的一些以新聞內容為主的網站的,等于CMS(內容打點系統)軟件。并于2005年7月在BSD許可證下宣布。
最 近在舉辦網站代碼審查的進程中,發明某些產物由于session利用不妥,導致大概被進攻者操作,執行任意代碼。這些產物在登錄的JS代碼中,泄露了 SECRET_KEY,將該值作為暗碼加密的鹽,這樣就袒露了加密salt不太好吧,更重要的是對django的安詳造成了極大的威脅。
2 SECRET_KEY浸染SECTET_KEY在djanog中利用很是遍及,根基上涉及到安詳,加密等的處所都用到了,下面羅列一些常見情景: 1,json object的簽名 2,加密函數,如暗碼重置,表單,評論,,csrf的key,session數據
這內里就要重點講到session的問題,在這里利用不妥就會導致代碼執行
3 代碼執行 3.1 settings的session配置django默認存儲session到數據庫中,可是大概會較量慢,就會利用到緩存,文件,尚有cookie等方法,假如回收了cookie機制則有大概代碼執行,settings設置如下:
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' |
3.2 django 1.6以下
在django1.6以下,session默認是回收pickle執行序列號操縱,在1.6及以上版本默認回收json序列化。代碼執行只存在于利用pickle序列話的操縱中。
3.3 session處理懲罰流程可以簡樸的分為兩部門,process_request和process_response,前者認真選擇session引擎,初始化cookie數據。見代碼
class SessionMiddleware(object):
def process_request(self, request):
engine = import_module(settings.SESSION_ENGINE)
session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME, None)
class SessionMiddleware(object): def process_request(self, request): engine = import_module(settings.SESSION_ENGINE) session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME, None) |
process_response則是處理懲罰返回給用戶的cookie信息,好比修改逾期時間等。在將session存入緩存后,大概在某個操縱中會用到session信息,這個時候就會通過反序列化操縱從緩存中取,假如反序列話引擎是回收pickle機制的話就存在代碼執行。反序列化的代碼位于django.core.signing.py中,這個模塊主要是一些簽名,加解密操縱,同時也包括序列化和反序列化,默認回收JSON引擎,下面是反序列話loads的代碼:
loads(s, key=None, salt='django.core.signing', serializer=JSONSerializer, max_age=None):
"""
Reverse of dumps(), raises BadSignature if signature fails
"""
base64d = smart_str(
TimestampSigner(key, salt=salt).unsign(s, max_age=max_age))
decompress = False
if base64d[0] == '.':
# It's compressed; uncompress it first
base64d = base64d[1:]
decompress = True
data = b64_decode(base64d)
if decompress:
data = zlib.decompress(data)
return serializer().loads(data)
loads(s, key=None, salt='django.core.signing', serializer=JSONSerializer, max_age=None): """ Reverse of dumps(), raises BadSignature if signature fails """ base64d = smart_str( TimestampSigner(key, salt=salt).unsign(s, max_age=max_age)) decompress = False if base64d[0] == '.': # It's compressed; uncompress it first base64d = base64d[1:] decompress = True data = b64_decode(base64d) if decompress: data = zlib.decompress(data) return serializer().loads(data) |