Und nicht zuletzt der Anbieter von Inhalten.
Damit haben wir unsere vier Hauptkomponenten einer Android-Anwendung fertiggestellt.
Dann wissen wir alles über ein Android-Manifest.
Erstaunlich.
Oder? Schauen wir uns diese
Frage also einmal an.
Wie der Name schon sagt, geht es in den meisten oder fast
allen Fällen um Datenbanken, z. B. um die Kontakte in einem Smartphone.
Diese werden in einer Datenbank gespeichert.
Und wir haben einen Inhaltsanbieter für diese Datenbank, was bedeutet, dass
wir mit ihnen über einen Inhalts-URI interagieren können, diesen hier.
Und der erste Teil ist einfach nur das Präfix, das das Smartphone oder
die Anwendung signalisiert, mit der wir es beim Inhaltsanbieter zu tun haben.
Wir haben also Inhaltscode auf Schrägstrich Schrägstrich.
Dies ist übrigens ein hervorragendes Stichwort, wenn Sie Android-Anwendungen zurückentwickeln.
Wenn Sie also nach diesem Schlüsselwort suchen, können Sie diese Inhaltsanbieter recht leicht identifizieren.
Also gut.
Als Nächstes haben wir die Autorität, und das ist einfach nur ein eindeutiger Bezeichner für unseren Inhaltsanbieter.
Wir können also nicht mehrere Inhaltsanbieter mit demselben Namen haben.
Stellen wir uns vor, wir haben mehrere Android-Kontakte auf unserem Smartphone.
Wir wüssten dann, welchen wir anrufen wollen.
Daher muss dieser Name eindeutig sein, und daher wird bei einem
gemeinsamen Ansatz einfach der Paketbezeichner für diesen eindeutigen Namen verwendet.
Aber es ist einfach nur ein Name.
Das hat nichts zu bedeuten.
Also gut.
Danach kommt der Eintrag in der Tabelle.
Das ist in diesem Fall die Tabelle der Kontakte.
Und zu guter Letzt haben wir noch das Schrägstrich-Werkzeug, was bedeutet, dass wir
den zweiten Eintrag oder die zweite Zeile dieser Tabelle auf einmal erhalten.
Das würde bedeuten, dass wir folgendes haben Hier ist unsere Kontaktdatenbank
und wir wählen jetzt den zweiten Eintrag aus dieser Datenbank aus.
In diesem Fall also Peter Smith Telefon und die E-Mail-Adresse.
Die Frage ist nun, wie können wir mit diesen Inhaltsanbietern interagieren?
Denn wie Sie sich erinnern, werden Inhaltsanbieter von den Intents ausgeschlossen.
Wir können also nicht einfach unseren inhaltlichen Ansatz verwenden, wie wir dies in den anderen
drei Teilen bei den Aktivitäten, den Rundfunkempfängern und den Diensten innerhalb der Inhaltsanbieter getan haben.
Wir müssen es anders machen.
Am einfachsten ist es, die ADB-Shell zu verwenden, da wir
dort neben dem Activity Manager auch einen Content Provider haben.
Wir könnten also einfach die Inhaltsabfrage verwenden und dann den URI des abzufragenden Eintrags angeben.
Okay, aber was, wenn wir keinen Zugriff auf die ADB-Shell haben? Nehmen wir also an,
wir wollen unsere eigene bösartige Anwendung schreiben, so wie wir es im Abschnitt über den
Rundfunkempfänger getan haben, der einen sehr unsicheren Eintrag hatte, um diese Daten zu holen.
Nun, dann müssen wir es auf folgende Weise tun.
Hier haben wir nun also die Kontaktdatenbank oder die Kontaktanwendung.
Wenn wir nun diese Kontakte in unserer eigenen Anwendung abfragen
wollen, müssen wir dies innerhalb des Content Resolvers tun.
Und das klingt jetzt ein bisschen komplex, aber lassen Sie uns
das gemeinsam machen, damit wir diesen Teil gleich beherrschen, okay? In
unserer eigenen Anwendung müssen wir einen Inhaltsauflöser definieren, und dieser Inhaltsauflöser
bittet nun den Inhaltsanbieter, uns den Inhalt zur Verfügung zu stellen.
Aus diesem Grund passt der Name perfekt zum Inhaltsanbieter.
Wenn wir also über die entsprechenden Berechtigungen verfügen und
dieser Teil exportiert wird, dann können wir darauf zugreifen.
Das sind also unsere beiden Anwendungsfälle, die wir
in allen Komponenten haben: Aktivitäten, Rundfunkempfänger, Dienste.
Und auch hier gilt: Wenn der Benutzer unserer Anwendung die Erlaubnis erteilt hat, auf diese Kontaktdatenbank zuzugreifen,
dann kehrt der Inhaltsanbieter durch eine Anfrage zu dieser Datenbank zurück und setzt den Cursor dorthin.
Und dieser Cursor zeigt einfach auf einen Datenbankeintrag
oder eine Datenbankauswahl, zum Beispiel auf diesen hier.
Wir haben jetzt also einen Zeiger auf die erste Zeile unserer Datenbank.
Ja.
Der Inhaltsanbieter muss die folgenden Methoden enthalten, die nun von unserer Anwendung verwendet werden können,
um mit dieser Datenbank zu interagieren, damit wir sie abfragen, aktualisieren, einfügen oder löschen können.
Wir können dies auch ein wenig einschränken, aber das ist in den meisten Fällen nicht der Fall.
Okay, das ist also das ganze Konzept.
In unserer eigenen Anwendung definieren wir einen Inhaltsauflöser.
Wir fordern den Inhaltsanbieter auf, einen Eintrag in der Datenbank zu erstellen, und können
dann die Methoden query update, insert delete verwenden, um mit diesem Eintrag zu interagieren.
Na gut, perfekt.
Und noch eine letzte Anmerkung hier drüben.
Wenn wir es mit benutzerdefinierten Inhaltsanbietern zu tun
haben, dann werden diese Datenbanken im Datenverzeichnis gespeichert.
Wir haben also Daten Daten, dann den Paketbezeichner Schrägstrich
DB dort, wir haben die gesamte Datenbank gespeichert werden.
Und wenn dieser nicht verschlüsselt wurde, können wir ihn einfach herunterladen und
mit SQL light oder einem quadratischen Light-Browser analysieren, was immer Sie wollen.
Sie können auch andere Tools wählen, aber diese sind.
Die häufigsten.
Ja.
Und wenn diese Datenbank verschlüsselt wird, dann haben wir mehrere Optionen, wenn sie
zum Beispiel über vom Benutzer bereitgestellte Daten verschlüsselt wird, und ein Passwort und
ein Schlüssel-Pin, so etwas in der Art, dann wird es schwierig sein.
Aber wenn man in dieser Anwendung startet und die Datenbank automatisch
entschlüsselt wird, dann müssen alle Daten in dieser Anwendung verfügbar sein.
Wir brauchen also den Algorithmus für Schlüssel, Zertifikate und alles, was sonst noch benötigt wird.
Und im Bereich der Umkehrung werden wir uns mit einem Verschlüsselungsalgorithmus befassen, der
sehr beliebt ist, damit wir lernen, wie man mit solchen Dingen umgeht.
Ja.
Deshalb schlage ich vor, dass wir uns ein Beispiel für die Kodierung ansehen.
Wie sieht also der Quellcode zu einem Content Provider
aus? Wir wissen, womit wir es zu tun haben.
Also gut.
Auf der linken Seite haben wir also unsere Anwendung und auf
der rechten Seite unsere Prüfanwendung, die auf diesen Inhaltsanbieter zugreifen möchte.
Wenn wir nett fragen, dann geben die Inhaltsanbieter diesen Cursor zurück und wir können mit ihm interagieren.
Okay, hier haben wir nun die Methode dieses Inhaltsanbieters
und wir können sehen, dass sie unseren Cursor zurückgibt.
Gut, aber innerhalb der Abfrage haben wir jetzt eine Menge Parameter, wir haben URI,
wir haben Schutz, wir haben Auswahl, wir haben Auswahlachse und wir haben Sortierreihenfolge.
Also ein, zwei, drei, vier, fünf Parameter in dieser Abfragemethode.
Das hört sich nach einer komplexen Methode an, und das ist es auch,
aber diese Methode kommt mit einer einzigen SQL-Syntax aus, was wirklich erstaunlich ist.
All diese fünf Parameter werden also in eine SQL-Anweisung wie diese hier umgewandelt.
Unser zweiter Parameter ist also die Select-Projektion.
Dies ist also unser Auswahlargument aus Tabellenname.
Dies ist unsere URI, bei der die Auswahl gleich der Auswahl ax ist.
Die beiden Parameter drei und vier sind hier in der Reihenfolge der Sortierung angegeben.
Alle diese Parameter werden also in eine SQL-Anweisung umgewandelt.
Und wenn es um skalierte Anweisungen geht, gibt es eine
Angriffsart, die mir sofort ins Auge springt, nämlich SQL-Injection.
Und in der Tat ist dies bei Inhaltsanbietern möglich,
aber ehrlich gesagt, ist es nicht so gefährlich.
So wie wir das jetzt bei Webanwendungen haben.
Lassen Sie uns trotzdem darüber reden.
Hier haben wir also jetzt diese Select-Anweisung.
Lassen Sie uns einige Werte in unsere Abfragemethode einfügen und sehen, was passiert.
Ja.
Hier haben wir nun also unsere Anfrage.
Wir haben diesen URI, der unser Inhaltspräfix-Autoritätsname ist,
und dann den Tabellennamen, der News lautet.
In diesem Fall können wir das bereits erkennen.
Wir versuchen, die Tabelle Nachrichten abzufragen.
Vielleicht wollen wir einige Neuigkeiten über unsere Anwendung abrufen.
Also einfach nur: "Okay, was ist jetzt gerade aktuell? Der nächste
Parameter, unsere Operation, ist unsere Nutzlast, die wir vorerst auslassen.
Also behandeln wir einfach nur diese als Nutzlast und die anderen werden mit Null gefüllt.
Wenn Sie also die SQL-Anweisung von der letzten Folie nehmen, dann haben wir Folgendes.
Wir haben select prediction from URI, wobei selection gleich selection ax order by sort order ist.
Fügen wir all diese Nullwerte ein, da dies für unsere Syntax irrelevant sein wird.
Also gut.
Wir erhalten die folgende Projektion von URI auswählen und jetzt
sind wir mit ihren null gleich null Reihenfolge von null.
Alles, was nach der URI kommt, ist also irrelevant.
Okay, vereinfachen wir die Aussage.
Dies bedeutet, dass wir die folgende und wählen Sie Projektion von Uri.
So weit, so gut.
In unserem Fall.
Im Moment rufen wir Nachrichteninformationen ab, zum
Beispiel einige Schlagzeilen, Daten, Zeitstempel und dergleichen.
Sehen wir uns nun an, wie wir diese in eine andere
Abfrage verwandeln können, die auf einer SQL-Injection innerhalb einer SQL-Injection basiert.
Und dann können wir eigenen SQL-Code in eine bestehende Abfrage
einfügen und diese in eine völlig neue Abfrage umwandeln.
Nehmen wir an, dass wir anstelle der Nachrichten auf die Benutzertabelle mit den Benutzernamen und Passwörtern zugreifen wollen.
Wie können wir das tun? Nun, alles, was wir
tun müssen, ist das Einfügen der folgenden Nutzlast.
Wenn wir die folgende Nutzlast einfügen, wird unsere SQL-Syntax in die folgende umgewandelt werden wählen Sie
Sternchen aus Benutzer Semikolon und die gestrichelten Bindestrich die machen und kommentieren Sie alles, was folgt.
Wir sagen also einfach alles, was sich hinter diesem Gedankenstrich verbirgt.
Dash ist üblich, und wir beenden unsere SQL-Syntax genau hier, d. h. wir
fragen jetzt nicht mehr die Nachrichten ab, sondern die Tabelle des Benutzers.
Und ja, in diesem Fall würden wir all diese Informationen abrufen: Vorname, Nachname, Passwort und E-Mail.
Also gut.
Es ist also absolut lächerlich, oder?
Ja, und das ist es auch.
Aber es gibt auch einen kleinen Nachteil.
Um ehrlich zu sein, ist mir noch keine SQL-Injection in einem Inhaltsanbieter begegnet, die wirklich ausnutzbar war.
Warum? Weil sie sich meist so entwickeln, dass
sie Ihnen ohnehin Zugang zur Datenbank gewähren.
Wenn wir also Zugriff auf die Nachrichtentabelle erhalten, haben wir möglicherweise auch Zugriff auf die Benutzertabelle.
Es ist ziemlich unwahrscheinlich und äußerst selten, dass Entwickler Tabellen wie diese sperren.
Wenn Sie also kritische Daten haben, könnten diese
in zwei verschiedenen, völlig getrennten Datenbanken gespeichert sein.
Und eine SQL-Injektion in der In the Lane-Datenbank liefert uns keine weiteren Informationen.
Trotzdem sollten wir uns das auf jeden Fall ansehen.
Ja.
Zusammenfassend lässt sich sagen, dass wir, wenn wir den Inhaltsanbieter angreifen
wollen, sicherstellen müssen, dass wir über die entsprechenden Berechtigungen verfügen.
Ich meine, in Bezug auf die Systemberechtigungen.
Ja.
Im Falle von benutzerdefinierten Berechtigungen können wir den Benutzer bitten, dies anzugeben.
Wir können uns in unsere eigene Anwendung einbeziehen, wenn diese nicht mit einer Schutzsignatur versehen ist.
Ja.
Also gut.
Außerdem müssen wir sicherstellen, dass der Inhaltsanbieter exportiert wird.
Ich meine, wir haben hier keine Inhaltsfilter.
Wir haben nur exportierte Gleichberechtigte.
Richtig, denn die Inhaltsanbieter werden nicht über Intents aufgerufen.
Wenn wir in unserer eigenen Anwendung mit einem Inhaltsanbieter interagieren wollen, müssen wir
einen Inhaltsauflöser definieren und den Inhaltsanbieter bitten, uns den Inhalt zu geben.
Wenn dies der Fall ist, erhalten wir in den meisten Fällen Zugriff auf die gesamte Datenbank, was SQL-Injections möglich
macht, aber in den meisten Fällen nicht sehr nützlich für uns ist, da wir diese Informationen ohnehin variieren können.
Die Entwickler trennen diese kritischen Datenbanken voneinander und gewähren uns keinen Zugang dazu.
Aber dennoch sind dies alles Dinge, die wir überprüfen müssen, wenn wir es mit einem Inhaltsanbieter zu tun haben.
Ja.
Bei der Interaktion mit Datenbanken kann der Content Provider auch in Kombination mit
Dateien verwendet werden, so dass wir in Dateien lesen und schreiben können.
Und das gibt uns neue Angriffsmöglichkeiten, was für den Angreifer
ziemlich erstaunlich und für den Entwickler ein wenig unglücklich ist.
Diese Schwachstellen können also eine große Bedrohung für die Anwendung darstellen,
und sie sind auch heute noch in gängigen Anwendungen vorhanden.
Google ist sich dessen und auch der Bedrohung durch diese Sicherheitslücke natürlich bewusst.
Und Google wird das Hochladen in den Play Store für diese Art von Anwendungen verweigern.
Sie könnte also in Zukunft an Bedeutung verlieren.
Aber stellen Sie sich einmal vor, wie viele Anwendungen es jetzt schon gibt.
Und es könnte auch eine Weile dauern, bis Google dieses Problem weltweit angeht.
Neben dem Play Store gibt es noch viele andere Stores, die diese Anwendungen möglicherweise nicht auf
diese Art von Schwachstelle überprüfen, was bedeutet, dass sie auch in Zukunft noch bedroht sein können.
Nehmen wir an, Sie haben eine mobile Anwendung auf einem
Fahrzeug oder in Ihrem Iot-System oder was auch immer.
Diese Anwendungen können also nicht aus dem offiziellen Store heruntergeladen werden.
Möglicherweise haben sie eigene Geschäfte.
Und deshalb wird diese Art von Schwachstelle in den
nächsten drei, fünf Jahren wohl nicht behoben werden.
Jetzt wissen wir also, dass es eine große Schwachstelle in der Interaktion
mit Dateien geben könnte, und ich würde vorschlagen, dass wir sie herausfinden.
Ja.
Und hier haben wir eine Musikanwendung, die den folgenden Inhaltsanbieter definiert.
Wie wir sehen, wird sie exportiert, so dass eine Interaktion mit ihr von einer Drittanwendung aus möglich ist.
In unserem Fall haben wir unsere eigene Anwendung auf der rechten Seite.
Okay, nehmen wir an, wir haben folgenden Anwendungsfall.
Die Musikanwendung übernimmt eine Datei aus unserer eigenen Anwendung und spielt sie ab.
Daher stellen wir im Rahmen der Interaktion mit dem Inhaltsanbieter einen URI bereit, der
unsere Datei nach folgendem Schema anspricht: Inhalt, Doppelpunkt Schrägstrich Schrägstrich Behörde Schrägstrich Ablage.
Die Musikanwendung löst diesen URI auf und greift auf die Datei zu.
Und in diesem Fall zum Beispiel das Spielen.
Okay, so weit scheint alles in Ordnung zu
sein, oder? Nun, ganz und gar nicht.
Sehen wir uns mit den Augen eines Angreifers an, ob wir den Dateinamen
ermitteln können, indem wir keine Datei aus dem internen Verzeichnis dieser Anwendung auswählen.
Also das geschützte Kontextverzeichnis der Zip-Datei.
Wir sprechen über die Daten.
Datenverzeichnis.
Erinnern Sie sich noch an unsere Alarmanwendung mit der
Pin-xml-Datei in unseren Einstellungen? Natürlich tun Sie das.
Und wissen Sie was? Wir können die Anwendung jetzt dazu
bringen, diese Datei für uns zu öffnen, so dass
wir sie einfach auf die folgende Weise bereitstellen können.
Also in Inhalt, Doppelpunkt, Schrägstrich, Schrägstrich unsere Autorität und dann Schrägstrich Datei und ändern Sie die einfach
nur in Pfad-Traversal, die ein Verzeichnis zurück geht Eingabe der Freigabeeinstellungen und das Öffnen der pin xml.
Je nach Code zeigt die Anwendung diesen Inhalt an oder gibt
ihn an unsere eigene Anwendung zurück, was für einen Angreifer noch
verblüffender wäre, da dies aus der Ferne ausgenutzt werden könnte.
Wir könnten also dieses Inhaltsschema verwenden, um auf jede Datei im geschützten Datenverzeichnis dieser Anwendung zuzugreifen.
Erstaunlich, oder? Auf
jeden Fall.
Wie das alles funktioniert, werden wir in den nächsten Videos herausfinden.
Im ersten Teil werden wir eine SQL-Injektion durchführen und im
zweiten Teil werden wir uns eine Sicherheitslücke beim Zugriff auf
diese Dateien ansehen und ein Beispiel aus der Praxis betrachten.
Trend Micro hat also im Jahr 2020 Ihre Anwendung analysiert und eine
Karte erstellt und genau diese Art von Schwachstelle in ihrer Anwendung gefunden.
Aber das ist natürlich von Anwendung zu Anwendung unterschiedlich.
Also gut.
Ja.
Ich denke, wir haben jetzt alles gesehen, was in der Theorie vorkommt, und lassen Sie uns das ein wenig üben.
Lassen Sie uns herausfinden, wie man diesen Inhaltsanbieter ausnutzen kann.
Deshalb freue ich mich darauf, Sie im nächsten Video zu sehen.