2016-08-25 12 views
0

引数でコマンドを実行する方法はありますか?「シェル」はありません。phpでシェルを使用しないでコマンドを実行する

exec()shell_exec()の両方がシェルで指定された文字列を実行するため、入力されたユーザーのデータをエスケープする必要があるという問題があります。

それが好きで行う方法はあります:

some_exec(["command","argument","argument]) 

1は、例えば、PythonやJavaのためにそれを行うだろうと。

いくつかの引数をエスケープしなくても、引数を指定してコマンドを実行することができます。

私はルータのUIで作業しています.Wifiキーはコマンド で設定されていますが、今はキーに含まれる文字数を制限する文字列をエスケープする必要があります。私がキーを逃れることができなければ、問題なく注射をすることができます。これは、実際にこの場合は厄介な問題である理由

明確化 理由は、私は、次のコマンドを実行する必要があるということです。

[email protected][0].key='<the password>' 

問題は、以来、パスワードが中に設定されていることですこのパスワードの文字列$il|\|t\$ile\|\\\|tになり、間違ったパスワードが有効な問題になります。したがって、保存されたパスワードは、入力されたパスワードと同じではありません。

そして、我々は文字列にパスワードを入力していても、我々はまだ、私は引数をエスケープしないようにあなたの必要性を理解するいくつかの問題があり、この' ; reboot ; '

+0

[link] http://php.net/manual/en/function.exec.php [ – sam

答えて

0

などの注入を行うことができます。私はエスケープされた文字列でエコーを呼び出そうとしました、そしてエコーが元の文字列が表示されます。ここでは

$cmd = 'echo'; 
$passwd = escapeshellarg('&#;`|*?~<>^()[]{}$'); 
echo 'ARG : ' . $passwd . PHP_EOL; 

exec($cmd . ' ' . $passwd, $output); 
echo 'exec : ' . $output[0] . PHP_EOL; 

echo 'passthru : '; 
passthru($cmd . ' ' . $passwd); 

echo 'shell_exec : ' . shell_exec($cmd . ' ' . $passwd); 

echo 'system : '; 
system($cmd . ' ' . $passwd); 

が出力されます。

ARG : '&#;`|*?~<>^()[]{}$' 
exec : &#;`|*?~<>^()[]{}$ 
passthru : &#;`|*?~<>^()[]{}$ 
shell_exec : &#;`|*?~<>^()[]{}$ 
system : &#;`|*?~<>^()[]{}$ 

は、あなたが実行するコマンドの例を挙げてもらえますか?

+0

]これを実行する必要があります: 'uci set wireless.radio [0] = '<パスワード>' '。あなたがパスワード '$ ile | \ | t"を望んでいるとしたら、これは '\ $ ile \ | \\\ | t'にエスケープされます。問題は、文字列の中でパスワードがそのまましかし、私はまだ ''; reboot;というパスワードを提供することで注入を行うことができます。 –

+0

$ cmd =' uci set wireless.radio [0] = '; $ passwd = escapeshellarg(' $ ile | \ | t "'); $ fullCommand = $ cmd。$ passwd; は、次の出力を提供します。uci set wireless.radio [0] = '$ ile | \ | t " – vincenth

関連する問題