Edgio Blog

OSコマンドインジェクション、その攻撃手法と対策を分かりやすく解説

ウェブサイトやウェブアプリに脆弱性があると、攻撃者が入力欄に不正なコマンドを入力されて想定しない動作をさせることができてしまいます。その結果、サーバー内の機密情報を漏洩させたり、サーバーを乗っ取ったりすることができてしまいます。これを「OSコマンドインジェクション」といいます。その被害の内容と対策を、詳しく解説しましょう。

OSコマンドインジェクションとは

ウェブサイトやウェブアプリには、お問い合わせフォームなど入力を必要とする画面があります。「OSコマンドインジェクション」はウェブサイトやウェブアプリに存在する脆弱性を突いた攻撃の一種です。ウェブサーバーへ入力するデータの中にOSへのコマンド(命令)を紛れ込ませて挿入(Injection:インジェクション)し、不正に実行させることを言います。

OSコマンドインジェクション攻撃の流れ

OSコマンドインジェクション攻撃の流れを説明しましょう。 OSコマンドインジェクションの説明図
  1. 攻撃者はウェブサイトのお問い合わせフォームやウェブアプリの入力欄に、攻撃の内容を含む文字列を入力して送信します。ウェブサイトやウェブアプリでは入力されたデータを処理しようとしますが、そこに脆弱性があると、含まれた攻撃の内容をそのまま処理してOSへのコマンドにしてしまいます。そしてそれがシェルに受け渡されると、自動的にコマンドが実行され、攻撃が成功します。
  2. 攻撃が成功すると、機密情報の流出などが発生します。
  3. また、サーバーそのものを乗っ取られ、マルウェアの感染源となったりDoS攻撃(Denial of Service attack)やDDoS攻撃(Distributed Denial of Service attack)の踏み台となったりします。
 

OSコマンドインジェクションで起こる被害

OSコマンドインジェクション攻撃を受けた場合、以下のような被害が想定されます。深刻な場合は、ウェブサイトの閉鎖やウェブアプリの利用中止の必要が生じます。

情報流出

サーバー内に保存されているファイルにアクセスできた場合、アカウント情報などの機密情報やサーバーの設定情報が閲覧できてしまいます。また、それらを閲覧するだけでなく、メールで送信する、不特定多数にばらまくといった情報流出が発生する可能性があります。

サーバー内データの改ざん・削除、暗号化

ファイルを閲覧されるだけでなく、ファイルやデータベースを勝手に編集されてしまったり、別のファイルと置き換えられたり、削除されたりしてしまいます。また、必要なファイルを勝手に暗号化されて復号できなくされるかもしれません。

アクセス権の変更

攻撃者がファイルやディレクトリへのアクセス権限を変更してしまい、正規のアクセス権を持っているのにファイルが閲覧できなくなったり、サーバーが動かなくなったりしてしまいます。

マルウェアへの感染

コンピュータウイルスやトロイの木馬などマルウェアの感染源にさせられ、アクセス者を感染させてしまいます。それと同時にサーバー自体もマルウェアに感染させられてしまいます。

サーバーの乗っ取り、攻撃の踏み台

ログイン情報を盗まれるとサーバー自体を乗っ取られ、バックドアを設置されるなど、攻撃者のやりたい放題にされてしまいます。そして、DoS(Denial of Service)攻撃やDDoS(Distributed Denial of Service)攻撃、SPAMメールの送信など、踏み台として悪用されるようになります。

OSコマンドインジェクションへの対策は

OSコマンドインジェクションへの対策は、ウェブサイトやウェブアプリを開発する段階で行う必要があります。順に説明しましょう。

サニタイジング(エスケープ処理)を実施する

OSコマンドインジェクションは、ウェブサイトやウェブアプリが入力された値をそのまま処理しようとすることで生じます。そのため、HTMLタグや本文に頻出する特定の文字に対してサーバー側で「サニタイジング(sanitizing、無害化)」と呼ばれる処理を行います。具体的には、Webページの表示に影響する特別な記号文字を、「HTMLエンティティ」と呼ばれる文字列に置換、または除去します。 サニタイジングが必要な文字としては、以下などが挙げられます。
サニタイジング前の文字 HTMLエンティティ 文字の役割

<

&lt;

タグの開始

>

&gt;

タグの終了

&

&amp;

エンティティや文字参照の開始

&quot;

属性の値の開始や終了

&#39;

特殊文字をそのまま表示
 

入力値を制限する(バリデーションチェック) 

特定の文字以外の入力を受け付けないよう、フィールドの入力値に対して制限を設定することを「バリデーションチェック(validation check)」といいます。例えば生年月日や電話番号、郵便番号であれば数字だけ、しかも文字数制限もできますので、正しく設定していればコマンドが紛れ込むことはありません。 これら2つの対応はクロスサイトスクリプティング(XSS)対策にもなります。詳しくはこちらのページをご覧ください。

OSコマンドを呼び出し可能な関数を使わない

ウェブサイトやウェブアプリで利用される言語の中には、OSコマンドを呼び出し可能な関数を持っているものがあります。それらを使わない、もしくは代替の安全な関数を使用するようにします。

Perl

system()、open()、eval() など

Java

Runtime.getRuntime().exec()、ProcessBuilder()

php

system()、exec()、passthru()、shell_exec()、popen()、pcntl_exec() など

Ruby

system()、exec()、IO.popen() など

サニタイジング用の関数を使う

phpであれば「htmlspecialchars」関数を使うこと、Rubyであればcgi/escapeメソッドを使うことで簡単にサニタイジングができます。また、ウェブサイト構築でよく使われるCMS(Contents Management System)であるWordPressには、スクリプトタグを自動削除してくれる機能が実装されています。

WAFを導入する

WAFとは「Web Application Firewall」のことで、ウェブサイトやウェブアプリへのアクセスを監視し、攻撃を検知・防御するセキュリティソリューションです。HTTP通信やHTTPS通信の内容を監視し、OSコマンドインジェクションで扱われるような不正な入力データを検知したときは通信を遮断してくれます。万が一ウェブサイトやウェブアプリに脆弱性が潜んでいたとしても、WAFがあれば対処できます。 最近では「クラウド型WAF」と呼ばれるサービスが登場したりSaaSメニュー内にWAF機能が追加されたりして、以前よりも安価に導入・運用できるようになっています。

まとめ

今回は、OSコマンドインジェクションについて説明しました。OSコマンドインジェクションはウェブサイトやウェブアプリに存在する脆弱性を突く攻撃です。それによる被害は情報漏洩だけでなく、サーバー内データの改ざんや削除、マルウェアへの感染、ウェブサーバーの乗っ取りや他のサーバーへの攻撃の踏み台になるなど多岐にわたります。 OSコマンドインジェクションの対策としては、「サニタイジング処理」「バリデーションチェック」「OSコマンドを呼び出し可能な関数を使わない」といった方法がありますが、いずれもウェブサイトやウェブアプリが開発済み、運用中であれば改修が必要となります。また、ウェブサイトやウェブアプリには未知の脆弱性が隠れている可能性もあり、その間にゼロデイ攻撃を受けてしまうと防ぐことはできません。 それらへの攻撃を防御するWAFの導入は、もはや必須と言ってもよいでしょう。中でもクラウド型WAFは導入・運用の負荷が他の2つのタイプよりも格段に低く、高い柔軟性を備えています。