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

読み:おーえすこまんどいんじぇくしょん / 英語表記:OS command injection

Webアプリケーションが、利用者の入力をそのままOSのコマンドの一部として実行してしまう脆弱性を突き、攻撃者が任意のOSのコマンドをサーバ上で実行させる攻撃。

イマシルちゃんの解説

レストランで、注文票に「カレー」って書くと、お店の人がそのとおりに作ってくれるとするね。

もし、いたずらで「カレー。それと、金庫を開けて中身を渡して」って書いたら?
お店の人が、注文票を確かめずにそのまま実行しちゃったら、大変なことになるよね。
Webサイトでも、入力された文字を確かめずにコンピュータへの命令に混ぜちゃうと、同じことが起きるんだ。

より深い解説

定義

OSコマンドインジェクションは、Webアプリケーションが、外部から受け取った値を使ってOSのコマンド(シェル)を呼び出すとき、その値にシェルの特殊な記号やコマンドを混ぜ込まれ、開発者が意図しないコマンドを実行されてしまう攻撃である。

起きる仕組み

例えば、入力されたホスト名に ping を実行する機能で、プログラムが次のようにコマンドを組み立てているとする。

ping -c 1 (入力された値)

入力に「example.com; cat /etc/passwd」と入れられると、シェルは「;」でコマンドを区切り、2つ目のコマンドも実行してしまう。

よく使われる記号意味
;コマンドを続けて実行する
|前のコマンドの出力を、次のコマンドに渡す
&& 、||前のコマンドの結果に応じて、次を実行する
バッククォートで囲む、$( )コマンドの実行結果に置き換える

PerlのsystemやPHPのexecのように、シェルを起動する関数に入力を渡す部分が危険な箇所になる。

被害

対策

対策内容
シェルを起動しないOSのコマンドを呼ばずに、言語の機能(ライブラリ)で処理する。これが根本的な対策
引数を分けて渡すシェルを介さず、コマンドと引数を別々に渡す関数を使う
入力の検証許可した文字(英数字など)だけを受け付ける
最小権限Webアプリケーションを、権限の小さいアカウントで動かす

インジェクション系の攻撃の比較

攻撃混ぜ込む先
OSコマンドインジェクションOSのコマンド(シェル)
SQLインジェクションデータベースへの命令(SQL)
HTTPヘッダインジェクションHTTPの応答ヘッダー(改行を混ぜて、ヘッダーや本文を追加する)

実際の試験ではここに出る!

↑