私はセキュリティシェパードをトレーニングツールとして使用しており、SQLインジェクションエスケープチャレンジに挑戦しています。
チャレンジ:
MySQLのローカルデータベースで上記と同じように(テーブル名が異なるだけで)クエリを実行すると、問題なく動作します(このチャレンジでは、シェパードがMySQLを使用していると想定しています。これは、DBMSが唯一のタイプであるためです。今まで直面した)。
上記のクエリがSQLインジェクションとして機能しない理由はありますか?
チャレンジのヒントで述べたように、バックエンドで使用されているクエリは次のとおりです。
SELECT * FROM customers WHERE customerId="1" OR "1"="1";
アプリケーションは、SQLインジェクションに対する保護として'
にすることにより、\'
をエスケープしています。 "
は変更されません。
短い答え:彼らの脱出のしくみを悪用する。 \' OR 1=1; --
をお試しください。
長い答え:
それらのエスケープ関数は、すべての'
を\'
に置き換えることで機能します。すでにバックスラッシュが付いているものを含め、それらすべて。つまり、\'
が表示された場合、最終的には\\'
-エスケープされたバックスラッシュ、その後にnescaped単一引用符になります。
その後は、標準のSQLインジェクションです。 OR 1=1
はデータベースのすべての行を取得し、;
はステートメントを終了し、--
は残りをコメントアウトするので、それらの終了引用、ステートメントの終わり、その他の条件などは無視されます。
これらの答えは正しくありません。この問題の正解は次のとおりです。
" or ""="
理由:スマートハッカーは、ユーザー名またはパスワードのテキストボックスに「または」を挿入するだけで、データベース内のユーザー名とパスワードにアクセスできる可能性があります。結果SQLは有効です。 WHERE "" = ""は常にtrueであるため、customersテーブルからすべての行を返します。
スマートハッカーが機能するインジェクションを探しているため、上記の回答はすべてインジェクションを正常に実行しているため、正解です。ハッカーが機能するインジェクションを見つけると、他の可能なクエリを探し回るのではなく、機能するクエリを拡張します。計算ロジックを実行して、次のような同じ結果を取得することもできます。 "OR" 1 + 1
誰かがadminプロファイルのモジュールレイアウトをトーナメントモードに変更すると、新しいタブチートが表示されることがわかりました。したがって、上記の答えは\'or"1"="1"; --
。