Help us understand the problem. What is going on with this article?

【初学者向け】セキュリティ対策入門[番外編①]〜OSコマンドインジェクション編〜

前提

確認環境

以下と同様です。
【初学者向け】セキュリティ対策入門⓪〜環境構築編〜

本シリーズの目的

以下と同様です。
【初学者向け】セキュリティ対策入門⓪〜環境構築編〜

本記事の目標

OSコマンドインジェクションの概要、原因、対策について理解することです。

本記事を読み進める上での必要事項

以下の内容を終えていることです。
【初学者向け】セキュリティ対策入門⓪〜環境構築編〜

どうでもいいお話

あまり主要ではない脆弱性についてはこちらの番外編で扱っていきます。主要ではないというのは被害ケースをあまり耳にしないという意味で、脆弱性をつかれたときの被害が少ないというわけではないので悪しからず。

概要

OSコマンドについて不正な命令を入れ込むことです。こちらのSQLインジェクションがSQL文について不正な命令を入れ込むことならば、こちらはOSコマンドというわけです。

実際に見てみましょう。とはいえ、番外編なのでGitHubにソースはないので本記事上で紹介します。

実際に見てみよう

<?php

$file_list = shell_exec("ls {$_GET['param']}");
echo $file_list;

PHPファイルでOSコマンドを実行したい場合、shell_execという関数を使う必要があります。

では、実際にどういった場合に被害が発生するかというと、| {任意のOSコマンド}のような文字列をクエリストリングスのparamに与えられたときです。OSコマンドについて学んだことがある方なら、これのやばさが伝わると思います。自由なOSコマンドが使えれば任意のファイルを書き換えたり削除したり様々な被害をもたらすことが可能です。

めちゃくちゃ恐ろしいですね。

原因

入力値をそのままOSコマンドの一部に渡していることです。

対策

そもそも使わない

OSコマンドをユーザの入力で行わなければいけないケースというのはなかなかないはずです。あったとしてもライブラリを使用するなどの選択肢を検討する必要があります。

そもそも使わない観点では、php.iniで特定の関数を実行不可にできるので本対策を行う場合はそれも合わせて行った方がいいでしょう。

エスケープする

上述の通り、こういった処理は実装しないのが一番です。とはいえ、どうしても実装したい場合はエスケープする関数もあります。escapeshellargという関数です。具体的にすると以下のような感じです。

<?php

$param = escapeshellarg($_GET['param']);

$file_list = shell_exec("ls {$param}");
echo $file_list;

参考文献

独習PHP 第3版

今回の内容は以上です。最後までご覧いただきありがとうございました。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした