Flask模板注入梳理

模板開始介紹:

Flask中有許多不同功能的模板,他們之間是相互隔離的地帶,可供引入和使用。

Flask中的模塊

  1. flask?主模塊:包含框架的核心類和函數,如?Flask(應用實例)、request(請求對象)、response(響應對象)、render_template(模板渲染)等。(很多函數其實屬于下面各自的模塊,但是會被 “導入” 到 Flask 主模塊(flask)中,方便開發者直接從?flask?導入使用。)
  2. flask.config:處理應用配置(如密鑰、數據庫連接信息等)。
  3. flask.context:管理請求上下文(requestg)和應用上下文(current_appconfig)。
  4. flask.helpers:提供輔助函數,如?url_for(生成 URL)、flash(消息閃現)等。
  5. flask.blueprints:支持藍圖(Blueprint),用于拆分大型應用為模塊化組件。
  6. flask.templating:模板渲染相關功能,依賴 Jinja2 模板引擎。
  7. flask.wrappers:定義請求(Request)和響應(Response)的封裝類。

比如說我本地搭建的一個簡單靶場:

from flask import Flask
from flask import request
from flask import render_template_stringapp = Flask(__name__)@app.route('/test', methods=['GET', 'POST'])
def test():template = '''<div class="center-content error"><h1>Oops! That page doesn't exist.</h1><h3>%s</h3></div> ''' % (request.url)return render_template_string(template)if __name__ == '__main__':app.debug = Trueapp.run()

就從flask中引入request、render_template_string函數。他們分別定義在什么模塊以及有什么作用可以自行分析一下。

該靶場的漏洞在于render_template_string,將一個用戶可控字符串當作模板內容渲染,就像是往eval()函數中放入用戶可控參數一樣。

但是要想利用這個漏洞,沒有命令注入那么方便,因為Jinja2 模板引擎的安全隔離機制讓我們無法直接引用python內置函數和其他模塊中定義的函數。

在 Flask 中,Jinja2 模板默認可以訪問一些框架預定義的全局變量,例如:

  • {{ config }}:Flask 應用的配置信息(如密鑰、端口等)。
  • {{ request }}:當前請求對象(包含 URL、參數、請求方法等)。
  • {{ g }}:Flask 的全局臨時變量(用于請求生命周期內共享數據)。
  • {{ session }}:當前會話對象(存儲用戶會話數據)。

其實在Jinja2模板中還應該有一些默認導入的python內置函數例如globals()、locals()、vars()等等但是為了安全性不暴露。

所以,我們需要講到沙箱逃逸

通俗來說就是我們現在需要在jinja2模板引擎的安全隔離機制下調用其他模塊的方法甚至是Python內置函數,以此達到各種滲透目的。

先說說怎么調用其他模塊的方法吧。

{{''.__class__.__mro__[1].__subclasses__()}}

  1. ''
    空字符串,是 Python 中?str(字符串)類型的一個實例。

  2. .__class__
    Python 中所有對象都有?__class__?屬性,用于獲取該對象所屬的類。
    這里?''.__class__?會返回字符串的類?str(即?<class 'str'>)。

  3. .__mro__[1]

    • __mro__?是類的屬性,全稱 “Method Resolution Order”(方法解析順序),返回一個元組,包含類的繼承鏈(從當前類到最頂層父類)。
    • 對于?str?類,其繼承鏈是?(str, object)str?繼承自?objectobject?是 Python 中所有類的基類)。
    • __mro__[1]?取元組的第二個元素(索引從 0 開始),即?object?類。
  4. .__subclasses__()
    object?類的?__subclasses__()?方法會返回所有直接或間接繼承自?object?的子類列表(幾乎包含 Python 中所有的類,因為所有類最終都繼承自?object)。

也可以用{{''.__class__.__bases__[0].__subclasses__()}}代替,base僅返回上一級父類。

通過?object.__subclasses__()?獲取的子類列表是全局的,涵蓋 Python 內置類、已導入的第三方庫類、當前項目中定義的類等所有已加載的?object?子類

