2016-10-19 17 views
-1

私は、bashでコマンドを実行するアプリケーションを使って作業しています。これは、「テンプレート」それが使用されている。ドル記号をエスケープするsh -c

sh -c '<command> "<argument>"' 

私は引用符を編集することはできませんのでご注意ください、私が編集できる唯一のことは、コマンドと引数です。私はドル記号も逃げることができません。私は、正確な出力を得ることができますどのように

x=test 

、次のとおりです。

sh -c 'echo "x=test$test"' 

は、次のような出力が得られます。引数にドル記号がない限り

この「テンプレート」は正常に動作します:

x=test$test 
私は引用符を切り替えることができれば、私はこれを行うことができます

sh -c "echo '"'x=test$test'"'" 
x=test$test 

これを達成する方法はありますか?

+1

これは*極めて*悪いデザイン:ARGVは(subprocess.Popen(cmd, shell=False)に適したPythonの構文に下記の)次のように見ているわけでしょうそれを行います。正しい使用法は、 'execlp(" sh "、" sh "、" -c "、スクリプト、" _ "、arg1、arg2、...、NULL)のような方法でアウトオブプロセスシェルを呼び出すことです。コマンドは、これらのアウトオブバンド引数を参照するために '' $ 1 ''、' '$ 2''などを参照します。私は、大きなプログラム、ライブラリ、またはフレームワークがあなたにこれらの制約を与えているものに対して、セキュリティバグのチケットを提出することをお勧めします。 –

+0

ところで、なぜあなたはコマンドと引数の両方を編集できますが、ドル記号をエスケープできないと言いますか?ドル記号をエスケープすることは、引数を編集することの一部に過ぎません。 –

+0

ところで、あなたはこのタグ付きのbashを持っていますが、あなたは 'sh'を呼び出しています。 'bash'は' sh'を呼び出すために使われていますか?これは本当に間違った 'sh'質問ですか? POSIX shは、bashとは非常に異なるシェル言語です。 –

答えて

1

次のように、あなたは、いくつかの策略を行うことができ、あなたのsh -cコマンドはbashのによって(ないベースラインPOSIXシェルで)実行され、そしてあなたの引数が'リテラルが含まれていない場合:

#!/bin/bash 
sh -c 'echo ""'$'\'x=test$test\'""' 

つまり、文字列"'$'\'は、<argument>の先頭に追加し、\'"を追加する必要があります。

これはであることに注意してください。シェル注入攻撃に対するの絶対的な保証はありません。そのためには、argumentの内容を変更する必要があります。最低でも\\\と置き換え、'\'と置き換えます。


セキュリティ上の観点からすると、あなたが作業しているプログラムを修正して、コードからアウトオブバンドの引数を渡すことになります。シェルインジェクション攻撃を確保することはほぼ不可能、のように、

['sh', '-c', 'echo "$1"', '_', 'x=test$test'] 
+0

これはbashシェルで動作しますが、アプリケーションを実行しても機能しませんでしたので、bashによって解釈されないと仮定しています。私はこの操作を実行する関数を見つけました。私はプログラマーではありませんが、見てみるといいと思います。https://github.com/satterly/zabbix-stats/blob/master/src/libs/zbxexec/execute.c関数が呼び出されていますzbx_popen –

+0

これは*すべてのシェルによって解釈されません。そこには 'sh'が直接' exec'しています。とにかく、そのコードは、コードからアウト・オブ・バンドを渡すベスト・プラクティス・アプローチを除外していますが、あなたがこの質問について質問したテンプレートを確実に実行するわけではありません。それはどこから来ていますか? –

+0

...つまり、どこから '" "テンプレートを取得しましたか? –

関連する問題