ssti模板注入學習

ssti模板注入原理

ssti模板注入是一種基于服務器的模板引擎的特性和漏洞產生的一種漏洞,通過將而已代碼注入模板中實現的服務器的攻擊

模板引擎

為什么要有模板引擎

在web開發中,為了使用戶界面與業務數據(內容)分離而產生的,它可以生成特定格式的文檔,用于網站的模板引擎就會生成一個標準的HTML文檔。在不同的技術領域下有很多模板引擎,比如php和c等等都有各自的模板引擎

模板定義

模板是一種包含占位符和靜態內容的文本文件,占位符用于表示在運行時將被動態替換的數據或執行的邏輯。例如,在一個 HTML 模板中,可能會有{{ name }}這樣的占位符,用于表示用戶的姓名。

模板的渲染和替換

當應用程序需要生成最終的頁面或文檔時,模板引擎會讀取模板文件,并根據提供的數據將占位符替換為實際的值。同時,模板引擎還會執行模板中定義的各種邏輯,如循環、條件判斷等,最終生成完整的 HTML 或其他格式的文檔發送給客戶端。以{{name}}為例在模板引擎渲染的過程中,name這個字符串就可能被動態數據內容替換,或者在進行一定邏輯運算之后產生新的字符串,例如在HTML文檔中,如果提供了名為name且值為 “張三” 的數據,那么渲染之后的效果就是{{張三}}

原理

模板引擎有很多種類型,例如最簡單的置換型,從名稱上我們也可以大致推斷他的用處,還有復雜一點的解釋型、編譯型等等模板引擎。不同的模板引擎可以應用于不同的場景。

使用場景

模板引擎可以讓(網站)程序實現界面與數據分離,業務代碼與邏輯代碼的分離,這就大大提升了開發效率,良好的設計也使得代碼重用變得更加容易。還能實現其他類的功能。

ssti模板注入產生的原因

程序可能在沒有經過完善的驗證和過濾的情況下,將用戶的輸入直接嵌入到模板中或者作為參數嵌入到模板引擎中,如果用戶輸入包含惡意代碼,可能造成意想不到的代碼執行效果。

用大白話舉個例子:網站程序可能給你提供了向網站輸入數據的途徑,但是對于你的輸入,網站對他的處理不是很到位,導致你的輸入可能經過模板引擎渲染之后執行了,產生了一些效果,或者是你的輸入直接破壞了模板,導致之后沒達到渲染效果或者是敏感信息泄露、getshell等等問題。

所以在了解完產生原因之后我們肯定也知道了,對于不同的模板,他的邏輯可能不一樣,表達的字符串也可能不一樣,各種方面都可能不一樣;所以對于不同的模板,注入的代碼可能也不一樣,注入的形式可能也不一樣……

ssti一般的注入過程

注入前

了解注入網站程序的模板信息、編程語言等等;在之后注入時構造payload時要根據這兩個方面進行。

了解一些模板引擎的特點和性質等等,比如python的jinja2,php的Smarty、Twig和Blade,java的Thymeleaf 和Velocity 等等,后面用的flask框架用的就是python的jinja2

注入

根據搜集到的信息構造payload,例如,在 Jinja2 中,可以使用{{ }}來包裹表達式,使用{% %}來包裹控制語句。{{ config['SECRET_KEY'] }}可以用于獲取 Flask 應用程序的密鑰。? ? ? ? ??? ? ? ? ?{{ __import__('os').system('ls -la') }}可以在服務器上執行ls -la命令,列出當前目錄下的文件和目錄信息。

找到注入點,可能是登錄注冊的輸入欄,也可能時評論的輸入欄等等,如果有源碼,可以進行代碼審計找到注入點,或者通過其他辦法找到注入點。

Flask

定義

Flask是一個使用?Python?編寫的輕量級?Web 應用框架。其?WSGI?工具箱采用 Werkzeug ,模板引擎則使用 Jinja2 。Flask使用 BSD 授權。

由于塔容易上手,我們使用這個來嘗試一下ssti漏洞。

這是一個簡單的py代碼,調用了flask庫

from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():return '你好'
if __name__ == '__main__':app.run()

代碼的用途可以去了解一下,我們運行這個代碼,在本地網址5000端口可以看到回顯

我們嘗試搭建一個用來測試ssti模板注入的網站

