web-dev-qa-db-ja.com

sqlcmdパラメータは本質的にSQLインジェクションのリスクがありますか?

コマンドラインユーティリティのsqlcmdには、コマンドラインパラメータと環境変数からパラメータを置換できる機能があります。 https://msdn.Microsoft.com/en-us/library/ms188714.aspx

攻撃者が変数を制御する場合、SQLインジェクションに対して脆弱にならないようにスクリプトを作成する方法はありますか、またはこの状況では本質的に安全ではありませんか?

2
Leo Shine

攻撃者がSQLCMD入力を制御している場合、ログイン資格情報(承認または盗難)ができることは何でもできます。これは正常な機能です。

これを行わないでください。外部からの入力がSQLCMDに入る場合、これは悪い習慣です

これを主張する場合、環境変数からのパラメーター置換でSQLCMDを使用する場合(おそらく)、特定の制限されたスキーマ内でのみ実行できる資格情報を試してみるとよいでしょう。

CREATE SCHEMA FromSqlCmd AUTHORIZATION myuser

GRANT EXECUTE ON SCHEMA::[FromSqlCmd] TO [myschema_execute];

各ストアドプロシージャ内では、動的SQLに渡されたものを決して連結しないでください。

ホワイトリストなしで結果を表に入れないでください。それ以外の場合は、2次のSQLインジェクションを利用できるようになります。

あなたがPowershellを検討しているなら、 cjsommer.comにこれに関する記事があります -彼はPowershell SQLPSコマンドのどちらも、パラメータがあっても注入から保護されていないことを発見しました。


それより悪い

検証済みかどうかにかかわらず、他のユーザーからの入力を実際にSQLCMDのコマンドラインの一部にした場合、コマンドラインインジェクションが可能になります。 &文字は、コマンドプロンプトが複数のコマンドを実行する1つの方法です。やってみて

C: & cd \ & format /? & del /?

Sqlcmdの途中でこれを想像してください。

また、Powershellはを使用することに注意してください。コマンドを分離する。

2