搜尋
首頁後端開發Python教學解析Python新型字串格式漏洞及解決方案

解析Python新型字串格式漏洞及解決方案

Aug 16, 2017 pm 01:47 PM
python字串漏洞

最近一個python字串格式化的漏洞引起了我的注意,今天就來說一下Python引入的一種格式化字符串的新型語法的安全漏洞進行了深入的分析,並提供了相應的安全解決方案。

當我們對不可信的用戶輸入使用str.format的時候,將會帶來安全隱患——對於這個問題,其實我早就知道了,但是直到今天我才真正意識到它的嚴重性。因為攻擊者可以利用它來繞過Jinja2沙盒,這會造成嚴重的資訊外洩問題。同時,我在本文最後部分為str.format提供了一個新的安全版本。

需要提醒的是,這是一個相當嚴重的安全隱患,這裡之所以撰文介紹,是因為大多數人很可能不知道它是多麼容易被利用。

核心問題

從Python 2.6開始,Python受.NET啟發而引入了一種格式化字串的新型語法。當然,除了Python之外,Rust及其他一些程式語言也支援這種語法。借助於.format()方法,該語法可以應用到位元組和unicode字串(在Python 3中,只能用於unicode字串)上面,此外,它還能映射為更具有可自訂性的string. Formatter API。

 該語法的一個特點是,人們可以透過它來確定字串格式的位置和關鍵字參數,並且隨時可以明確地對資料項目重新排序。此外,它甚至可以存取物件的屬性和資料項目——這是導致這裡的安全問題的根本原因。

 總的來說,人們可以利用它來進行以下事情:

>>> 'class of {0} is {0.__class__}'.format(42)
"class of 42 is "

實質上,任何能夠控制格式字串的人都有可能存取物件的各種內部屬性。

問題出在哪裡?

第一個問題是,如何控制格式字串。可以從下列地方下手:

1.字串檔案中不可信的翻譯器。我們很可能透過它們得手,因為許多被翻譯成多種語言的應用程式都會用到這種新式Python字串格式化方法,但是並非所有人都會對輸入的所有字串進行全面的審查。

2.使用者暴露的配置。 由於一些系統使用者可以對某些行為進行配置,而這些配置有可能以格式字串的形式被揭露出來。需要特別提示的是,我就看過某些使用者可以透過網路應用程式來設定通知郵件、日誌訊息格式或其他基本範本。

危險等級

如果只是向該格式字串傳遞C解釋器物件的話,倒是不會有太大的危險,因為這樣的話,你最多會暴露一些整數類之類的東西。

然而,一旦Python物件傳遞給這種格式字串的話,那就麻煩了。這是因為,能夠從Python函數暴露的東西的數量是相當驚人的。 下面是假想的Web應用程式的情形,這種情況下能夠洩露密鑰:

 

CONFIG = {
    'SECRET_KEY': 'super secret key'
}
 
class Event(object):
    def __init__(self, id, level, message):
        self.id = id
        self.level = level
        self.message = message
 
def format_event(format_string, event):
    return format_string.format(event=event)

如果用戶可以在這裡注入format_string,那麼他們就能發現下面這樣的秘密字符字串:

{event.__init__.__globals__[CONFIG][SECRET_KEY]}

將格式化作沙箱化處理

那麼,如果需要讓其他人提供格式化字串,那該怎麼辦呢? 其實,可以利用某些未公開的內部機制來改變字串格式化行為。

from string import Formatter
from collections import Mapping
 
class MagicFormatMapping(Mapping):
    """This class implements a dummy wrapper to fix a bug in the Python
    standard library for string formatting.
 
    See http://bugs.python.org/issue13598 for information about why
    this is necessary.
    """
 
    def __init__(self, args, kwargs):
        self._args = args
        self._kwargs = kwargs
        self._last_index = 0
 
    def __getitem__(self, key):
        if key == '':
            idx = self._last_index
            self._last_index += 1
            try:
                return self._args[idx]
            except LookupError:
                pass
            key = str(idx)
        return self._kwargs[key]
 
    def __iter__(self):
        return iter(self._kwargs)
 
    def __len__(self):
        return len(self._kwargs)
 
# This is a necessary API but it's undocumented and moved around
# between Python releases
try:
    from _string import formatter_field_name_split