這個估計幾乎每個講沙箱逃逸都會講一遍原理,所以不過多贅述。通過這個方法呢,我們就可以調用全局的已有類中的方法。舉幾個例子:

1.?文件讀寫類:file?或?io.FileIO

  • 作用:讀取 / 寫入服務器文件(如敏感配置文件、密碼文件等)。
  • 示例

????????假設?file?類在子類列表中的索引為?40(不同環境索引可能不同):

????????# 讀取 /etc/passwd 文件

????????{{''.__class__.__bases__[0].__subclasses__()[40]('/etc/passwd').read()}}

????????若目標是 Windows 服務器,可讀取?C:\Windows\system32\drivers\etc\hosts?等

2.?命令執行類:subprocess.Popen

  • 作用:執行系統命令(如?lswhoamiipconfig?等)。
  • 示例

????????假設?subprocess.Popen?在子類列表中的索引為?258

????????# 執行 ls 命令(Linux)并返回結果
{{''.__class__.__bases__[0].__subclasses__()[258]('ls', shell=True, ????????stdout=-1).communicate()[0].decode()}}

????????# 執行 whoami 命令(查看當前用戶權限)
{{''.__class__.__bases__[0].__subclasses__()[258]('whoami', shell=True, ????????stdout=-1).communicate()[0].decode()}}

????????Windows 系統可替換為?diripconfig?等命令。

但是很多時候沒有可利用的類,就需要進一步逃逸調用python內置函數。

就需要用到globals:

__globals__?是 Python 函數的內置屬性
在 Python 中,每個函數對象都有?__globals__?屬性,它返回該函數定義所在模塊的全局變量字典。這個字典包含了模塊中定義的所有變量、函數、類、導入的模塊等。

這樣的話我們就能利用某些jinja2模板中可以調用的”安全函數“,得到全局變量字典。可是得到全局變量字典,也只是得到本身模塊中的東西呀,如果還是無法利用呢,怎么得到python內置函數呢?

這就需要用到builtins:

builtins?模塊
這是 Python 解釋器內置的核心模塊,包含了所有 Python 內置函數(如?printleneval)、內置類型(如?intstrlist)和異常類(如?ExceptionTypeError)。我們在 Python 中直接使用的?print()str()?等,本質上都是?builtins?模塊中的成員

那得到這個模塊我們就能得到內置函數啦。怎么得到呢?

__globals__?得到的字典中有一個關鍵的東西——導入的模塊,我們知道不管是哪個模塊,那都屬于是python,所以python內置函數就像是基礎設施,幾乎不管哪個模塊,都得利用內置函數實現其功能。因此幾乎所有模塊__globals__屬性返回的字典中都有builtins模塊。

那就出現了類似

url_for.__globals__['__builtins__']['eval']("__import__('os').popen('ls').read()")

這樣的答案。

這里的url_for就是上面說到的可利用的”安全函數“,那萬一沒有呢?

我們就需要結合 ''.__class__.__mro__[1].__subclasses__() 方法啦:

有些類例如warnings.catch_warnings中一定有一個方法,那就是__init__,用來初始化對象。

而__init__也算是函數對象,那不就有__global__屬性了!

因此,就出現了類似

''.__class__.__mro__[1].__subclasses__()[59].__init__.__globals__['__builtins__']['eval']("__import__('os').popen('ls').read()")

這樣的答案。

寫這篇文章主要為了梳理一遍Flask模板注入的原理,一定有一些理解錯誤或者不充分的地方。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/93190.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/93190.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/93190.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

企業級的即時通訊平臺怎么保護敏感行業通訊安全?

聊天記錄存在第三方服務器、敏感文件被誤發至外部群組、離職員工仍能查看歷史消息.對于金融、醫療、政務等對數據安全高度敏感的行業而言&#xff0c;“溝通效率與”信息安全”的矛盾&#xff0c;從未像今天這樣尖銳。企業即時通訊怎么保護敏感行業通訊安全&#xff1f;這個問題…

