欧美一区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-2021 MFISP.COM. 國外vps服務器租用 夢飛云服務器租用 版權所有 ? 粵ICP備11019662號

主站蜘蛛池模板: 永定县| 汶川县| 新绛县| 大埔县| 佳木斯市| 淮阳县| 吉水县| 辽中县| 根河市| 龙陵县| 无棣县| 库尔勒市| 大英县| 邢台市| 雷波县| 鸡泽县| 云梦县| 松桃| 兰考县| 邢台市| 青阳县| 西林县| 庆阳市| 容城县| 洮南市| 阜南县| 九寨沟县| 德格县| 呼图壁县| 子洲县| 山丹县| 丘北县| 林周县| 鄂州市| 含山县| 高陵县| 福泉市| 宁波市| 香河县| 扶沟县| 务川|