atak polegający na przemierzaniu ścieżek – luka w zabezpieczeniach umożliwiająca przesyłanie plików

Przemierzanie ścieżki podczas przesyłania plików: jak programiści tworzą własne exploity

Kiedy przesyłanie plików staje się dostępem do plików

Pojedynczy niezabezpieczony moduł obsługi przesyłania może otworzyć furtkę do ataku typu full path traversal i podatności na przesyłanie plików. Gdy programiści łączą nazwy plików bezpośrednio ze ścieżkami przesyłania, atakujący mogą przesyłać złośliwe nazwy plików lubić ../../etc/passwd aby wyjść z katalogów i uzyskać dostęp do poufnych plików. Ten typ przemierzania ścieżki zmienia proste API przesyłania w potężną lukę w dostępie do plików, szczególnie gdy aplikacja działa z podwyższonymi uprawnieniami.

⚠️Niebezpieczny przykład, wyłącznie do celów edukacyjnych. Nie używać w środowisku produkcyjnym.

				
					// Vulnerable upload handler, file upload vulnerability
[HttpPost("/upload")]
public async Task<IActionResult> Upload(IFormFile file)
{
    var path = Path.Combine("uploads/", file.FileName);  // No validation
    using var stream = new FileStream(path, FileMode.Create);
    await file.CopyToAsync(stream);
    return Ok("File uploaded!");
}

				
			

Atakujący może przesłać plik o nazwie ../../web.config nadpisywać lub odczytywać zastrzeżone pliki, klasyczny atak polegający na przemierzaniu ścieżki.

Wersja bezpieczna:

				
					// Safe upload with validation and canonicalization
[HttpPost("/upload")]
public async Task<IActionResult> Upload(IFormFile file)
{
    var fileName = Path.GetFileName(file.FileName); // strip directories
    var targetDir = Path.GetFullPath("uploads/");
    var safePath = Path.Combine(targetDir, fileName);


    if (!safePath.StartsWith(targetDir))
        return BadRequest("Invalid file path");


    using var stream = new FileStream(safePath, FileMode.Create);
    await file.CopyToAsync(stream);
    return Ok("File securely uploaded!");
}

				
			

Uwaga edukacyjna: Zawsze kanonizuj ścieżki za pomocą Ścieżka.GetFullPath() i sprawdź, czy wynik pozostaje w katalogu do przesłania. Nigdy nie ufaj plik.NazwaPliku bezpośrednio.

Błędy programistów umożliwiające przemierzanie ścieżek

Większość luk w zabezpieczeniach przesyłania plików, które prowadzą do przechodzenia przez ścieżkę, wynika z pośpiesznego pisania kodu i braku walidacji. Typowe błędy programistów obejmują:

  • Łączenie danych wprowadzanych przez użytkownika bezpośrednio ze ścieżkami systemu plików
  • Ufny Typ zawartości lub tylko walidacja rozszerzenia
  • Pomijanie normalizacji ścieżek przed zapisaniem

Ponowne wykorzystywanie folderów tymczasowych w różnych żądaniach lub mikrousługach

⚠️Niebezpieczny przykład, wyłącznie do celów edukacyjnych. Nie używać w środowisku produkcyjnym.

				
					# Flask example vulnerable to path traversal attack
@app.route('/upload', methods=['POST'])
def upload():
    file = request.files['file']
    file.save('uploads/' + file.filename)
    return 'Uploaded'

				
			

Atakujący mogą ominąć to proste połączenie, aby przejść przez katalogi (../../app.py) i zapisywać lub nadpisywać dowolne pliki. Wersja bezpieczna:

				
					# Safe file upload validation
from werkzeug.utils import secure_filename
@app.route('/upload', methods=['POST'])
def upload():
    file = request.files['file']
    name = secure_filename(file.filename)
    path = os.path.join('uploads', name)
    file.save(path)
    return 'Securely uploaded'

				
			

Uwaga edukacyjna: Użyj pomocników dostarczanych przez framework, takich jak bezpieczna_nazwa_pliku i wymuszaj stosowanie rozszerzeń z listy dozwolonych. Nigdy nie łącz ręcznie danych wejściowych ze ścieżkami plików.

Eksploatacja w rzeczywistości Pipelinei mikrousługi

Ataki typu path traversal nie zdarzają się tylko w publicznych punktach końcowych. Często pojawiają się w ich obrębie. CI/CD systemy, repozytoria artefaktów lub mikrousługi zarządzające przesyłanymi plikami. Na przykład luka w zabezpieczeniach umożliwiająca przesyłanie plików w menedżerze artefaktów kompilacji może umożliwić atakującemu nadpisanie skryptów kompilacji lub wstrzykiwać złośliwe pliki do współdzielonych serwerów.

⚠️Niebezpieczny przykład, wyłącznie do celów edukacyjnych. Nie używać w środowisku produkcyjnym.

				
					# Never expose real tokens, credentials, or internal URLs in pipelines
