以前から気にはなっていた PHP の escapeshellarg を調べてみた.
次の様なコードがうまくない.
<?php $param = ($_REQUEST['input']) ; $cmd_to = "cal " . $param ; system ( $cmd_to ) ; ?>
次の様な入力を意図しているが,
…/cal/?input=2020
後ろに次のコマンドを付加されるとうまくない.
…/cal/?input=2020;ls -l
cal 2020 が表示された後 ls -l が動作している.
「コマンドインジェクション」と呼ぶらしく,検索するといろいろと出てくる.
コマンドの引数にあたる部分に escapeshellarg を使用するか,$param をチェックするする必要がある.
$cmd_to = "cal " . escapeshellarg ( $param ) ;
[…] 「OSコマンドインジェクション」などは知っていたが,ポートスキャンやパスワードの具体的な部分がわかった. デフォルトポートの危険性や,パスワードで「数桁の数字」などは意味がないことがよくわかる. […]