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
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