- name: Store build artifact
  run: cp $UPLOAD_PATH/$FILENAME /var/artifacts/$FILENAME

				
			

If $NAZWAPLIKU nie jest zweryfikowany, jest sfabrykowany ../../../etc/passwd wartość może nadpisać krytyczne pliki systemowe podczas wdrażania, co jest atakiem polegającym na omijaniu ścieżki w świecie rzeczywistym. Wersja bezpieczna: 

				
					# Safer artifact storage guardrail
- name: Store build artifact securely
  run: |
    SAFE_NAME=$(basename "$FILENAME")
    cp "$UPLOAD_PATH/$SAFE_NAME" /var/artifacts/"$SAFE_NAME"

				
			

Uwaga edukacyjna: In pipelines, zdezynfekuj wszystkie dynamiczne zmienne ścieżki. Ogranicz operacje zapisu do kontrolowanych katalogów, aby zapobiec ucieczce systemu plików podczas kompilacji lub wdrożeń.

Zapobieganie przechodzeniu ścieżki w logice przesyłania

Ograniczanie ryzyka przemierzania ścieżek zaczyna się od ścisłej walidacji i izolacji danych wejściowych. Traktuj nazwy plików i ścieżki jako dane wejściowe, którym nie można ufać, od samego początku, zwłaszcza podczas obsługi przesyłanych plików.

Najlepsze praktyki

  1. Normalizuj i kanonizuj wszystkie ścieżki przed ich użyciem.
  2. Ogranicz przesyłanie do dedykowanego katalogu poza katalogiem głównym witryny.
  3. Wymuś listy dozwolonych dla rozszerzeń plików i typów MIME.
  4. Nigdy nie używaj ponownie folderów tymczasowych między sesjami lub użytkownikami.
  5. Użyj kontenerowego magazynu jeśli to możliwe, w przypadku przesłanych plików.

Mini lista kontrolna działań zapobiegawczych

  • Sprawdź każdą nazwę pliku za pomocą Ścieżka.PobierzNazwęPliku() lub odpowiednik.
  • Rozwiąż pełne ścieżki i zweryfikuj granice katalogów.
  • Zastosuj rozszerzenia i listy dozwolonych MIME.
  • Użyj oddzielnych folderów do przesyłania danych dla każdego użytkownika lub sesji.
  • Uwzględnij skanowanie i walidację przesyłania CI/CD testów.

Uwaga edukacyjna: Każdy moduł obsługi przesyłania plików to potencjalny wektor ataku polegającego na przekroczeniu ścieżki. Zbuduj kompleksową obronę, weryfikując, izolując i skanując cały kod obsługi plików.

Jak Xygeni wykrywa i blokuje niebezpieczne przepływy przesyłania danych

Xygeni Code Security skany bazy kodów i pipelines w celu wykrycia wzorców poruszania się po ścieżkach zanim dotrą one do produkcji. Oznacza niebezpieczne łączenie ścieżek, brak kanonizacji i niebezpieczne operacje na plikach zarówno w kodzie, jak i CI/CD skrypty.

Fragment funkcjonalny z zabezpieczeniem kontrolnym:

				
					# Secure enforcement with Xygeni
- name: Enforce secure upload and path handling
  run: dotnet xygeni enforce --rules uploads,path,security --fail-on-risk

				
			

Uwaga edukacyjna: Integracja Xygeni w wiadomościach pipeline zapewnia, że ​​luki w zabezpieczeniach związane z przesyłaniem plików i ataki polegające na przemierzaniu ścieżki są automatycznie wykrywane podczas walidacji kompilacji.

Zamykanie luki: zapobieganie kolejnym atakom polegającym na przechodzeniu przez ścieżkę

Błąd polegający na przechodzeniu pojedynczej ścieżki w punkcie końcowym przesyłania pliku może umożliwić atakującym dostęp do systemu plików Twojego serwera. Sprawdź procedury przesyłania pod kątem niebezpiecznych połączeń, znormalizuj wszystkie ścieżki i nigdy nie ufaj nazwom plików kontrolowanym przez użytkownika. Dodaj narzędzia do skanowania podatności lubić Xygeni Code Security dla Twojej DevSecOps pipeline w celu wykrywania ataków polegających na przemierzaniu ścieżki i luk w zabezpieczeniach przesyłania plików przed ich wysłaniem. Ze względów bezpieczeństwa każdy zapisany plik musi być traktowany jako wykonany kod!

sca-tools-oprogramowanie-narzędzia-analizy-kompozycji
Określ priorytety, rozwiąż problemy i zabezpiecz zagrożenia związane z oprogramowaniem
Załóż darmowe konto.
Nie wymagamy karty kredytowej.

Zabezpiecz rozwój i dostarczanie oprogramowania

z pakietem produktów Xygeni