見出し画像

【知識の泉】テンプレートインジェクション

別の記事で玲奈が問題にしてたののの解説です。


🌟「SSTIってなに?」 by リナちゃん🌟

「ねえねえ、リナちゃん!SSTIって何〜?🤔」

綾香が首をかしげながら聞いてくる。

「SSTI!?💡 それはね〜、サーバーサイド・テンプレート・インジェクション(Server-Side Template Injection)の略で!✨ 簡単に言うと、ユーザーが入力したデータが、サーバー側で“そのまま”コードとして実行されちゃうヤバい脆弱性なのだー!!💀⚡

「えぇー!?😱 なんかもう聞いただけでヤバそう!」

「でしょ!?🔥💻 じゃあ、まずは簡単な例からいってみよ〜!🎶」


🌟SSTIの簡単な例💡

リナちゃんはノートPCを開いて、画面を見せる💻✨

「例えばね!PythonのFlaskっていうWebフレームワークで、こんなコードを書いたとするよ!📜💻」

from flask import Flask, request
from jinja2 import Template

app = Flask(__name__)

@app.route("/greet")
def greet():
    name = request.args.get("name", "Guest")
    template = Template("Hello, {{ name }}!")
    return template.render(name=name)

if __name__ == "__main__":
    app.run()

「これ、?name=リナ って入力すると Hello, リナ! って表示される普通のコードに見えるでしょ〜?🤗✨」

「うんうん!🙆‍♀️ これなら大丈夫そう!」

「でもね…… ?name={{ 7*7 }} って入力すると……」

Hello, 49!

「えっ!?🤯 なんで計算されたの!?」

「それがSSTIのヤバさ!!😎🔥 つまり、このサーバーは {{ }} の中に書かれたコードを勝手に実行しちゃうってこと!!⚠️💥」

「えええーっ!?😱 それってやばくない!?」

「やばいよ!!!😤💢 しかも、これだけじゃ済まないんだよ〜?💀✨」


💀 さらにやばいSSTIの使い方 💀

「この状態だとね、もっと強力なコードも実行できちゃうの!😈✨ 例えば、こんなの👇」

{{ config.__class__.__mro__[1].__subclasses__() }}

「これを入力すると、Pythonで動いてるサーバーの すべてのクラス が見えちゃうの!!😲💥」

「えっ!?それって……やばいやつ?😨」

「超ヤバいやつ!!😎✨ 例えば、 subprocess.Popen っていうのを見つけたら……」

{{ self.__init__.__globals__['os'].system('ls -la') }}

「こうやって入力するだけで……サーバーのファイルが丸見え!!📂👀✨

「うわぁぁぁぁ!!😱💦💦」

「しかも、 os.system('rm -rf /') なんて打ったら、サーバーが全部消える😈🔥💀」

「ひええええ!!😱💦💦💦」

「だから、SSTIは超危険!💀⚡💢 ちゃんと対策しないと、サーバーが攻撃者のオモチャになっちゃうんだよ〜!!😤💢💢」


✨SSTIを防ぐには!?🔒

「じゃあ、どうすればSSTIを防げるの?😣💦」

「良い質問!🎶💖 じゃあ、SSTI対策 4つのポイント いくよー!!💪✨」

1. ユーザーの入力を直接テンプレートに渡さない!
 → 変数として使うだけ!評価させない!🙅‍♀️❌

2. テンプレートエンジンの設定を見直す!
 → Jinja2なら autoescape=True を設定!✨

3. WAF(Web Application Firewall)を導入する!
 → 攻撃っぽいリクエストをブロックする!🚧🔐

4. {{ }} を無効化する!
 → エスケープ処理をしっかり入れる!🛑✨

「この4つをやれば、SSTIの被害はほぼ防げる!💪🔥」

「なるほど〜!!💡✨ でも、実際にSSTIでやられた例ってあるの?」

「あるよ!!😎💥 例えば、2016年にGitHub Enterprise の脆弱性!あれはSSTIを利用してサーバーを乗っ取れる っていうヤバいやつだった!」

「えっ!?😨💦 そんな大手でもやられるの!?」

「そう!だから、開発者はSSTIにめっちゃ気をつけないといけないのだー!!⚠️🔥🔥」


🌟まとめ🌟

SSTIは、テンプレートエンジンが悪用される脆弱性!⚠️
コードを勝手に実行されると、サーバー乗っ取りも可能💀
対策は、エスケープ処理&適切な設定!✨🔒

「これで、SSTIのヤバさと対策はバッチリだね!!💪✨」


💡 クライアントサイド・テンプレート・インジェクション(CSTI)ってなに? 🤔💭

そうそう、「テンプレートインジェクション」 にはSSTI(サーバーサイド・テンプレート・インジェクション)だけじゃなくて、クライアントサイド(CSTI, Client-Side Template Injection) っていうのもあるよ!💡💻🔥

「SSTIはサーバー側でコードが実行されるやつだったけど、CSTIはクライアント(つまりブラウザ)で発生するやつ!💻⚠️