from flask import Flask, request, render_template_string
app = Flask(__name__)@app.route('/safe')
def safe():name = request.args.get('name', 'World')if any(char in name for char in ['{', '}', '%', '#']):name = '非法輸入'template = '<h1>安全頁面:你好,{{ name }}!</h1>'return render_template_string(template, name=name)@app.route('/unsafe')
def unsafe():name = request.args.get('name', 'World')template = f'<h1>不安全頁面:你好,{name}!</h1>'return render_template_string(template)@app.route('/danger')
def danger():expr = request.args.get('expr', '2+2')try:result = eval(expr)except Exception as e:result = f"錯誤: {str(e)}"template = f'<h1>表達式結果: {result}</h1>'return render_template_string(template)if __name__ == '__main__':app.run(host='0.0.0.0', port=8080, debug=True)

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

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

相關文章

NVMe簡介2

共分2部分&#xff0c;這里是第2部分。 NVMe數據結構 NVMe協議中規定每個提交命令的大小為64字節&#xff0c;完成命令大小為16字節&#xff0c;NVMe命令分為Admin和IO兩類&#xff0c;NVMe的數據塊組織方式有PRP和SGL兩種。提交命令的格式如圖5所示。 圖5 提交命令數據格 N…

高壓啟動電路--學習記錄

常見反激的啟動電路 優點&#xff1a;電路設計簡單&#xff0c;價格便宜 缺點&#xff1a;損壞大&#xff0c;輸入寬范圍的時候&#xff0c;為了保證低壓能正常啟動&#xff0c;啟動電阻阻值需要選小&#xff0c;那么高壓時損耗會非常大&#xff0c;設計的不好很容易在高壓時損…

VS打印printf、cout或者Qt的qDebug等傳出的打印信息

在vs中打印printf、cout或者Qt的qDebug等常見的打印信息有時也是必要的&#xff0c;簡單的敘述一下過程&#xff1a; 1、在vs中打開你的解決方案。 2、鼠標移動到你的項目名稱上&#xff0c;點擊鼠標右鍵&#xff0c;再點擊屬性&#xff0c;此刻會此項目的屬性頁。 3、在配置…

蒼穹外賣--新增菜品

1.需求分析和設計 產品原型 業務規則&#xff1a; 菜品名稱必須是唯一的 菜品必須屬于某個分類下&#xff0c;不能單獨存在 新增菜品時可以根據情況選擇菜品的口味 每個菜品必須對應一張圖片 接口設計&#xff1a; 根據類型查詢分類(已完成) 文件上傳 新增菜品 根據類型…

如何高效集成MySQL數據到金蝶云星空

MySQL數據集成到金蝶云星空&#xff1a;SC采購入庫-深圳天一-OK案例分享 在企業信息化建設中&#xff0c;數據的高效流轉和準確對接是實現業務流程自動化的關鍵。本文將聚焦于一個具體的系統對接集成案例——“SC采購入庫-深圳天一-OK”&#xff0c;詳細探討如何通過輕易云數據…

【springcloud學習(dalston.sr1)】使用Feign實現接口調用(八)

該系列項目整體介紹及源代碼請參照前面寫的一篇文章【springcloud學習(dalston.sr1)】項目整體介紹&#xff08;含源代碼&#xff09;&#xff08;一&#xff09; &#xff08;一&#xff09;Feign的理解 前面文章【springcloud學習(dalston.sr1)】服務消費者通過restTemplat…

SpringbBoot nginx代理獲取用戶真實IP

為了演示多級代理場景&#xff0c;我們分配了以下服務器資源&#xff1a; 10.1.9.98&#xff1a;充當客戶端10.0.3.137&#xff1a;一級代理10.0.4.105&#xff1a;二級代理10.0.4.129&#xff1a;三級代理10.0.4.120&#xff1a;服務器端 各級代理配置 以下是各級代理的基本配…

實驗九視圖索引

設計性實驗 1. 創建視圖V_A包括學號&#xff0c;姓名&#xff0c;性別&#xff0c;課程號&#xff0c;課程名、成績&#xff1b; 一個語句把學號103 課程號3-105 的姓名改為陸君茹1&#xff0c;性別為女 &#xff0c;然后查看學生表的信息變化&#xff0c;再把上述數據改為原…

typeof運算符和深拷貝

typeof運算符 識別所有值類型識別函數判斷是否是引用類型&#xff08;不可再細分&#xff09; //判斷所有值類型 let a; typeof a //undefined const strabc; typeof str //string const n100; typeof n //number const …

NAT/代理服務器/內網穿透

目錄 一 NAT技術 二 內網穿透/內網打洞 三 代理服務器 一 NAT技術 跨網絡傳輸的時候&#xff0c;私網不能直接訪問公網&#xff0c;就引入了NAT能講私網轉換為公網進行訪問&#xff0c;主要解決IPv4(2^32)地址不足的問題。 1. NAT原理 當某個內網想訪問公網&#xff0c;就必…

