この章では、「コンテンツ プロバイダーの SQL インジェクションのリスク」について学びましょう。
1. 脆弱性の原則
まず第一に、私たちが知る必要があるのは、ユーザーからの入力は安全ではないということです。それを検証する必要があります。検証に合格すると、ほぼ安全であると考えることができます。では、これは私たちの章とどのような関係があるのでしょうか?実際、SQL インジェクションの発生はユーザーの不正な入力によって発生します (もちろん、インジェクションが発生する場合はプログラム自体にも問題があります)。ユーザーが入力した SQL 条件がプログラム内で検証されていない場合、ユーザーが何らかの SQL コマンドを構築すると、SQL インジェクションが発生します。コンテンツ プロバイダーの SQL インジェクションの脆弱性は、次のことが原因で発生します。
- コンテンツプロバイダーコンポーネントはエクスポート可能です
- これは、入力値が仕様に準拠しているかどうかをチェックせずに SQL ステートメントの一部として使用されます。次に例を示します。
String inputUserName = "123'or'1=1";
String inputPassword = "123";
String sql = "select *from user where username='"+inputUserName +"' and password='"+inputPassword+"'";
Cursor cursor = db.rawQuery(sql);
上記2点を満たす場合、SQLインジェクションのリスクが発生する
2. 検出方法
step1:
グローバル コードをスキャンして、エクスポートされたコンテンツ プロバイダ コンポーネントがあるかどうかを確認します。
step2:
エクスポートされたコンテンツ プロバイダ コンポーネントがある場合は、SQL ステートメントに未検証の入力値があるかどうかを確認します。ある場合は、リスクがあります。
step3:
集計結果
3. 修理方法
1. エクスポートする必要のないコンテンツ プロバイダー コンポーネントについては、コンポーネントの "android:exported" 属性を表示して false に設定することをお勧めします 2. コンポーネントがエクスポートできる場合は、selectionArgs を使用し
てパラメータ化して SQL ステートメントを作成します。次に例を示します。
String inputUserName = "xxxx";
String inputPassword = "xxxx";
String sql = "select *from user where username=? and password=?";
Cursor cursor = db.rawQuery(sql,new String[]{username,password});
asjhan for Android reverse