Java Spring框架最新版本及發展史詳解(截至2025年8月)-優雅草卓伊凡

Java Spring框架最新版本及發展史詳解&#xff08;截至2025年8月&#xff09;-優雅草卓伊凡引言今天有個新項目 客戶問我為什么不用spring 4版本&#xff0c;卓伊凡我今天剛做完項目方案&#xff0c;我被客戶這一句問了有點愣住&#xff0c;Java Spring框架最新版本及發展史詳解…

Android實現Glide/Coil樣式圖/視頻加載框架,Kotlin

Android實現Glide/Coil樣式圖/視頻加載框架&#xff0c;Kotlin <uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE" /><uses-permiss…

【k8s】pvc 配置的兩種方式volumeClaimTemplates 和 PersistentVolumeClaim

pvc配置實例 實例1在Deployment中配置 template:xxxxxxvolumeClaimTemplates:- metadata:name: dataspec:accessModes:- ReadWriteOnceresources:requests:storage: 1GistorageClassName: nfsdev-storageclass (創建好的storageClassName)實例2#先創建一個pvc 然后在 Deploym…

Logistic Loss Function|邏輯回歸代價函數

----------------------------------------------------------------------------------------------- 這是我在我的網站中截取的文章&#xff0c;有更多的文章歡迎來訪問我自己的博客網站rn.berlinlian.cn&#xff0c;這里還有很多有關計算機的知識&#xff0c;歡迎進行留言或…

計算機網絡技術-知識篇(Day.1)

一、網絡概述 1、網絡的概念 兩個不在同一地理位置的主機&#xff0c;通過傳輸介質和通信協議&#xff0c;實現通信和資源共享。 2、網絡發展史 第一階段&#xff08;20世紀60年代&#xff09; 標志性事件&#xff1a;ARPANET的誕生關鍵技術&#xff1a;分組交換技術 第二…

工業元宇宙:邁向星辰大海的“玄奘之路”

一、從認知革命到工業革命&#xff1a;文明躍遷的底層邏輯1.1 認知革命&#xff1a;人類協作的基石時間線&#xff1a;約7萬年前&#xff0c;智人通過語言和想象力構建共同虛擬現實&#xff0c;形成部落協作模式。核心突破&#xff1a;虛構能力&#xff1a;創造神、國家、法律等…

9. React組件生命周期

2. React組件生命周期 2.1. 認識生命周期 2.1.1. 很多事物都有從創建到銷毀的整個過程&#xff0c;這個過程稱之為生命周期&#xff1b;2.1.2. React組件也有自己的生命周期&#xff0c;了解生命周期可以讓我們在最合適的地方完成想要的功能2.1.3. 生命周期和生命周期函數的關系…

【單板硬件開發】關于復位電路的理解

閱讀紫光同創供應商提供的FPGA單板硬件開發手冊&#xff0c;發現復位電路他們家解釋的很通俗易懂&#xff0c;所以分享一下。如下圖&#xff0c;RST_N 是低有效的異步全芯片復位信號&#xff0c;一般外部連接電路有 3 種形式如圖 3–2&#xff0c;可根據實際需要選擇合適的電路…

《Unity Shader入門精要》學習筆記一

1、本書的源代碼 https://github.com/candycat1992/Unity_Shaders_Book 2、第1章 Shader是面向GPU的工作方式 3、第2章 渲染流水線 Shader&#xff1a;著色器 渲染流水線&#xff1a;目標是渲染一張二維紋理&#xff0c;輸入是一個虛擬攝像機、一些光源、一些Shader以及紋…

從零到一:TCP 回聲服務器與客戶端的完整實現與原理詳解

目錄 一、TCP 通信的核心邏輯 二、TCP 服務器編程步驟 步驟 1&#xff1a;創建監聽 Socket 步驟 2&#xff1a;綁定地址與端口&#xff08;bind&#xff09; 步驟 3&#xff1a;設置監聽狀態&#xff08;listen&#xff09; 步驟 4&#xff1a;接收客戶端連接&#xff08…