Git的安裝和配置(idea中配置Git)

一、Git的下載和安裝 前提條件&#xff1a;IntelliJ IDEA 版本是2023.3 &#xff0c;那么配置 Git 時推薦使用 Git 2.40.x 或更高版本 下載地址&#xff1a;CNPM Binaries Mirror 操作&#xff1a;打開鏈接 → 滾動到頁面底部 → 選擇2.40.x或更高版本的 .exe 文件&#xf…

【教程】Docker更換存儲位置

轉載請注明出處&#xff1a;小鋒學長生活大爆炸[xfxuezhagn.cn] 如果本文幫助到了你&#xff0c;歡迎[點贊、收藏、關注]哦~ 目錄 背景說明 更換教程 1. 停止 Docker 服務 2. 創建新的存儲目錄 3. 編輯 Docker 配置文件 4. 遷移已有數據到新位置 5. 啟動 Docker 服務 6…

PostgreSQL 配置設置函數

PostgreSQL 配置設置函數 PostgreSQL 提供了一組配置設置函數&#xff08;Configuration Settings Functions&#xff09;&#xff0c;用于查詢和修改數據庫服務器的運行時配置參數。這些函數為數據庫管理員提供了動態管理數據庫配置的能力&#xff0c;無需重啟數據庫服務。 …

sql server 2019 將單用戶狀態修改為多用戶狀態

記錄兩種將單用戶狀態修改為多用戶狀態&#xff0c;我曾經成功過的方法&#xff0c;供參考 第一種方法 USE master; GO -- 終止所有活動連接 DECLARE kill_connections NVARCHAR(MAX) ; SELECT kill_connections KILL CAST(session_id AS NVARCHAR(10)) ; FROM sys.dm_ex…

主機A向主機B發送一個長度為L字節的文件,假設TCP的MSS為1460字節,則在TCP的序號不重復使用的前提下,L的最大值是多少?

&#x1f4d8;題干回顧&#xff1a; 主機A向主機B發送一個長度為L字節的文件&#xff0c;假設TCP的MSS為1460字節&#xff0c;則在TCP的序號不重復使用的前提下&#xff0c;L的最大值是多少&#xff1f; 這個問題關鍵在于“TCP序號不重復使用”。 ? 正確答案是&#xff1a;D.…

一次因校時服務器異常引起的性能差異分析

一次因校時服務器異常引起的性能差異分析 一.背景知識1. **TSC 頻率**:硬件級高精度計時2. **gettimeofday**:用戶態時間接口3. **adjtimex**:系統時鐘的軟件校準4. **`clock_adjtime(CLOCK_REALTIME, {modes=ADJ_TICK})`**: 用于修改系統時鐘中斷間隔(`tick` 值)。5. 關系…

acwing 4275. Dijkstra序列

題目背景 輸入 輸出 完整代碼 #include<bits/stdc.h> using namespace std; int n,m,k,a[1010],dist[1010],g[1010][1010],st[1010];int dij(int u){memset(st,0,sizeof st);memset(dist,0x3f,sizeof dist);dist[u]0;for(int i0;i<n;i){int ta[i];for(int j1;j<n;…

[思維模式-37]:什么是事?什么是物?什么事物?如何通過數學的方法闡述事物?

一、基本概念 1、事&#xff08;Event) “事”通常指的是人類在社會生活中的各種活動、行為、事件或情況&#xff0c;具有動態性和過程性&#xff0c;強調的是一種變化、發展或相互作用的流程。 特點 動態性&#xff1a;“事”往往涉及一系列的動作、變化和發展過程。例如&a…

Linux常用命令40——alias設置命令別名

在使用Linux或macOS日常開發中&#xff0c;熟悉一些基本的命令有助于提高工作效率&#xff0c;alias命令來自英文單詞alias&#xff0c;中文譯為“別名”&#xff0c;其功能是設置命令別名信息。我們可以使用alias將一些較長的命令進行簡寫&#xff0c;往往幾十個字符的命令會變…

310. 最小高度樹

題目 樹是一個無向圖&#xff0c;其中任何兩個頂點只通過一條路徑連接。 換句話說&#xff0c;任何一個沒有簡單環路的連通圖都是一棵樹。 給你一棵包含 n 個節點的樹&#xff0c;標記為 0 到 n - 1 。給定數字 n 和一個有 n - 1 條無向邊的 edges 列表&#xff08;每一個邊都…