欧美一区2区三区4区公司二百,国产精品婷婷午夜在线观看,自拍偷拍亚洲精品,国产美女诱惑一区二区

歡迎來到夢飛科技

網絡技術

當前優惠活動:

Django任意代碼執行裂痕闡明

1 從Django的SECTET_KEY到代碼執行

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)

3.4 結構POC

夢飛科技 - 全球數據中心基礎服務領先供應商

Copyright © 2003-2019 MFISP.COM. 國外服務器租用 IDC公司 版權所有 ? 粵ICP備11019662號

主站蜘蛛池模板: 丰台区| 咸阳市| 高阳县| 大宁县| 扶余县| 邵阳市| 綦江县| 商水县| 会宁县| 达日县| 汤阴县| 凭祥市| 浙江省| 乌拉特前旗| 周口市| 启东市| 阿巴嘎旗| 昂仁县| 涡阳县| 陆良县| 木兰县| 紫阳县| 蓬莱市| 潼南县| 宁陕县| 三都| 巨鹿县| 邓州市| 苍溪县| 凭祥市| 贵阳市| 扶风县| 邻水| 鹤壁市| 苍溪县| 南城县| 聊城市| 建瓯市| 合江县| 凌源市| 恭城|