タイトルには、XFF ヘッダーを読み取るための API が提供されています。ページの下部に Build With Smarty という文字があります。Smarty エンジンで記述されていると判断できます。
基本的には OK このページで SSTi の可能性を判断します
xff ヘッダーを 127.0.0.1 から 127.0.0{1 2} に変更すると、次の結果が表示されます。
ssti は間違いなく
最終ペイロードは
XX-Forwarded-For: {if var_dump(file_get_contents(' /flag')) }{/if }
Smarty は PHP をベースに開発されています。フラスコの一般的な SSTI とは大きく異なります。
通常、「{$smarty.version}」と入力すると、返された Smarty のバージョン番号を確認できます。このトピックの Smarty バージョンは 3.1.30です。
Smarty は、ラップされたコードを実行するための {php}{/php} タグの使用をサポートしています。 php コマンドを使用する場合、最も一般的な考え方は、最初にタグをテストすることです。ただし、このトピックに関する限り、{php}{/php} タグを使用するとエラーが報告されます:
Smarty3 の公式マニュアルには次の説明があります:
Smarty は {php} タグを非推奨にしたため、使用しないことを強くお勧めします。 Smarty 3.1 では、{php} は SmartyBC でのみ使用できます。
この質問では Smarty クラスを使用しているため、別の方法を見つけるしかありません。
公式マニュアルではこのタグについて次のように説明されています。
{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 の関数はすべて使用できるので、これを使用して実行してみてはいかがでしょうか私たちのコード?
冒頭で述べたように
display("string:".$ip); }Smarty テンプレートの代わりに文字列が使用されていることがわかります。これにより、挿入された Smarty タグが直接解析されて実行され、SSTI が発生します。
以上がSmarty SSTiの使い方の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。