MASTG-TEST-0025 インジェクション欠陥のテスト (Testing for Injection Flaws)
概要
インジェクション欠陥 をテストするには、まず、他のテストに依存し、露出している可能性のある機能をチェックする必要があります。
静的解析
脆弱な IPC メカニズムの例を以下に示します。
ContentProviders を使用してデータベース情報にアクセスしたり、サービスを調べてデータを返すかどうかを確認できます。データが適切に検証されていない場合、他のアプリがコンテンツプロバイダとやり取りする際、コンテンツプロバイダは SQL インジェクションを受ける可能性があります。以下の ContentProvider の脆弱な実装を参照してください。
<provider
android:name=".OMTG_CODING_003_SQL_Injection_Content_Provider_Implementation"
android:authorities="sg.vp.owasp_mobile.provider.College">
</provider>
上記の AndroidManifest.xml
はエクスポートされるコンテンツプロバイダを定義しているため、他のすべてのアプリで利用できます。 OMTG_CODING_003_SQL_Injection_Content_Provider_Implementation.java
クラスの query
関数を検査する必要があります。
@Override
public Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
qb.setTables(STUDENTS_TABLE_NAME);
switch (uriMatcher.match(uri)) {
case STUDENTS:
qb.setProjectionMap(STUDENTS_PROJECTION_MAP);
break;
case STUDENT_ID:
// SQL Injection when providing an ID
qb.appendWhere( _ID + "=" + uri.getPathSegments().get(1));
Log.e("appendWhere",uri.getPathSegments().get(1).toString());
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
if (sortOrder == null || sortOrder == ""){
/**
* By default sort on student names
*/
sortOrder = NAME;
}
Cursor c = qb.query(db, projection, selection, selectionArgs,null, null, sortOrder);
/**
* register to watch a content URI for changes
*/
c.setNotificationUri(getContext().getContentResolver(), uri);
return c;
}
ユーザーが content://sg.vp.owasp_mobile.provider.College/students
に STUDENT_ID を提供する際、クエリ文は SQL インジェクションを受けるかもしれません。SQL インジェクションを避けるには、プリペアドステートメント を使用しなければならないのは明らかですが、アプリが記載する入力のみが処理されるように 入力バリデーション も適用すべきです。
UI を介して入ってくるデータを処理するすべてのアプリの関数は入力バリデーションを実装すべきです。
ユーザーインタフェースの入力には、Android Saripaar v2 を使用できます。
IPC または URL スキームからの入力には、バリデーション関数を作成すべきです。たとえば、 文字列が英数字である かどうかを判定するのは以下のようになります。
public boolean isAlphaNumeric(String s){
String pattern= "^[a-zA-Z0-9]*$";
return s.matches(pattern);
}
バリデーション関数の代わりとして、たとえば、整数のみが期待される場合は Integer.parseInt
での型変換があります。OWASP Input Validation Cheat Sheet にはこのトピックに関する詳細情報があります。
動的解析
たとえば、ローカル SQL インジェクション脆弱性が特定されるかどうかなど、テスト担当者は入力フィールドを OR 1=1--
などの文字列で手作業でテストする必要があります。
ルート化されたデバイス上では、コマンドコンテンツを使用してコンテンツプロバイダからデータをクエリできます。以下のコマンドは上述の脆弱な機能をクエリします。
# content query --uri content://sg.vp.owasp_mobile.provider.College/students
SQL インジェクションは以下のコマンドで悪用できます。Bob だけのレコードを取得する代わりに、ユーザーはすべてのデータを取得できます。
# content query --uri content://sg.vp.owasp_mobile.provider.College/students --where "name='Bob') OR 1=1--''"
Last updated
Was this helpful?