SSTI模版注入

1、概念

SSTI是一種常見的Web安全漏洞,它允許攻擊者通過注入惡意模板代碼,使服務器在渲染模板時執行非預期的操作。

(1)渲染模版

至于什么是渲染模版:服務器端渲染模板是一種Web開發技術,它允許在服務器端動態生成HTML頁面或其他格式的輸出內容,而不是在客戶端(瀏覽器)生成。這種技術的核心是模板引擎,它允許開發者將動態內容嵌入靜態模板中,從而生成最終的頁面

<1>模版引擎的作用

模版引擎的主要作用是將模板(一種包含占位符的靜態文件)與數據(動態內容)結合生成最終的輸出內容。

<2>模版引擎的功能:

變量替換:將模板中的占位符替換為實際的數據。

條件語句:根據條件動態生成內容。

循環語句:根據數據集合生成重復的內容。

模版繼承:允許一個模板繼承另一個模板的結構。

而常見的模版引擎有:Django、jinja2、Twig、EJS

<3>服務器端渲染模版的工作原理

假設有一個Web應用,用戶訪問某個頁面時,服務器需要動態生成HTML內容。

服務器端渲染模板的基本工作流程為:

用戶請求頁面:用戶通過瀏覽器發送HTTP請求,請求某個頁面。

服務器接收請求:服務器接收到請求后,解析請求參數。

加載模版文件:服務器加載預定義的模板文件,模板文件中包含占位符。

數據綁定:服務器將動態數據綁定到模板中的占位符

生成最終內容:模板引擎將模板和數據結合,生成最終的HTML內容。

返回響應:服務器將生成的HTML內容返回給瀏覽器,瀏覽器渲染并顯示頁面。

<4>示例 (使用Python的Jinja2模板引擎)

假設此刻有一個簡單的web應用,使用Flask框架和Jinja2模板引擎來動態生成HTML頁面。

