Heim >Backend-Entwicklung >Python-Tutorial >So führen Sie Path-Injection-Angriffe durch und erkennen sie
Erstens einmal bin ich kein Spezialist auf diesem Gebiet, ich lerne und habe Spaß daran, KI-Tools zu nutzen.
Das heißt... Ich habe eine Entwicklung für einen Freund gemacht, er hat ein PDF mit 100 Blättern, mit Aufzeichnungen über Banktransaktionen. Sie müssen diese Datensätze in Excel haben, um sie später verarbeiten zu können.
Mithilfe von Github Copilot habe ich ein Skript für die Datenextraktion mit Python und einigen Bibliotheken erstellt ... Drei Doritos später ... Und als Frühstücks-, Mittag- und Abendessensysteme habe ich einen Flaschenserver gebaut, um das Skript bereitzustellen über einen Endpunkt in einer Front mit HTML, CSS und JS schlicht und einfach.
Während des Interaktionsprozesses mit Copilot wurde eine Warnung ausgegeben, dass ein Teil des Codes eine Schwachstelle vom Typ „Pfadinjektion“ aufwies. Diese Warnung ist ziemlich interessant :D
Und da ich mehr über Computersicherheit erfahren möchte, blogge ich hier, um eine Aufzeichnung dieser Reise zu hinterlassen...
Hier beginnt die KI zu sprechen.
Ein Angreifer könnte eine Path-Injection-Schwachstelle ausnutzen, indem er Benutzereingaben manipuliert, um auf nicht autorisierte Dateien oder Verzeichnisse im Dateisystem des Servers zuzugreifen. Hier ist ein Beispiel, wie Sie es tun könnten:
Angenommen, Sie haben in Ihrer Flask-Anwendung eine Route, die es Benutzern ermöglicht, Dateien hochzuladen und auf dem Server zu speichern. Wenn Sie den Dateinamen nicht validieren oder bereinigen, könnte ein Angreifer einen bösartigen Dateinamen senden, um zu versuchen, auf vertrauliche Dateien im System zuzugreifen.
Anfälliger Code
@app.route('/upload', methods=['POST']) def upload(): file = request.files['file'] filename = file.filename # Nombre del archivo proporcionado por el usuario save_path = os.path.join('uploads', filename) # Guardar el archivo sin validar el nombre del archivo with open(save_path, 'wb') as f: f.write(file.read()) return 'File uploaded successfully'
Path-Injection-Angriff
Ein Angreifer könnte eine Anfrage mit einem bösartigen Dateinamen wie ../../etc/passwd senden. Dies könnte zu folgender Route führen:
uploads/../../etc/passwd
Wenn der Server den Dateinamen nicht validiert oder bereinigt, könnte die Datei an einem unerwünschten Ort gespeichert werden, sodass der Angreifer vertrauliche Dateien auf dem System überschreiben kann.
Lösung: Validieren und bereinigen Sie den Eintrag
Um diese Art von Angriffen zu vermeiden, müssen Sie den Dateinamen vor dem Speichern validieren und bereinigen. Hier ist eine sichere Version des Codes:
Sicherer Code
import os import re from flask import Flask, render_template, request, send_file import requests from datetime import datetime app = Flask(__name__) def sanitize_filename(filename): # Eliminar caracteres no permitidos del nombre del archivo return re.sub(r'[^a-zA-Z0-9_\-\.]', '', filename) @app.route('/') def index(): return render_template('index.html') @app.route('/upload', methods=['POST']) def upload(): file = request.files['file'] response = requests.post('http://127.0.0.1:5001/pdf-to-excel', files={'file': file}) # Obtener la fecha actual current_date = datetime.now().strftime("%Y%m%d") # Obtener el nombre original del archivo sin la extensión original_filename = os.path.splitext(file.filename)[0] # Sanitizar el nombre del archivo sanitized_filename = sanitize_filename(original_filename) # Crear el nuevo nombre del archivo con la fecha al final output_filename = f'{sanitized_filename}_{current_date}.xlsx' # Crear la ruta completa del archivo save_path = os.path.join('uploads', output_filename) # Asegurarse de que la ruta sea absoluta save_path = os.path.abspath(save_path) # Guardar el archivo Excel resultante localmente con el nuevo nombre with open(save_path, 'wb') as f: f.write(response.content) # Enviar el archivo Excel de vuelta al usuario con el nuevo nombre return send_file(save_path, as_attachment=True, download_name=output_filename) if __name__ == '__main__': app.run(port=5000, debug=True)
Erläuterung des sicheren Codes
Dateinamen bereinigen: Die Funktion sanitize_filename entfernt mithilfe eines regulären Ausdrucks illegale Zeichen aus dem Dateinamen.
Erstellen Sie den vollständigen Dateipfad: Die Funktion os.path.join wird verwendet, um den vollständigen Dateipfad zu erstellen, indem das Zielverzeichnis (Uploads) mit dem bereinigten Dateinamen (output_filename) kombiniert wird.
Stellen Sie sicher, dass der Pfad absolut ist: Die Funktion os.path.abspath wandelt den Pfad in einen absoluten Pfad um, um Manipulationen mit relativen Pfaden zu vermeiden.
Datei speichern: Abschließend wird die Datei im angegebenen Pfad gespeichert.
Zusammenfassung
Path Injection: Ein Angreifer kann Benutzereingaben manipulieren, um auf nicht autorisierte Dateien oder Verzeichnisse zuzugreifen.
Validierung und Bereinigung: Validieren und bereinigen Sie Benutzereingaben immer, um Path-Injection-Angriffe zu vermeiden.
Absolute Routen: Verwenden Sie absolute Routen, um Manipulationen mit relativen Routen zu vermeiden.
Indem Sie diese Vorgehensweisen befolgen, können Sie Ihre Anwendung vor Path-Injection-Angriffen schützen und die Gesamtsicherheit Ihres Systems verbessern.
Hier habe ich ihn gefragt, wie er den Angriff durchführen soll. Darüber hinaus habe ich Protokolle registriert, um diese Fälle debuggen zu können.
Um Ihre Anwendung vor Path-Injection-Angriffen zu schützen, ist es hilfreich zu verstehen, wie diese Angriffe durchgeführt werden können. Hier zeige ich Ihnen, wie ein Angreifer versuchen könnte, Ihre Anwendung auszunutzen und wie Sie diese Aktivitäten in den Protokollen erkennen können.
HTML-Formulare bearbeiten
Ein Angreifer kann ein HTML-Formular manipulieren, um einen schädlichen Dateinamen zu übermitteln.
Schritt für Schritt:
@app.route('/upload', methods=['POST']) def upload(): file = request.files['file'] filename = file.filename # Nombre del archivo proporcionado por el usuario save_path = os.path.join('uploads', filename) # Guardar el archivo sin validar el nombre del archivo with open(save_path, 'wb') as f: f.write(file.read()) return 'File uploaded successfully'
Senden manipulierter HTTP-Anfragen
Ein Angreifer kann Postman verwenden, um manipulierte HTTP-Anfragen direkt an den Server zu senden.
Schritt für Schritt:
Python-Skripte verwenden
Ein Angreifer kann Python-Skripte verwenden, um bösartige HTTP-Anfragen zu senden.
Python-Skriptbeispiel:
import os import re from flask import Flask, render_template, request, send_file import requests from datetime import datetime app = Flask(__name__) def sanitize_filename(filename): # Eliminar caracteres no permitidos del nombre del archivo return re.sub(r'[^a-zA-Z0-9_\-\.]', '', filename) @app.route('/') def index(): return render_template('index.html') @app.route('/upload', methods=['POST']) def upload(): file = request.files['file'] response = requests.post('http://127.0.0.1:5001/pdf-to-excel', files={'file': file}) # Obtener la fecha actual current_date = datetime.now().strftime("%Y%m%d") # Obtener el nombre original del archivo sin la extensión original_filename = os.path.splitext(file.filename)[0] # Sanitizar el nombre del archivo sanitized_filename = sanitize_filename(original_filename) # Crear el nuevo nombre del archivo con la fecha al final output_filename = f'{sanitized_filename}_{current_date}.xlsx' # Crear la ruta completa del archivo save_path = os.path.join('uploads', output_filename) # Asegurarse de que la ruta sea absoluta save_path = os.path.abspath(save_path) # Guardar el archivo Excel resultante localmente con el nuevo nombre with open(save_path, 'wb') as f: f.write(response.content) # Enviar el archivo Excel de vuelta al usuario con el nuevo nombre return send_file(save_path, as_attachment=True, download_name=output_filename) if __name__ == '__main__': app.run(port=5000, debug=True)
Erkennung in Protokollen: Zeichnet den Namen der empfangenen Datei in den Protokollen auf.
Implementierung von Protokollen zur Erkennung
Hier ist eine vollständige Implementierung, die eine Protokollierung zur Erkennung verdächtiger Dateinamen umfasst:
@app.route('/upload', methods=['POST']) def upload(): file = request.files['file'] filename = file.filename # Nombre del archivo proporcionado por el usuario save_path = os.path.join('uploads', filename) # Guardar el archivo sin validar el nombre del archivo with open(save_path, 'wb') as f: f.write(file.read()) return 'File uploaded successfully'
Zusammenfassung
Aus dem Browser: Bearbeiten von HTML-Formularen oder Verwenden von Browser-Entwicklungstools.
Verwendung von Tools wie Postman: Senden manipulierter HTTP-Anfragen direkt an den Server.
Verwendung automatisierter Skripte: Verwendung von Skripten in Python, Bash oder einer anderen Sprache, um bösartige HTTP-Anfragen zu senden.
Protokollerkennung: Zeichnet den Namen der empfangenen Datei und andere verdächtige Aktivitäten in den Protokollen auf, um mögliche Angriffe zu erkennen.
Durch die Umsetzung dieser Maßnahmen können Sie die Sicherheit Ihrer Anwendung verbessern und verdächtige Aktivitäten erkennen, die auf einen Angriffsversuch hinweisen könnten.
Fazit: In diesem Kontext des Lernens und der Entwicklung von Paarprogrammierung mit KI finde ich diese Art von Warnungen auf der Plattform äußerst nützlich, um Schwachstellen zu erkennen. Heute bin ich aufgewacht und dachte, ich würde Heroku wieder einsetzen, und hier entdecke ich verschiedene Schwachstellen :D
Viel Spaß beim Codieren!
Das obige ist der detaillierte Inhalt vonSo führen Sie Path-Injection-Angriffe durch und erkennen sie. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!