Kürzlich ist mir eine Sicherheitslücke bei der Formatierung von Zeichenfolgen aufgefallen. Ich habe eine ausführliche Analyse durchgeführt und entsprechende Sicherheitsmaßnahmen bereitgestellt.
Wenn wir str.format für nicht vertrauenswürdige Benutzereingaben verwenden, birgt dies Sicherheitsrisiken – ich kenne dieses Problem tatsächlich schon seit langem, habe aber bis heute nicht wirklich erkannt, wie schwerwiegend es ist. Da Angreifer damit die Jinja2-Sandbox umgehen können, führt dies zu ernsthaften Problemen mit Informationslecks. In der Zwischenzeit stelle ich am Ende dieses Artikels eine neue sichere Version von str.format bereit.
Es sollte daran erinnert werden, dass dies ein ziemlich ernstes Sicherheitsrisiko darstellt. Der Grund, warum ich hier einen Artikel schreibe, ist, dass die meisten Menschen wahrscheinlich nicht wissen, wie einfach es ist, es auszunutzen.
Ab Python 2.6 hat Python eine neue Syntax zum Formatieren von Zeichenfolgen eingeführt, die von .NET inspiriert ist. Natürlich unterstützen neben Python auch Rust und einige andere Programmiersprachen diese Syntax. Mit Hilfe der .format()-Methode kann diese Syntax sowohl auf Byte- als auch auf Unicode-Strings angewendet werden (in Python 3 nur auf Unicode-Strings) und kann auch auf anpassbarere Strings abgebildet werden.
Ein Merkmal dieser Syntax besteht darin, dass sie es ermöglicht, die Positions- und Schlüsselwortargumente des String-Formats zu bestimmen und die Datenelemente jederzeit explizit neu anzuordnen. Darüber hinaus kann es sogar auf die Eigenschaften und Datenelemente des Objekts zugreifen – was hier die Hauptursache für das Sicherheitsproblem darstellt.
Insgesamt kann man dies ausnutzen, um Folgendes zu tun:
1 2 |
|
Im Wesentlichen hat jeder, der die Kontrolle über die Formatzeichenfolge hat, die Möglichkeit, auf verschiedene interne Eigenschaften des Objekts zuzugreifen.
Die erste Frage ist, wie man die Formatzeichenfolge steuert. Sie können an folgenden Stellen beginnen:
1. Nicht vertrauenswürdiger Übersetzer in der String-Datei. Wir werden wahrscheinlich damit durchkommen, da viele in mehrere Sprachen übersetzte Anwendungen diese neue Python-String-Formatierungsmethode verwenden, aber nicht jeder wird eine gründliche Überprüfung aller eingegebenen Strings durchführen.
2. Vom Benutzer bereitgestellte Konfiguration. Da einige Systembenutzer bestimmte Verhaltensweisen konfigurieren können, werden diese Konfigurationen möglicherweise in Form von Formatzeichenfolgen angezeigt. Besonders hervorzuheben ist, dass einige Benutzer Benachrichtigungs-E-Mails, Protokollnachrichtenformate oder andere grundlegende Vorlagen über die Webanwendung konfiguriert haben.
Wenn Sie nur das C-Interpreterobjekt an die Formatzeichenfolge übergeben, besteht keine große Gefahr, da Sie in diesem Fall höchstens einige Ganzzahlklassen offenlegen.
Sobald jedoch ein Python-Objekt an diese Formatzeichenfolge übergeben wird, wird es problematisch. Das liegt daran, dass die Menge an Dingen, die von Python-Funktionen bereitgestellt werden können, ziemlich atemberaubend ist. Hier ist ein Szenario für eine hypothetische Webanwendung, die den Schlüssel preisgeben könnte:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Wenn der Benutzer hier format_string einfügen könnte, würde er so etwas wie diese geheime Zeichenfolge finden:
1 |
|
Was ist, wenn Sie jemand anderen benötigen, der die Formatierungszeichenfolge bereitstellt? Tatsächlich können einige undokumentierte interne Mechanismen verwendet werden, um das Formatierungsverhalten von Zeichenfolgen zu ändern.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
|
Jetzt können wir die Methode „safe_format“ verwenden, um str.format zu ersetzen:
1 2 3 4 5 6 |
|
In der Programmentwicklung gibt es ein Sprichwort: „any“. Vertrauen Sie niemals Benutzereingaben! Nun scheint es, dass dieser Satz vollkommen Sinn ergibt. Also Studierende, bitte behaltet dies im Hinterkopf!
【Kursempfehlung】
Python Kostenloses Online-Video-Tutorial
Das obige ist der detaillierte Inhalt vonPython-Sicherheit: Schwachstellenanalyse und Lösungen im neuen String-Format. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!