web-dev-qa-db-ja.com

AndroidアプリケーションがSQLインジェクションに対して脆弱になるのはなぜですか?

SQLインジェクションの定義

SQLインジェクションは、データ駆動型アプリケーションを攻撃するために使用されるコードインジェクションテクニックで、悪意のあるSQLステートメントが入力フィールドに挿入されて実行されます(データベースの内容を攻撃者にダンプするなど)。

SQLインジェクションがAndroid O.Sに与える影響

Androidアプリで使用されるSQLiteは完全に機能するデータベースであるため、SQL ServerまたはMySQLボックスと同様に、SQLインジェクションの影響を受けやすくなります。SQLインジェクションは通常、クエリ文字列にデータを追加するか、データを追加することで機能しますフォームフィールド内;データベースへのアクセスまたは不正なログインをハッカーに与えるため。SQLインジェクションは通常、WebビューまたはWebサービスを攻撃するために使用されますが、アクティビティを攻撃するためにも使用できます。

SQLインジェクションの脆弱性の根本的な原因は、動的または連結されたSQLクエリの使用によるものです。 SQLクエリがユーザー指定の入力を連結することによって構築される場合。その後、ユーザーは有効な入力の代わりにSQL攻撃ベクトルを提供し、バックエンドSQLクエリを操作できます。

インジェクションプロセスは、テキスト文字列を途中で終了し、新しいコマンドを追加することで機能します。挿入されたコマンドは、実行前に追加の文字列が追加される場合があるため、挿入された文字列はコメントマーク「–」で終了します。後続のテキストは実行時に無視されます。

私の質問

SQLインジェクションとは何かSQLインジェクションがどのように行われるか 。わかりませんAndroidコードがこのような攻撃に対して脆弱なコードを選択する要因は何ですか。

2
user77088

SQLインジェクション攻撃は、アプリケーションがSQLを使用し、攻撃者が提供した要素を使用してSQLリクエストを不注意にアセンブルするときに適用されます。ここで、「不注意」とは、「 準備されたステートメント を使用しないこと」を意味します。準備されたステートメントはthe外部から提供されたデータでSQLを実行する正しい方法です。多くの開発者はそれを「引用文字のエスケープ」の観点から考えようとしますが、これは悪い方法であり、災害を引き起こします(一部のエスケープは最終的に起こりますが、準備されたステートメントのみが適切に行われることを保証します)。

Androidには SQLite が付属しているため、非常に間接的な場合を除いて、Androidはこれに関係する要素ではありません。そのため、開発者はそれを使いたくて、SQLをいじくります厳密に必要ではないケースです。唯一のツールがハンマーである場合、深刻なハンマーが発生するため、問題は釘である方がよいでしょう。もちろん、開発者にSQLのパワーが与えられているが、それを使用するのに十分注意していない場合適切に、SQLインジェクション攻撃は確実な可能性になります。

別の効果は、AndroidアプリケーションはJavaのような言語に基づいています。これは本質的にバッファオーバーフローから保護されており(すべての配列アクセスが体系的にチェックされるため))、ダブルフリーで使用後解放されます状況(GCベースのメモリ管理のため)。したがって、他の種類の攻撃は、機械的にすべての全体的な脆弱性の大きな部分を占めます。Androidアプリには多くのSQLインジェクションの脆弱性があります。実際、他の種類の攻撃が比較的はるかに少ない結果です。

4
Tom Leek

SQLiteは準備されたクエリとバインドされたパラメーターをサポートするため、問題はツール自体ではなく、ツールの使用にあります。

クエリパラメータが使用されている場合、データはステートメントとは別に処理されるため、SQLをプロセスに挿入することはできません。この問題は、開発者が次のようなことをした場合にのみ発生します。

SQLStatement = "select * from password where '=" "+ thePassword +"' and email = '"+ theEmailAddr +"'; ";

これは、ステートメントを終了して別のステートメントを追加するパスワードを入力する機会をエンドユーザーに与えたり、パスワードが機能する条件を指定したりするためです。たとえば、ユーザーが次のパスワードを入力すると、

' or password!='fred

そして、実際のメールアドレス、whosit @ whatamacallit.comとすると、データベースに送信されるクエリは次のようになります。

select * from users where password='' or password!='fred' and email='[email protected]';

パラメータを使用する場合、データはコマンドとは別に扱われるため、新しいsqlをコマンドテキストに挿入するオプションはありません。

2
Keith Procter