前回の最後にディレクトリ内のファイル一覧や、「/etc/passwd」が表示されていましたが、なぜ表示されたのでしょうか?
結論から話すとOSコマンドの実行が行われていたからです。
SSIインジェクションは設定によってはOSコマンドも実行可能な非常に危険な脆弱性であることを認識しておく必要があります。
まずはSSIでOSコマンドが実行可能な設定を確認しましょう。
※実は前の設定でもOSコマンド実行できると思っていたというのは内緒です。
設定ファイルを見てみると以下のとおり、SSIの環境構築で設定した内容からLoadModulleが1行追加されています。
ApacheでCGI用が使用できるようにmoduleを追加しましただけです。
※Apache2.4系からCGIを動作させるためにはmoduleを追加しないとだめになったみたいですね。
これでApacheを再起動すると、SSIでOSコマンドを動作させることが可能です。
元々ディレクトリ設定は以下のとおり「Options Includes」となっているため、SSIの全てのオプションを使用することが可能でした。
なのでCGIを有効にするだけで、OSコマンドの実行が可能です。2.2系以下では「mod_cgid.so」をLoadModuleで追加しなくても「Options Includes」になっていれば動くかもしれません(こちらについては検証していません。)
どうやってSSIインジェクションでOSコマンドを実行していたか?
それはものすごい簡単で、「<!–#exec cmd=”ls” –>」(OSコマンド「ls」の実行)や「<!–#exec cmd=”cat /etc/passwd” –>」(catコマンドで「/etc/passwd」を表示)を実行していただけです。
SSIオプション等は以下を参考にして頂くのがいいかと思います。
さて、「ls」や「/etc/passwd」だけではそんなに面白くないとか、大丈夫そうじゃんと思う方もいるかもしれません。
※OSコマンドの実行ができるので何ができるかは理解できる方がほとんどかと思いますが・・・
具体的に以下の手順入力を行った際の挙動を見てみましょう。
既存のディレクト内のファイルは以下となっています。
では先ほどのブラウザのフォームに「<!–#exec cmd=”echo ‘<?php phpinfo(); ?>’ > test2.php” –>」を入力して「送信」ボタンを押します。
そして再度ディレクト内のファイルを確認すると、以下のとおり「test2.php」というphpファイルができています。
次にブラウザから「http://192.168.70.131/test2.php」にアクセスすると以下の画面が表示されます。
理解できた方がほとんどだと思いますが、外部からWebサーバに対してプログラムファイルを作成できているのです。
今回の中身はphpinfo()を表示させるだけでしたが、これがeval()であった場合、バックドアを設置されたようなものです。(というかバックドア)
SSIの対策
①まずは本当にWebサーバでSSIを使用する必要があるのかをまずは検討する必要があります。使用しない場合はApacheの設定を書き換え、SSIを動作しないようにすることがSSIインジェクションには一番有効な対策であると考えます。
②次にオプションを書き換え、コマンドの実行等を抑制し、実行できるファイルも限定するということです。今回は検証用でしたので、.phpファイルで動作させるようにしましたが、公開しているサイトでは絶対してはいけません。拡張子を限定している場合(.shtmlのみにする等)でも、ファイルアップロードに不備があった場合は同じようにSSIインジェクションを実行される可能性があるので、アプリケーション全体で気を付ける必要があります。
③基本的な入力値対策を行うということです。今回の例ですと、以下のような基本的なHMTLの特殊文字に対するエスケープ処理をしていれば、SSIインジェクションは発現しません。
下記のようにサーバの時刻を表示させる「<!-–#echo var=”DATE_LOCAL” -–>」と入力しても、SSIとして解釈されず、そのまま出力されます。
ブラウザのソースを見ると以下のようになっており、実体参照で処理されています。
SSIインジェクションはほとんど見ない脆弱性ですが、意外と身近なところに潜んでいるかもしれません。私はOSコマンドが動くパターンを一度だけですが見たことがあります。
過去にはSSIインジェクションがきっかけで情報漏洩も発生しています。
今一度、自分の管理するサーバの設定を見直してみる必要があるかもしれません。
皆様の管理するサーバが安全でより快適に動作していければ幸いです。
質問や不明点等あれば、コメントやツイッター等でご連絡頂ければ幸いです。
※記事に関しては定期的に見直しをして、何かあれば修正等を行いますので、ご指摘ください。
コメント