ホームページ  >  記事  >  運用・保守  >  Smarty SSTiの使い方

Smarty SSTiの使い方

WBOY
WBOY転載
2023-05-15 11:37:061029ブラウズ

タイトルの説明

タイトルには、XFF ヘッダーを読み取るための API が提供されています。ページの下部に Build With Smarty という文字があります。Smarty エンジンで記述されていると判断できます。

基本的には OK このページで SSTi の可能性を判断します

Smarty SSTi怎么用

xff ヘッダーを 127.0.0.1 から 127.0.0{1 2} に変更すると、次の結果が表示されます。

ssti は間違いなく

Smarty SSTi怎么用

最終ペイロードは

XX-Forwarded-For: {if var_dump(file_get_contents(' /flag')) }{/if }

Smarty SSTi怎么用

Smarty SSTI 活用法

Smarty は PHP をベースに開発されています。フラスコの一般的な SSTI とは大きく異なります。

脆弱性の確認

通常、「{$smarty.version}」と入力すると、返された Smarty のバージョン番号を確認できます。このトピックの Smarty バージョンは 3.1.30です。

Smarty SSTi怎么用

一般的な使用法

Smarty は、ラップされたコードを実行するための {php}{/php} タグの使用をサポートしています。 php コマンドを使用する場合、最も一般的な考え方は、最初にタグをテストすることです。ただし、このトピックに関する限り、{php}{/php} タグを使用するとエラーが報告されます:

Smarty SSTi怎么用

Smarty3 の公式マニュアルには次の説明があります:

Smarty は {php} タグを非推奨にしたため、使用しないことを強くお勧めします。 Smarty 3.1 では、{php} は SmartyBC でのみ使用できます。

この質問では Smarty クラスを使用しているため、別の方法を見つけるしかありません。

{literal} タグ

公式マニュアルではこのタグについて次のように説明されています。

{literal} はテンプレート領域の文字をそのまま出力します。これは、ページ上の Javascript または CSS スタイルシートが Smarty 区切り文字によって誤って解析されないように保護するためによく使用されます。

次に、php5 環境の場合、

<script language="php">phpinfo();</script>

を使用して PHP コードの実行を実装できますが、この質問の質問環境は PHP7 であるため、この方法は無効です。

静的メソッド

Smarty クラスを self 経由で取得し、その静的メソッドを呼び出してファイルを読み書きする方法は、インターネット上の多くの記事で採用されています。

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 オブジェクトを作成してこのメ​​ソッドを呼び出すと、多くの記事で指定されているペイロードの形式は {self::getStreamVariable("file:///etc/passwd")} になります。ただし、このペイロードを使用すると、次のエラーが発生します:

致命的エラー: キャッチされません --> Smarty コンパイラ: テンプレート "string: 現在の IP:{self::getStreamVariable('file:///etc/passwd')}" 静的クラス 'self' は未定義であるか、セキュリティ設定によって許可されていません <-- /var/www/html/ にスローされますSmarty/libs/sysplugins/smarty_internal_templatecompilerbase.php 12 行目

この古いバージョンの Smarty の SSTI 利用方法は、新しいバージョンの Smarty には適用できないことがわかります。さらに、この静的メソッドは Smarty バージョン 3.1.30 で正式に削除されました。これらの記事でシェルを作成するために言及されている Smarty_Internal_Write_File クラスの writeFile メソッドは、同じ理由で使用できません。

{if} タグ

公式ドキュメントで次の説明を見ました:

Smarty の {if}条件付き判断と PHP の if is非常によく似ていますが、いくつかの機能が追加されているだけです。各 {if} には、一致する {/if} が必要です。{else}{elseif} も使用できます。すべて||、or、&&、is_array() などの PHP の条件式や関数が if 内で使用できます。

PHP の関数はすべて使用できるので、これを使用して実行してみてはいかがでしょうか私たちのコード?

冒頭で述べたように

質問の脆弱性コードはgetshell後にファイルを読み込まれますが、この質問のSSTIを引き起こすコードは以下のように簡略化されています。

display("string:".$ip);
}

Smarty テンプレートの代わりに文字列が使用されていることがわかります。これにより、挿入された Smarty タグが直接解析されて実行され、SSTI が発生します。

以上がSmarty SSTiの使い方の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。