konekto Inc with PHP , MySQL コネクト株式会社 技術情報コンテンツ


[[セキュリティ指針]]

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

説明

OSコマンドインジェクションとは、特殊記号の使用により意図しないコマンドを埋め込まれることによって発生する問題を指す。 OSコマンドインジェクションは、PHP上でOSのコマンドを使用しない限りは、発生しない問題だが、実際に発生してしまうとPHPのユーザ(多くはWebサーバの権限)上でできる操作をすべて行えてしまうので非常に危険である。

被害例

たとえば、Post後、設定したディレクトリを圧縮する次のような処理があったとする。

$dirname = $_POST['dirname'];
system("tar zcvf $dirname");

この場合に、外部からの入力変数 $_POST['dirname']が"hoge || rm -rf /"などとなっていた場合、UNIX上ではPHPの動作権限で、すべてのファイルが消されてしまう。

対策

以下の文字列を削除もしくは含まれていた場合はエラーとする。

  • bashの場合
    ;
    |
    &
    ``
    $
    <
    >
  • cmd.exeの場合
    ||
    &
    &&

コーディング手法

  • 上記、被害例に対する対策
    $dirname = $_POST['dirname'];
    $S_dirname = preg_replace('[;|&`$<>]','',$dirname);
    system("tar zcvf $S_dirname");
    //このコードにはディレクトリトラバーサル問題があります。詳細はディレクトリトラバーサルの項を参照

注意点

escapeshellcmd関数という、これらをエスケープする関数が準備されているがこれらは完全ではない、自分でサニタイジングを行う必要がある。


最終更新のRSS