模版文件(template.html

<!DOCTYPE html>
<html>
<head><title>{{ title }}</title>
</head>
<body><h1>{{ heading }}</h1><p>{{ content }}</p>
</body>
</html>

這個模板文件中包含了三個占位符:{{title}}、{{heading}} 和 {{content}}。

假如在Jinja2模版中,我們用Python代碼這樣來渲染文件(app.py):

from flask import Flask, render_templateapp = Flask(__name__)@app.route('/')
def index():# 動態數據data = {'title': 'My Page','heading': 'Welcome to My Page','content': 'This is a dynamic content.'}# 使用render_template渲染模板return render_template('template.html', **data)if __name__ == '__main__':app.run(debug=True)

在這個代碼中:

1、render_template 函數 將模板文件? template.html? 和動態數據 data 結合起來。

2、模板引擎會將 {{title} 替換為 "My Page",? {{"heading"}}? 替換為 'Welcome to My Page' , {{'content'}} ? 替換為 'This is a dynamic content'

3、最終生成的HTML內容會發送給瀏覽器。

然后當我們訪問這個Web應用時,瀏覽器會收到以下HTML內容:

<!DOCTYPE html>
<html>
<head><title>My Page</title>
</head>
<body><h1>Welcome to My Page</h1><p>This is a dynamic content.</p>
</body>
</html>

這個過程就是服務器端渲染模板。?

(2)非預期操作

而非預期操作又指的是什么呢:別看這些詞這么高大尚,其實通俗的講就是指在軟件或系統中執行的、未被設計或預期的操作。(非預期操作)在Web安全領域,非預期操作通常是指攻擊者通過漏洞或缺陷,使應用程序執行了開發者未預期的操作.

<1>非預期操作的類型

信息泄露:攻擊者通過漏洞獲取服務器上的敏感信息,如配置文件內容、環境變量等。

代碼執行:攻擊者通過漏洞執行任意代碼,從而控制服務器。

權限提升:攻擊者通過漏洞提升系統權限,進一步控制服務器。

拒絕服務攻擊(Dos):攻擊者通過漏洞使服務器無法正常提供服務。

輸入驗證不足、錯誤邏輯實現、配置錯誤都是非預期操作的成因。

<2>示例(還是使用Python的Jinja2模板引擎)

同樣假設我們有一個簡單的Web應用,允許用戶輸入一些內容,然后將這些內容顯示在頁面上。但是,我們沒有對用戶輸入進行過濾。

模版文件(template.html)

給一個html模版:

<!DOCTYPE html>
<html>
<head><title>User Input</title>
</head>
<body><p>You entered: {{ user_input }}</p>
</body>
</html>

Python代碼(app.py):

from flask import Flask, request, render_templateapp = Flask(__name__)@app.route('/')
def index():# 獲取用戶輸入user_input = request.args.get('input', '')# 渲染模板并顯示用戶輸入return render_template('template.html', user_input=user_input)if __name__ == '__main__':app.run(debug=True)

兩種情況:

1、正常情況

如果用戶通過URL? /?input=Hello? 訪問頁面,頁面會顯示:

<!DOCTYPE html>
<html>
<head><title>User Input</title>
</head>
<body><p>You entered: Hello</p>
</body>
</html>

2、非預期操作

如果用戶通過URL? /?inpput={{5+3}}?? 訪問頁面,Jinja2模板引擎會執行 5+3 ,頁面會顯示:

<!DOCTYPE html>
<html>
<head><title>User Input</title>
</head>
<body><p>You entered: 8</p>
</body>
</html>

這是開發者未預期的操作,因為用戶輸入的模板代碼被模板引擎執行了,所以叫非預期操作。

那么要是再嚴重一點:

如果用戶通過URL? /?input={{config.items}}? 訪問頁面,Jinja2模板引擎會執行? config.items() ,可能會返回應用程序的配置信息,導致信息泄露。

2、SSTi的原理

之前說模板引擎允許開發者將動態內容嵌入到靜態模板中,以便生成最終的HTML頁面或其他格式的輸出。but,如果沒有對用戶輸入進行嚴格的驗證和過濾,攻擊者可以注入惡意的模板代碼,從而在服務器端執行一系列操作(非預期,不可知)。

3、SSTI的危害

所以總的來說還是有三個危害:

信息泄露

代碼執行

權限提升

4、分類

SSTI 漏洞主要分為兩類:簡單的模板注入復雜的模板注入

(1)簡單模版注入

攻擊者直接注入模板代碼,使服務器在渲染模板時執行惡意操作

(2)復雜模版注入

攻擊者通過構造復雜的模板代碼,繞過應用程序的輸入驗證和過濾機制。

5、例題

NSSCTF

【HDCTF 2023】SearchMeaster

啟動

你可以使用POST請求給我發送DATA

也不知道發送什么,注意到題目search,用dirsearch掃描一下目錄

結果掃了一下又沒掃出來

那就還是用nikto掃一下ip

可以看到Target IP 為1.14.71.254

結果還是沒連上

后面在端口前面加冒號:就連上了(我也納悶,在kali里有時候接端口是空格,冒號不行,有時候又得冒號,但物理機url包是冒號的)

可以看到有一個composer.json可用

訪問一下

直接得到提示是smart模版

說明存在ssti模版注入

?返回原頁面傳? data={? ,報錯,證明存在RCE漏洞(報錯表明模板引擎嘗試解析執行了我傳遞的模板代碼。)因為之前說過RCE漏洞是應用調用代碼執行函數系統命令執行函數,導致遠程代碼執行系統命令執行 ,這里典型的是嘗試執行命令然后無果

這樣一來就可以利用SSTI模版注入結合RCE漏洞執行命令來達到目的了

想確認smart模版的話試試{4*4}是否能回顯16

可以看到有16,無疑存在smart模版 (沒被騙haha)

那直接構造payload就可以了

data={if system('ls /f*')}{/if}

smart模版引擎的條件語法

{if} {/if} 標簽

{if}:開始條件判斷;

{/if}:結束條件判斷

在該模版引擎中執行 system函數 system()不用說了

'ls /f*':要執行的系統命令,用于列出? /f* (f字符開頭,用于提高查找flag的效率)目錄下的文件

?執行后得到flag路徑

繼續替換system命令即可

data={if system('cat /flag_13_searchmaster')}{/if}

get flag

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

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

相關文章

關于點膠機的精度

一、精度&#xff1a; 1:X/y軸定位精度常通在5個絲左右&#xff0c;Z軸在3個絲左右&#xff0c; 如果采用伺服電機絲桿配置&#xff0c;可提升至于個2絲左右。 2&#xff1a;膠水控制精度&#xff1a;通過噴閥驅動器&#xff0c;氣壓等參數&#xff0c;實現膠量控制&#xf…

gitee推送更新失敗問題記錄:remote: error: hook declined to update refs/heads/master

問題描述&#xff1a; gitee推送更新時&#xff0c;提示&#xff1a; 解決方法&#xff1a; 登錄Gitee&#xff0c;進入【個人主頁】 點擊【個人設置】 更改郵箱的配置&#xff0c;如下&#xff1a; 更改“禁止命令行推送暴露個人郵箱”&#xff0c;將其關閉&#xff1a;

Java如何獲取電腦分辨率?

以下是一個 Java 程序示例&#xff0c;用于獲取電腦的主屏幕分辨率&#xff1a; import java.awt.*; public class ScreenResolutionExample { public static void main(String[] args) { // 獲取默認的屏幕設備 GraphicsDevice device GraphicsEnvironm…

WPF 3D圖形編程核心技術解析

一、三維坐標系系統 WPF采用右手坐標系系統&#xff0c;空間定位遵循&#xff1a; X 軸 → 右 Y 軸 → 上 Z 軸 → 觀察方向 X軸 \rightarrow 右\quad Y軸 \rightarrow 上\quad Z軸 \rightarrow 觀察方向 X軸→右Y軸→上Z軸→觀察方向 三維坐標值表示為 ( x , y , z ) (x, y,…

【庫(Library)、包(Package)和模塊(Module)解析】

在Python中&#xff0c;**庫&#xff08;Library&#xff09;、包&#xff08;Package&#xff09;和模塊&#xff08;Module&#xff09;**是代碼組織的不同層級&#xff0c;而import語句的導入行為與它們密切相關。以下是詳細對比和解釋&#xff1a; &#x1f4e6; 1. 核心概…

裸機上的 printf:在無操作系統環境下構建 C 標準庫

在嵌入式開發和底層系統編程領域&#xff0c;裸機開發是一項極具挑戰性但又至關重要的任務。想象一下&#xff0c;在沒有操作系統支持的情況下&#xff0c;讓 C 語言的標準庫函數&#xff0c;如printf正常工作&#xff0c;這聽起來是不是很有趣又充滿挑戰&#xff1f;今天&…

基于STM32F103的智能機械臂識別與控制項目(課件PPT+源代碼)

以下是基于 STM32F103 的智能機械臂識別與控制項目的詳細介紹&#xff1a; 項目概述 該項目以 STM32F103 為核心控制器&#xff0c;結合多種傳感器和技術&#xff0c;實現了機械臂的智能識別與控制功能&#xff0c;可完成倉庫貨物的識別、搬運等任務&#xff0c;并支持多種控…

Codeforces Round 1023 (Div. 2)

Dashboard - Codeforces Round 1023 (Div. 2) - Codeforces 一個構造問題&#xff0c;我把最大的數放在一個數組&#xff0c;其余數放在另一個數組&#xff0c;就能保證gcd不同 來看代碼&#xff1a; #include <bits/stdc.h> using namespace std;int main() {int t;ci…

6.01 Python中打開usb相機并進行顯示

本案例介紹如何打開USB相機并每隔100ms進行刷新的代碼,效果如下: 一、主要思路: 1. 打開視頻流、讀取幀 self.cam_cap = cv2.VideoCapture(0) #打開 視頻流 cam_ret, cam_frame = self.cam_cap.read() //讀取幀。 2.使用定時器,每隔100ms讀取幀 3.顯示到Qt的QLabel…

JVM——即時編譯

分層編譯模式&#xff1a;動態平衡啟動速度與執行效率 分層編譯是現代JVM&#xff08;如HotSpot、GraalVM&#xff09;實現高性能的核心策略之一&#xff0c;其核心思想是根據代碼的執行熱度動態選擇不同的編譯層次&#xff0c;實現啟動速度與運行效率的最佳平衡。以HotSpot虛…

Auto DOP:讓并行執行實現智能調優 | OceanBase 實踐

隨著數據量的迅速增長&#xff0c;企業數據庫往往面臨著一個困局&#xff1a;復雜的分析查詢需要充分的資源來保證性能&#xff0c;但過多增加并行執行又會造成資源競爭&#xff0c;影響系統穩定性。傳統基于DBA人工干預的并行度調節機制&#xff0c;既低效又難以適應動態變化的…

【區塊鏈】Uniswap之滑點(Slippage)

一、滑點是什么&#xff1f; 滑點&#xff08;Slippage&#xff09;是指你下單預期價格和最終成交價格之間的差距。 在 DEX 中&#xff0c;你的交易會影響池子的價格&#xff08;AMM機制&#xff09;&#xff0c;所以&#xff1a; 下單越大&#xff0c;滑點越大&#xff1b;…

[前端]Javascript獲取元素寬度

元素寬度屬性對比示意圖 ---------------------------------- | 外邊距&#xff08;margin&#xff09; | -------------------------------- | | 邊框&#xff08;border&#xff09; | | | -------------------------- | | | …

數字人驅動/動畫方向最新頂會期刊論文收集整理 | AAAI 2025

會議官方論文列表&#xff1a;https://ojs.aaai.org/index.php/AAAI/issue/view/624 以下論文部分會開源代碼&#xff0c;若開源&#xff0c;會在論文原文的摘要下方給出鏈接。 語音驅動頭部動畫/其他 EchoMimic: Lifelike Audio-Driven Portrait Animations through Editabl…

Windows系統下【Celery任務隊列】python使用celery 詳解(一)

Celery 是一個基于 Python 的分布式任務隊列框架&#xff0c;它允許你在不同的進程甚至不同的服務器上異步執行任務。 特點 簡單&#xff1a;易于使用和配置&#xff0c;提供了簡潔的 API。高可用&#xff1a;支持任務的可靠交付&#xff0c;即使在出現故障時也能保證任務不丟…

移動設備常用電子屏幕類型對比

概述 LCD 家族 &#xff08;TN、STN、TFT、IPS、VA&#xff09;依賴背光&#xff0c;性能差異主要來自液晶排列和驅動方式。OLED 以自發光為核心優勢&#xff0c;但成本與壽命限制其普及。E-Paper 專為低功耗靜態顯示設計&#xff0c;與傳統屏幕技術差異顯著。 參數LCD&#…

Vue3.5 企業級管理系統實戰(十八):用戶管理

本篇主要探討用戶管理功能&#xff0c;接口部分依然是使用 Apifox mock 模擬。 1 用戶 api 在 src/api/user.ts 中添加用戶相關 CRUD 接口&#xff0c;代碼如下&#xff1a; //src/api/user.ts import request from "/api/config/request"; // 從 "./type&q…

【C】初階數據結構14 -- 歸并排序

本篇文章主要是講解經典的排序算法 -- 歸并排序 目錄 1 遞歸版本的歸并排序 1&#xff09; 算法思想 2&#xff09; 代碼 3&#xff09; 時間復雜度與空間復雜度分析 &#xff08;1&#xff09; 時間復雜度 &#xff08;2&#xff09; 空間復雜度 2 迭代版本的歸并…

【相機標定】OpenCV 相機標定中的重投影誤差與角點三維坐標計算詳解

摘要&#xff1a; 本文將從以下幾個方面展開&#xff0c;結合典型代碼深入解析 OpenCV 中的相機標定過程&#xff0c;重點闡述重投影誤差的計算方法與實際意義&#xff0c;并通過一個 calcBoardCornerPositions() 函數詳細講解棋盤格角點三維坐標的構建邏輯。 在計算機視覺領域…

RabbitMQ-運維

文章目錄 前言運維-集群介紹多機多節點單機多節點 多機多節點下載配置hosts?件配置Erlang Cookie啟動節點構建集群查看集群狀態 單機多節點安裝啟動兩個節點再啟動兩個節點驗證RabbitMQ啟動成功搭建集群把rabbit2, rabbit3添加到集群 宕機演示仲裁隊列介紹raft算法協議 raft基…