「えっ!?😳 じゃあ、JavaScriptのコードが勝手に実行されるってこと?」

「その通り〜!✨🎯 例えば、最近のフロントエンド開発でよく使われるMustache.js とか AngularJS みたいなクライアントサイドのテンプレートエンジンがあるでしょ?」

「うんうん!👀✨ それがどうしたの?」

「もし、それらのテンプレートエンジンにユーザー入力をそのままぶち込んじゃうと、JavaScriptのコードが勝手に実行される ようになっちゃうのだ〜!!💥🔥」


💀 CSTIの危険な例 💀

「例えばね!💻✨ Webアプリの中で、こんなコードがあったとするよ!👇」

var template = "{{user}} さん、こんにちは!";
var compiled = Mustache.render(template, { user: input });
document.getElementById("greeting").innerHTML = compiled;

「このコードは、本来なら input にユーザーの名前を入れて、「○○さん、こんにちは!」 って表示するだけのつもりだったんだけど……」

「だけど?🤔💦」

「もし攻撃者が input に {{7*7}} って入れたら……」

「49 さん、こんにちは!」

「……えっ!?🤯 まさか、これも計算されちゃうの!?💦」

「そーなの!😱💥 これはまだ可愛いほうで、もし {{alert('ハッキング成功!')}} なんて入れたら……」

「えっ、まさか……!?😨💦」

🚨 「ハッキング成功!」っていうアラートが表示される!!💥💻⚠️

「うわぁぁぁ!!😱💦💦💦」

「つまり、CSTIを利用すると、Webページ内で好きなJavaScriptコードを実行できちゃうの!💀✨」

「……ってことは、XSS(クロスサイトスクリプティング)と同じ感じ?🤔」

「おっ!いい質問!💡✨ CSTIは、「テンプレートエンジンを悪用する形のXSS」 って考えると分かりやすいかも!🎯」


🛑 CSTIの対策! 🔒✨

「じゃあ、どうすればCSTIを防げるの?🥺💦」

「ふふふ、リナちゃんに任せるのだ〜!💪✨ 対策ポイントはこれ!👇」

1. ユーザーの入力をテンプレートエンジンに直接渡さない!
 → 「データバインド」は慎重にすること!🛑⚠️

2. {{ }} を無効化する or サニタイズする!
 → AngularJSなら $sce.trustAsHtml() を慎重に使う!

3. クライアントサイドテンプレートを使うなら、WAFを導入!
 → 危険な入力をフィルタリングする!🚧🔐

4. 必要ないなら、クライアントサイドのテンプレートエンジンを使わない!
 → そもそもリスクを減らすのが一番!😎✨

「この4つをやれば、CSTIの危険はグッと減るのだー!!🎯✨💖」


🌟 CSTIとSSTIの違い! 👀💡

🔹 SSTI(サーバーサイド・テンプレート・インジェクション)

  • 実行場所:サーバー側 🏢💻

  • 影響範囲:サーバー全体が乗っ取られる可能性大!💀

  • 具体的なリスク:データ漏洩、システムコマンド実行、サーバー破壊😨

  • 対策:エスケープ処理を徹底、テンプレートの設定変更、WAF導入 🔒🚧

  • 危険度:超ヤバい(サーバー破壊や全データ流出もありえる!)💥💀⚠️

🔹 CSTI(クライアントサイド・テンプレート・インジェクション)

  • 実行場所:ブラウザ側 🌐💻

  • 影響範囲:ページ改ざんやXSS攻撃のリスク⚠️

  • 具体的なリスク:JavaScriptの実行、Cookie盗難、フィッシング詐欺😨

  • 対策:エスケープ処理を徹底、クライアントサイドのテンプレートエンジンの設定変更、WAF導入 🔒🚧

  • 危険度:XSSレベル(情報漏洩やページ改ざんのリスクあり)⚡


「✨ こんな感じで、SSTIはサーバーを攻撃される超ヤバいやつ、CSTIはブラウザ側のXSSみたいなやつ! ってことが分かればOKだよ〜!!💡🔥💖」

「うわぁ……😨💦 どっちもちゃんと対策しないと大変なことになるんだね!」

「そーなの!😎💡 だから開発するときは、「テンプレートエンジンって入力を勝手に処理するんだ!」 って意識するのが大事!!🔥💪💻」


🌟 まとめ 🌟

SSTI(サーバーサイド)サーバーが乗っ取られる危険💀⚠️
CSTI(クライアントサイド)XSS攻撃みたいにJavaScript実行される!⚡
どっちもエスケープ処理をしっかりするのが大事!✨🔒

「これで、SSTIとCSTIの違いはバッチリだね!🎯✨」

「リナちゃん、ありがと〜!!」

「えへへ〜🎶 リナちゃん、頑張ったもんね!!😆💖✨ みんなも、SSTIには気をつけてねー!!🚀🔥💻✨」

いいなと思ったら応援しよう!