except ImportError:
    formatter_field_name_split = lambda \
        x: x._formatter_field_name_split()
{C} 
class SafeFormatter(Formatter):
 
    def get_field(self, field_name, args, kwargs):
        first, rest = formatter_field_name_split(field_name)
        obj = self.get_value(first, args, kwargs)
        for is_attr, i in rest:
            if is_attr:
                obj = safe_getattr(obj, i)
            else:
                obj = obj[i]
        return obj, first
 
def safe_getattr(obj, attr):
    # Expand the logic here.  For instance on 2.x you will also need
    # to disallow func_globals, on 3.x you will also need to hide
    # things like cr_frame and others.  So ideally have a list of
    # objects that are entirely unsafe to access.
    if attr[:1] == '_':
        raise AttributeError(attr)
    return getattr(obj, attr)
 
def safe_format(_string, *args, **kwargs):
    formatter = SafeFormatter()
    kwargs = MagicFormatMapping(args, kwargs)
    return formatter.vformat(_string, args, kwargs)

現在,我們就可以使用safe_format方法來取代str.format了:

>>> '{0.__class__}'.format(42)
""
>>> safe_format('{0.__class__}', 42)
Traceback (most recent call last):
  File "", line 1, in
AttributeError: __class__

總結:

程式開發中有這麼一句話:任何時候不要相信用戶的輸入!現在看來這句話說得非常有道理。所以各位同學要謹記!

以上是解析Python新型字串格式漏洞及解決方案的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Python和時間:充分利用您的學習時間Python和時間:充分利用您的學習時間Apr 14, 2025 am 12:02 AM

要在有限的時間內最大化學習Python的效率,可以使用Python的datetime、time和schedule模塊。 1.datetime模塊用於記錄和規劃學習時間。 2.time模塊幫助設置學習和休息時間。 3.schedule模塊自動化安排每週學習任務。

Python:遊戲,Guis等Python:遊戲,Guis等Apr 13, 2025 am 12:14 AM

Python在遊戲和GUI開發中表現出色。 1)遊戲開發使用Pygame,提供繪圖、音頻等功能,適合創建2D遊戲。 2)GUI開發可選擇Tkinter或PyQt,Tkinter簡單易用,PyQt功能豐富,適合專業開發。

Python vs.C:申請和用例Python vs.C:申請和用例Apr 12, 2025 am 12:01 AM

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。Python以简洁和强大的生态系统著称,C 则以高性能和底层控制能力闻名。

2小時的Python計劃:一種現實的方法2小時的Python計劃:一種現實的方法Apr 11, 2025 am 12:04 AM

2小時內可以學會Python的基本編程概念和技能。 1.學習變量和數據類型,2.掌握控制流(條件語句和循環),3.理解函數的定義和使用,4.通過簡單示例和代碼片段快速上手Python編程。

Python:探索其主要應用程序Python:探索其主要應用程序Apr 10, 2025 am 09:41 AM

Python在web開發、數據科學、機器學習、自動化和腳本編寫等領域有廣泛應用。 1)在web開發中,Django和Flask框架簡化了開發過程。 2)數據科學和機器學習領域,NumPy、Pandas、Scikit-learn和TensorFlow庫提供了強大支持。 3)自動化和腳本編寫方面,Python適用於自動化測試和系統管理等任務。

您可以在2小時內學到多少python?您可以在2小時內學到多少python?Apr 09, 2025 pm 04:33 PM

兩小時內可以學到Python的基礎知識。 1.學習變量和數據類型,2.掌握控制結構如if語句和循環,3.了解函數的定義和使用。這些將幫助你開始編寫簡單的Python程序。

如何在10小時內通過項目和問題驅動的方式教計算機小白編程基礎?如何在10小時內通過項目和問題驅動的方式教計算機小白編程基礎?Apr 02, 2025 am 07:18 AM

如何在10小時內教計算機小白編程基礎?如果你只有10個小時來教計算機小白一些編程知識,你會選擇教些什麼�...

如何在使用 Fiddler Everywhere 進行中間人讀取時避免被瀏覽器檢測到?如何在使用 Fiddler Everywhere 進行中間人讀取時避免被瀏覽器檢測到?Apr 02, 2025 am 07:15 AM

使用FiddlerEverywhere進行中間人讀取時如何避免被檢測到當你使用FiddlerEverywhere...

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。