ユビキタスなログイン ハンドラーを含む Linux ベースの perl Web アプリケーションをレビューしています。
my $sth = $DB->prepare("SELECT password from password where userid='$userid'") または die; $sth->実行するか死ぬ; ...
ここで、$userid は (安全でない、フィルター処理されていない) Web ユーザー入力から初期化されます。
DBI ドキュメントでは、このコードをプレースホルダ「?」を使用するように変更することを推奨していることはよく知られています。セキュリティのために「$userid」の代わりに。
このコードは、セキュリティ レビューの目的で、オフ ネットワーク ボックスにそのまま分離されました。 現在、この脆弱性をスキャンするボットが存在するため、インターネット サーバー上のこのようなコードは最終的にクラックされます。また、既知のインジェクションによってデータベースが削除されたり、不正なデータや新しいユーザーが挿入されたり、アクセス制御をバイパスして Web アプリケーションへのエントリが許可されたりする可能性があるため、アクセス制御は重要なものを保護するには効果的ではありません。
アプリケーションは PostgreSQL または MySQL のいずれかを使用するように構成でき、相対的な脆弱性について疑問が生じたため、両方のデータベースを試し、SQL インジェクションを試行して各構成をテストしました。
PostgreSQL では '; を入力します。ここで悪いことをします。そしてここ; 予想どおりログイン cgi をクラッシュさせ、悪いものを実行します。
予想外だったのは、MySQL がこの攻撃に抵抗したことです。これは、DBD::MySQL などに何らかの設定があり、準備を呼び出しごとに 1 つのステートメントに制限したのか、それとも他の方法で MySQL に耐性があるのか疑問に思いました。
私が理解しているように、MySQL は一般的に SQL インジェクション耐性がありません。
これは、SQL インジェクションを排除するためのテクニックだけの問題ではありません。そのためには、SQL インジェクション攻撃を回避するにはどうすればよいですか? を参照してください。.
問題は、MySQL は PostgreSQL よりも PERL DBI の下での SQL インジェクション攻撃に対して何らかの形で耐性があるのでしょうか? また、なぜそうなのかということです。