MyBatis-Plus核心內容

MyBatis-Plus MyBatis-Plus 是一個基于 MyBatis的增強工具&#xff0c;旨在簡化開發過程&#xff0c;減少重復代碼。它在MyBatis的基礎上增加了CRUD操作封裝&#xff0c;條件構造器、代碼生成器等功能。 一、核心特性與優勢 1. 核心特性 無侵入&#xff1a;只做增強不做改變&am…

計算機網絡摘星題庫800題筆記 第4章 網絡層

第4章 網絡層4.1 網絡層概述題組闖關1.在 Windows 的網絡配置中&#xff0c;“默認網關” 一般被設置為 ( ) 的地址。 A. DNS 服務器 B. Web 服務器 C. 路由器 D. 交換機1.【參考答案】C 【解析】只有在計算機上正確安裝網卡驅動程序和網絡協議&#xff0c;并正確設置 IP 地址信…

非root用戶在linux中配置zsh(已解決ncurses-devel報錯)

Zsh&#xff08;Z Shell&#xff09;是一款功能強大的交互式 Unix shell&#xff0c;以其高度可定制性和豐富的功能著稱&#xff0c;被視為 Bash 的增強替代品。它支持智能補全、主題美化、插件擴展&#xff08;如 Oh My Zsh 框架&#xff09;、自動糾錯、全局別名等特性&#…

《Foundations and Recent Trends in Multimodal Mobile Agents: A Survey》論文精讀筆記

論文鏈接&#xff1a;https://arxiv.org/pdf/2411.02006 摘要 文章首先介紹了核心組件&#xff0c;并探討了移動基準和交互環境中的關鍵代表性作品&#xff0c;旨在全面理解研究重點及其局限性。 接著&#xff0c;將這些進展分為兩種主要方法&#xff1a; 基于提示的方法&a…

npm安裝時一直卡住的解決方法

npm install 卡住通常是由于網絡問題或緩存問題導致的。以下是幾種解決方法&#xff1a; 方法1&#xff1a;清理npm緩存 npm cache clean --force npm install方法2&#xff1a;刪除node_modules和package-lock.json重新安裝 rm -rf node_modules package-lock.json npm instal…

[密碼學實戰]使用Java生成國密SM2加密證書等(四十三)

[密碼學實戰]使用Java生成國密SM2加密證書等(四十三) 本文將詳細介紹如何通過Java代碼生成符合國密標準的SM2加密證書,包括密鑰對生成、證書擴展屬性配置、PEM格式保存等關鍵步驟。 一. 運行結果示例 二. 國密算法與加密證書 國密算法(SM系列)是中國自主研發的密碼算法體…

從零開始之stm32之CAN通信

從小白的視角了解并實現簡單的STM32F103的CAN通信&#xff0c;直接上手。一、CAN協議簡介CAN總線上傳輸的信息稱為報文&#xff0c;當總線空閑時任何連接的單元都可以開始發送新的報文&#xff0c;有5種類型的幀&#xff1a;數據幀、遙控幀、錯誤幀、過載幀、幀間隔。數據幀有兩…

Java 課程,每天解讀一個簡單Java之利用條件運算符的嵌套來完成此題:學習成績>=90分的同學用A表示,60-89分之間的用B表示, * 60分以下

package ytr250812;/*題目&#xff1a;利用條件運算符的嵌套來完成此題&#xff1a;學習成績>90分的同學用A表示&#xff0c;60-89分之間的用B表示&#xff0c;* 60分以下*/import java.util.Scanner;public class GradeEvaluator {public static void main(String[] args) …

Word XML 批注范圍克隆處理器

該類用于處理 Word 文檔&#xff08;XML 結構&#xff09;中被批注標記的文本范圍&#xff0c; 實現指定內容的深度克隆&#xff0c;并將其插入到目標節點之后。 適用于在生成或修改 .docx 文件時復制批注內容塊。/*** Word XML 批注范圍克隆處理器* * 該類用于處理 Word 文檔&…