A1: インジェクション

OWASP Top Ten には以下の記述があります:

SQL、NoSQL、OS、LDAP インジェクションなどのインジェクションの欠陥は、信頼できないデータがコマンドまたはクエリの一部としてインタプリタに送信された場合に発生します。攻撃者の敵対的なデータは、インタプリタをだまして意図しないコマンドを実行したり、適切な承認なしにデータにアクセスしたりする可能性があります。

インジェクション攻撃はさまざまな形で発生する可能性があります。このラボにおける Web アプリケーションは サーバーサイドテンプレートインジェクション (Server Side Template Injection, SSTI) の影響を受けやすくなっています。SSTI 攻撃は、Jinja などのサーバーサイドのテンプレートエンジンを使用しているWebアプリケーションで一般的に使用されます。攻撃者がテンプレートに埋め込まれた入力を安全でない方法で送信し、サーバー上でリモートコード実行 (Remote Code Execution, RCE) が発生する可能性がある場合に発生します。

権限昇格による RCE は、攻撃者が個人識別情報(PII)の漏洩やサービス拒否などの悪意のある行為をシステム上で行う可能性があるため、特に危険です。

それがどのように機能するか見てみましょう。

  1. ウェブアプリケーションのURLを開き、OWASP Top 10 Examplesをクリックし、メニューバーからA1: Injectionを選択します。 a1-select

  2. 非常に単純なページで、あなたの名前を尋ねて、送信時にそれをレンダリングすることが確認できます。badguyって入力してみてください。 a1-test

  3. テンプレートエンジンは、特別な HTML マークアップを使用して、コードがデータを動的に挿入できる場所を示します。Jinja テンプレートは、変数や演算子などを展開/処理し結果を表示するために二重中括弧 {{}}を使用します。乗算の有効なPython構文である {{8*8}} を入力して、任意のコードを実行できるかどうかを試してみましょう。 a1-test-success

  4. サーバーが実際にコードを実行し、64 という正しい結果を返したことがわかります。これにより、Web アプリケーションが SSTI 経由で悪用可能であることが攻撃者に検証されます。Pythonのノウハウがある攻撃者はより有害なコードを実行することができます。Flaskのrequestオブジェクトを利用し、Pythonの osライブラリ をインポートしてリモートコマンドを実行できます。このコードをフォームに貼り付けてみてください : {{request.application.__globals__.__builtins__.__import__('os').popen('ls').read()}}。このコードにより、ユーザーはアプリケーションのカレントディレクトリを list (ls) することができます。 a1-list

  5. 攻撃者がWebアプリケーションのディレクトリを一覧表示できるようになったため、攻撃者はシステムのより興味深い部分を覗いて、それがどのように機能するかを知ることができます。app.py という名前のファイルは、明らかに彼らが見たいものです。このコードをフォームに貼り付けてみてください。{{request.application.__globals__.__builtins__.__import__('os').popen('cat app.py').read()}}a1-read-app

チャレンジ1: インジェクションでさらにダメージを与えることができますか?Web アプリケーションをシャットダウン できる適切な任意のコードを探してみてください。達成したら、502 Gateway Timeout エラーページをインストラクターと共有します。