Gehaxelts Blog

IT-Security & Hacking

SQL Injection in Apps

Ich hatte in letzter Zeit vieles mit den SQL Injections zu tun, und mir kam heute der Gedanke, ob solche nicht auch in Apps auf dem Android-Smartphone möglich sind.

Meine Vermutung hatte sich nach einem Beispielprogramm bestätigt, es ist nämlich möglich, jedoch sehr eingeschränkt.

Es gibt die Möglichkeit eine eigene SQL-Klasse zu schreiben, welche von der SQLiteOpenHelper erweitert wird. Diese stellt dem Programmierer die wichtigsten Datenbankoperationen CRUD (Create, Read, Update, Delete) bereitstellt.

Meinen Beispielcode gibt es nun zu sehen:

Die Funktion “onCreate” wird einmalig beim ersten Erzeugen der Databasehelper-Klasse aufgerufen, und erzeugt die entsprechende Datenbank, welche dann auf dem Smartphone, für non-roots unerreichbar, abgelegt wird.

Es wird die Tabelle “sqlinjection” angelegt, und einige Demoeinträge erstellt.

Die eigentliche problematische Funktion ist “getID”, welche dazu dient, die Datenbank lesend zu öffnen

1
SQLiteDatabase db = this.getReadableDatabase();

und daraufhin ein Query auszuführen, bei dem der SQL-Befehl aus dem Tabellennamen und dem übergebenen Parameter “id” zusammengestellt wird.

1
String selectQuery = "SELECT TYPE FROM " + TABLENAME+ " where ID = "+id;

Daraufhin kommt ein Cursor ins Spiel, welcher die Zeilenposition darstellt, über den man auf die einzelnen Einträge einer Ergebnismenge einer Datenbankabfrage zugreifen kann. Bei mir im Beispiel liefert es den ersten Eintrag als String zurück.

1
2
3
4
5
Cursor cursor = db.rawQuery(selectQuery, null);
if (cursor.moveToFirst()) {
db.close();
return cursor.getString(0)
}

Nun brauchen wir nur noch einen Code, welcher die Eingabe der SQL Injection ermöglicht.

Der wichtigere Teil des Codes ist folgender:

1
2
3
4
5
6
7
try {
String ouput= DB.getID(injection.getText().toString());
debugger.debug(ouput);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}

Bei einem Druck auf den Button, wird das Query ausgeführt, die Rückgabe im String “output” abgelegt und danach im Debugger angezeigt.

Nun kann man fröhlich seine SQL Injection ausprobieren bzw. ausnutzen.

Was dann folgende Debuggermeldung hervorruft:

Wie man sieht, konnten wir nun erfolgreich eine SQL Injection durchführen, da statt des Types, das Datum ausgegeben wird.

Diese Praktiken sind aber sehr eingeschränkt zu illegalen Zwecken zu gebrauchen, da man keinen Zugriff auf andere Datenbanken anderer Apps erlangen kann, und man dagegen auf die Tabellen der angegriffenen App begrenzt ist.

Um sich gegen solche Angriffe zu schützen, sollte man den Typ des Parameters “id” der Funktion “getID” auf einen Integer ändern, und dann beim String mit Integer.toString(id) arbeiten, denn dies wirft bei einer Eingabe eines nicht -numerischen Zeichens dann eine NumberFormatExeception wirft, sodass entweder die Applikation abstürzt, falls kein entsprechender Try-Catch-Block diese abfängt.

Das war es dann auch schon zu dieser Untersuchung.

Gruß

gehaxelt

Security

« Einfach per SSH anmelden IPv6 kann kommen »