Heim  >  Artikel  >  Backend-Entwicklung  >  So führen Sie Path-Injection-Angriffe durch und erkennen sie

So führen Sie Path-Injection-Angriffe durch und erkennen sie

DDD
DDDOriginal
2024-10-19 12:33:29899Durchsuche

Cómo Realizar y Detectar Ataques de Path Injection

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:

Beispiel für eine Pfadinjektion

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.

1. Über den Browser

HTML-Formulare bearbeiten
Ein Angreifer kann ein HTML-Formular manipulieren, um einen schädlichen Dateinamen zu übermitteln.

Schritt für Schritt:

  • Öffnen Sie die Webseite mit dem Datei-Upload-Formular.
  • Verwenden Sie die Entwicklertools des Browsers (F12), um das Formular zu überprüfen.
  • Ändert den Wert des Dateifelds, um einen schädlichen Pfad einzuschließen, zum Beispiel ../../etc/passwd.
  • Formular abschicken.
  • Erkennung in Protokollen: Zeichnet den Namen der empfangenen Datei in den Protokollen auf.
@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'

2. Verwenden von Tools wie Postman

Senden manipulierter HTTP-Anfragen
Ein Angreifer kann Postman verwenden, um manipulierte HTTP-Anfragen direkt an den Server zu senden.

Schritt für Schritt:

  • Öffnen Sie Postman und konfigurieren Sie eine POST-Anfrage an http://127.0.0.1:5000/upload.
  • Wählen Sie im Hauptteil der Anfrage form-data aus und fügen Sie ein Dateifeld mit einer Datei hinzu, deren Name ../../etc/passwd ist.
  • Senden Sie die Anfrage.
  • Erkennung in Protokollen: Zeichnet den Namen der empfangenen Datei in den Protokollen auf.

3. Durch automatisierte Skripte

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn