SSTI(Server-Side Template Injection)攻撃について
SSTI(Server-Side Template Injection)攻撃は、Webアプリケーションがテンプレートエンジンを使用して動的なコンテンツを生成する際に、ユーザーからの入力を適切に処理せずにテンプレート内で評価してしまうことによって発生する脆弱性です。攻撃者は、この脆弱性を利用して、テンプレートエンジン内で任意のコードを実行し、サーバーの制御を乗っ取ったり、機密データにアクセスしたりすることができます。
脆弱なコード:
<?php
$template = $_GET['template'];
echo eval("?> $template <?php ");
?>
攻撃手法:
攻撃者がtemplate
パラメータに<?= system('whoami'); ?>
のようなコードを挿入すると、そのコードがサーバー上で実行され、whoami
コマンドの結果が表示されます。
脆弱なコード:
from flask import Flask, request, render_template_string
app = Flask(__name__)
@app.route('/')
def index():
template = request.args.get('template')
return render_template_string(template)
if __name__ == '__main__':
app.run()
攻撃手法:
攻撃者は、template
パラメータにのようなコードを送信すると、Jinja2テンプレートエンジンによって計算され、`49`という結果が表示されます。さらに、
のようなコードを利用して、アプリケーションの設定情報を漏洩させることも可能です。
脆弱なコード:
const express = require('express');
const app = express();
const pug = require('pug');
app.get('/', (req, res) => {
const template = req.query.template;
const compiledFunction = pug.compile(template);
res.send(compiledFunction());
});
app.listen(3000);
攻撃手法:
攻撃者は、template
パラメータに${process.env}
のようなコードを挿入して送信すると、環境変数の内容が表示される可能性があります。また、process.exit()
などのコードを使用して、サーバーを停止させることも可能です。
脆弱なコード:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.stereotype.Controller;
import org.thymeleaf.context.Context;
import org.thymeleaf.TemplateEngine;
@Controller
public class SSTIController {
private final TemplateEngine templateEngine;
public SSTIController(TemplateEngine templateEngine) {
this.templateEngine = templateEngine;
}
@GetMapping("/")
public String index(@RequestParam String template) {
Context context = new Context();
return templateEngine.process(template, context);
}
}
攻撃手法:
Thymeleafテンプレートエンジンでは、template
パラメータに[[${T(java.lang.Runtime).getRuntime().exec('whoami')}
のようなコードを挿入することで、任意のシステムコマンドを実行できる可能性があります。
まとめ: SSTI攻撃は、テンプレートエンジンを使用してユーザー入力を処理する際に発生する可能性がある脆弱性です。ユーザー入力の厳格なサニタイズ、テンプレートエンジンの適切な使用、コンテンツセキュリティポリシーの設定などを通じて、この脆弱性を防ぐことが可能です。どの言語やフレームワークでも、これらの防止策を適用することが推奨されます。