Perl
1$_="外部からの不確定な文字列"; 2$_=~s/\\/\\\\/g; 3$_=~s/'/\\'/g; 4`command '$_'`;
このコードはOSコマンドインジェクションされるリスクはありますでしょうか?
ある場合、どのような入力をされると危ないでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
コードインジェクションについて真面目にお話ししようとすると、
私の力の範囲を越えますが、
とりあえず、ご質問の内容に限ってお答えします。
結論としては「外部からの不確定な文字列」がすべてのコードを含むのであれば、
例えば linux なら、
perl
1#!/usr/bin/perl 2$_="'\nxterm\n'"; # 外部からの不確定な文字列 3$_=~s/\\/\\\\/g; 4$_=~s/'/\\'/g; 5`echo '$_'`;
のようなコードで簡単に任意のコマンド(上の例では xterm )を実行できます。
ちなみに、この問題の回避方法を一つあげるなら以下のようになります。
perl
1#!/usr/bin/perl 2$_="'\nxterm\n'"; # 外部からの不確定な文字列 3$_=~s/[[:cntrl:]]//g; # 制御コードを削除する 4$_=~s/\\/\\\\/g; 5$_=~s/'/\\'/g; 6`echo '$_'`;
以上の答えはほんの一例に過ぎません。
「外部からの不確定な文字列」の定義が不明瞭なので様々な状況が考えられます。
今回のご質問の内容では、以下の点が不明瞭です
- 使用するOS
- 使用するシェル
- 使用する perl のバージョン
- 「外部からの不確定な文字列」を受け取る経路(コンテナ、フレームワークなど)
使用する環境によっては、perl に処理が渡った段階で危険な文字はすべて削除されるか
置き換えられている場合もありえます。
今回一般論でお答えしましたが、以上の要因によって状況は変わるということを
ご了承ください。
コマンドインジェクションそのものに関しては、
専門の書籍などを読むなりして、総合的な対策を行われることをおすすめします。
投稿2015/12/16 09:04
総合スコア1193
0
そもそもshellのシングルクォートの中では\によるエスケープはないです。(shellによるかもしれませんが、すくなくともbashにはありません)。なのでこれは多分期待した通りには動かないです。
Perl
1$_="I'm your father"; 2$_=~s/\\/\\\\/g; 3$_=~s/'/\\'/g; 4`echo '$_'`;
たとえばこれを実行すると
text
1sh: -c: line 0: unexpected EOF while looking for matching `'' 2sh: -c: line 1: syntax error: unexpected end of file
のようなエラーになります。
echo 'I'm your father'
というコマンドを実行しようとするのですが、\にエスケープの意味は無いのでシングルクォートで囲ったI\という文字列のあとにm your father'と書いてあると解釈されて、最後の'が閉じてないというエラーです。
shell用にエスケープするのは結構めんどくさいので、shellを経由しない方法を使う方がいいです。
commandが出力が特になくて単に実行するだけでよければsystem関数に引数をリストで渡すパターンを、
Perl
1system 'command', $_;
もし出力のキャプチャが必要なら、CPANのIPC::System::Simpleのcaptureを使うのをおすすめします
Perl
1use IPC::System::Simple qw(capture); 2 3$output = capture('command', $_);
投稿2015/12/26 06:06
編集2015/12/26 06:09総合スコア1175
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。