PHP上でshellコマンドを実行する方法|実行演算子とshell_exec()

エディタPHP

こんにちは。いっとくです!

現在Webエンジニアとして働いているわけですが、プログラミングは本当に奥が深くて、どんどん知らないことが出てきます。

業務で使う内容はほとんど同じことの繰り返しなので、現場でも変えない限りはあまり新しいことに出会うことはないのですが、技術書とかを読むと全然知らなかったぜ、、、みたいなことが多々あります。

ということで最近読んだパーフェクトPHPで知ったことについてアウトプットしていきます!

その名も実行演算子!

スポンサーリンク

実行演算子の使い方

実行演算子は`(バッククォート)でコマンドを囲んであげることで実行することができます。

以下が使用例

<?php

// バッククォートでコマンドを囲んであげます
$command = `pwd`;

echo $command; // /Applications/MAMP/htdocs/PerfectPHP/outputs

現在のディレクトリを出力するpwdを変数に格納してechoすると、見事にプログラムが動いているディレクトリが出力されました。

それと同時に僕が普段MAMPでいじっていることもバレてしまいましたね。

ちなみにこちらの実行演算子は関数のshell_execと全く同じ挙動をします。

<?php

$command = `pwd`;

echo $command; // /Applications/MAMP/htdocs/PerfectPHP/outputs

// shell_execは関数なので、シングルクォートで囲みます。
$shellCommand = shell_exec('pwd');

echo $shellCommand; // /Applications/MAMP/htdocs/PerfectPHP/outputs

実行演算子の知識を入れた後に、shell_execを使おうとするとそのままの勢いでバッククォートを使いそうになってしまいますが、こちらは関数なので普通にシングルクォートで囲みます。

ちなみにそもそもコマンド自体に詳しくないこともあって具体的な使い道とか何が便利になるか等の実用性のあるアイディアは思いついていないので、知っている人いたら教えてー!

コマンドを実行する系のものはOSコマンドインジェクションに気をつけよう

コマンドを実行する系の関数は使い方に気をつけないと、セキュリティリスクになります。

特に、ユーザーからの入力値を使ってコマンドを実行するような処理を作ってしまうのはかなり危険です。

以下の例を見てみましょう。

<?php

// ユーザーの入力した値を変数に入れる
$user_input = 'input';

// 変数の値を元に現在のディレクトリにディレクトリを作り、そのディレクトリ内にimportant.phpというファイルを作成している
$command = `mkdir $user_input ; cd $user_input ; touch important.php`;

あくまで極端な例なのですが、上記のプログラムではユーザーが入力した値の名前でディレクトリを作成し、その中にめっちゃ重要なファイルimportant.phpを作っています。

しかし、悪意が持ったユーザーが入力値をコマンドに使っていることに気づくと、入力値の中にコマンドを突っ込むことができるようになるのです。

上記の例だと、ユーザーが入力画面で input ; cd ../ rm -rf ./* (このコマンドは危険なので絶対に試さないでくださいね!フリとかじゃなくて使うディレクトリ間違えるとPC動かなくなります)みたい文字列を入力されると、実行したファイルの一個上にあるファイルが全部消滅します。

というか今、本当に動くかどうか試してみたところ、MAMPのhtdocsの中身が全消去され、important.phpだけが作成されるという可哀想な事になりました。

死んだMAMP
死んだMAMP

セブ島でプログラミングを勉強していた時のデータが全て消し飛んだので、割とショックがデカい。就活の時に使っていた思い出のポートフォリオサイトも消し飛びました。笑

なんでディレクトリ一個上げちゃったんだろ…へへへ。

まぁ、気を取り直して解説に戻ります。

上みたいな感じでファイルを消去されるならまだ不幸中の幸いです。(よくないけど)

むしろ悪意があるユーザーなら、設定ファイル覗いてDBから個人情報抜き取ったり、サイト内に罠を仕掛けたりと、より悪質なことがいくらでもできてしまう状況になるので、かなーーーーーり気をつけて実装しましょう!

こういった設計者が意図していなかったコマンドを突っ込む攻撃のことを「OSコマンドインジェクション」といい、実際に世の中で使われている攻撃手法です。

かなり深刻な被害を出しやすいので、コマンドを使う関数に外部の情報は持たないようにするのが一番ですね。

以上、今回はPHP内でシェルコマンドを扱える実行演算子とshell_execについてでした!

OSコマンドインジェクションには気をつけましょう!あと本当に動くか試そうとして自爆するインジェクションにも気をつけましょう。

さいなら!

コメント

タイトルとURLをコピーしました