Turvallinen koodaus ja backendin OWASP Top 10 · Oppitunti

SSRF-hyökkäysten estäminen

Oppikaa tunnistamaan ja lieventämään Server-Side Request Forgery (SSRF) -haavoittuvuuksia validoimalla URL-osoitteet ja rajoittamalla lähteviä verkkopyyntöjä.

Oppitunti 3/411 vaihetta

SSRF-hyökkäysten estäminen on ilmainen Turvallinen koodaus ja backendin OWASP Top 10-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Turvallinen koodaus ja backendin OWASP Top 10-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Turvallinen koodaus ja backendin OWASP Top 10-kurssilla on yhteensä 4 oppituntia.

SSRF-hyökkäysten ymmärtäminen

Server-Side Request Forgery (SSRF) on vakava verkkotietoturvan haavoittuvuus. Siinä palvelin huijataan tekemään pyyntö tahattomaan kohteeseen, usein sisäisiin resursseihin tai muihin ulkoisiin palveluihin.

Kuvitelkaa, että taustajärjestelmän sovellus toimii välityspalvelimena ja hakee tietoja tai resursseja käyttäjän puolesta. Jos hyökkääjä voi hallita näiden pyyntöjen kohdetta, sovelluksessa on SSRF-haavoittuvuus.

Miten SSRF toimii

SSRF toimii tyypillisesti seuraavasti:

  • Sovellus hyväksyy käyttäjältä URL-osoitteen.
  • Palvelin tekee kyseiseen URL-osoitteeseen pyynnön tietojen (esim. kuvan, tiedoston tai verkkosivun) hakemiseksi.
  • Hyökkääjä antaa haitallisen URL-osoitteen, joka osoittaa sisäiseen IP-osoitteeseen tai arkaluonteiseen palveluun.
  • Syötteeseen luottava palvelin tekee pyynnön ja saattaa paljastaa sisäisiä tietoja tai palveluita.

SSRF:n vaarat

Onnistuneen SSRF-hyökkäyksen seuraukset voivat olla vakavia:

  • Pääsy sisäisiin järjestelmiin: Hyökkääjät voivat kartoittaa sisäisiä verkkoja sekä käyttää tietokantoja tai hallintaliittymiä.
  • Pilven metatietojen paljastuminen: Pilvialustoilla (AWS, GCP, Azure) SSRF voi paljastaa arkaluonteisia instanssin metatietoja, kuten väliaikaisia tunnistetietoja.
  • Yhteydenotto muihin palveluihin: Palvelin voidaan pakottaa käyttämään muita ohjelmointirajapintoja tai palveluita, joihin sillä on pääsy, ja suorittamaan luvattomia toimintoja.
  • Porttien skannaus: Hyökkääjät voivat käyttää palvelinta muiden sisäisten tai ulkoisten koneiden porttien skannaamiseen.

Haavoittuva koodi toiminnassa

Tarkastellaan yksinkertaista taustajärjestelmän palvelua, joka hakee sisältöä käyttäjän antamasta URL-osoitteesta. Tämä Java-esimerkki näyttää yleisen mallin, joka voi johtaa SSRF-haavoittuvuuteen.

fetchContent-metodi käyttää käyttäjän antamaa URL-osoitetta suoraan HTTP-pyynnön tekemiseen ilman validointia.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;

public class Main {
  public static void main(String[] args) {
    // In a real app, this URL would come from user input (e.g., a web parameter)
    String userSuppliedUrl = "http://example.com/data.txt";
    // Malicious example: "http://169.254.169.254/latest/meta-data/"

    try {
      System.out.println("Fetching content from: " + userSuppliedUrl);
      String content = fetchContent(userSuppliedUrl);
      System.out.println("--- Fetched Content ---");
      System.out.println(content.substring(0, Math.min(content.length(), 100)) + "...");
      System.out.println("-----------------------");
    } catch (Exception e) {
      System.err.println("Error fetching content: " + e.getMessage());
    }
  }

  public static String fetchContent(String urlString) throws Exception {
    URL url = new URL(urlString);
    URLConnection connection = url.openConnection();
    BufferedReader in = new BufferedReader(
        new InputStreamReader(connection.getInputStream()));
    String inputLine;
    StringBuilder content = new StringBuilder();
    while ((inputLine = in.readLine()) != null) {
      content.append(inputLine);
    }
    in.close();
    return content.toString();
  }
}

Sallittujen luetteloiden voima

Vahvin suoja SSRF:ää vastaan on sallittujen luettelo. Sen sijaan että yrittäisitte estää haitallisia syötteitä, sallikaa vain ennalta tunnetut ja turvalliset syötteet.

URL-osoitteiden tapauksessa tämä tarkoittaa tiukan luettelon määrittämistä sallituista toimialueista, isäntänimistä tai IP-osoitteista, joihin sovellus saa muodostaa yhteyden. Kaikki pyynnöt luettelon ulkopuolisiin kohteisiin on estettävä.

URL-osoitteiden sallittujen luetteloa käyttävä koodi

Päivitetään edellistä esimerkkiämme lisäämällä siihen sallittujen luettelon tarkistus. Määritämme sallitut toimialueet ja tarkistamme syöte-URL-osoitteen niitä vasten ennen verkkopyyntöjen tekemistä.

Näin varmistetaan, että palvelin muodostaa yhteyden vain luotettuihin ulkoisiin palveluihin.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.Arrays;
import java.util.List;

public class Main {
  private static final List<String> ALLOWED_HOSTS = Arrays.asList(
      "example.com", "mytrustedapi.com"
  );

  public static void main(String[] args) {
    String safeUrl = "http://example.com/data.txt";
    String maliciousUrl = "http://badsite.com/evil.php";

    try {
      System.out.println("\nAttempting to fetch from: " + safeUrl);
      String content = fetchContentSafely(safeUrl);
      System.out.println("Fetched (safe): " + content.substring(0, Math.min(content.length(), 50)) + "...");
    } catch (Exception e) {
      System.err.println("Error fetching (safe): " + e.getMessage());
    }

    try {
      System.out.println("\nAttempting to fetch from: " + maliciousUrl);
      String content = fetchContentSafely(maliciousUrl);
      System.out.println("Fetched (malicious): " + content.substring(0, Math.min(content.length(), 50)) + "...");
    } catch (Exception e) {
      System.err.println("Error fetching (malicious): " + e.getMessage());
    }
  }

  public static String fetchContentSafely(String urlString) throws Exception {
    URL url = new URL(urlString);
    String host = url.getHost();

    if (!ALLOWED_HOSTS.contains(host)) {
      throw new IllegalArgumentException("Host not allowed: " + host);
    }

    URLConnection connection = url.openConnection();
    BufferedReader in = new BufferedReader(
        new InputStreamReader(connection.getInputStream()));
    String inputLine;
    StringBuilder content = new StringBuilder();
    while ((inputLine = in.readLine()) != null) {
      content.append(inputLine);
    }
    in.close();
    return content.toString();
  }
}

Estettyjen luettelo: riskialtis lähestymistapa

Saatat ajatella, että tunnettujen haitallisten IP-osoitteiden tai verkkotunnusten estäminen on helpompaa. Estolistat ovat kuitenkin luonnostaan heikko suoja SSRF-hyökkäyksiä vastaan.

Hyökkääjät voivat ohittaa estolistat monenlaisilla keinoilla:

  • IP-osoitteen koodaus: IP-osoitteiden esittäminen desimaali-, oktaali- tai heksadesimaalimuodossa (esimerkiksi http://0x7f000001 localhostille).
  • DNS-uudelleensidonta: DNS-tietueiden muuttaminen niin, että aluksi turvalliselta vaikuttava verkkotunnus osoittaa tarkistuksen jälkeen sisäiseen IP-osoitteeseen.
  • URL-lyhentimet: Haitallisten URL-osoitteiden piilottaminen näennäisen harmittoman lyhyen URL-osoitteen taakse.
  • Erikoisprotokollat: file://-, gopher://- tai data://-skeemojen käyttäminen, jos niitä ei ole erikseen estetty.

Suosikaa aina sallittujen luetteloa!

Monikerroksinen suojaus: verkkosäännöt

URL-osoitteiden sovellustason tarkistuksen lisäksi on toteutettava myös verkkotason hallintatoimia:

  • Palomuurisäännöt: Määrittäkää palomuurit estämään sovelluspalvelimelta lähtevät yhteydet sisäisiin IP-osoitealueisiin (esimerkiksi 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 127.0.0.1/8).
  • Verkon segmentointi: Eristäkää ulkoisia pyyntöjä tekevä palvelin omaan verkkosegmenttiinsä ja antakaa sille vain vähäinen pääsy muihin sisäisiin resursseihin.
  • Vähimmät oikeudet: Varmistakaa, että sovelluksen suoritusympäristöllä on vain tarvittava verkkopääsy.

Nämä toimet muodostavat ratkaisevan toisen suojakerroksen.

Hankalat URL-osoitteet ja uudelleenohjaukset

SSRF-hyökkäyksissä voidaan hyödyntää myös URL-osoitteiden käsittelyn yksityiskohtia:

  • Epäyhtenäiset URL-jäsentimet: Eri kirjastot tai järjestelmät voivat tulkita URL-osoitteen eri tavoin, mikä saattaa mahdollistaa tarkistuksen ohittamisen. Käyttäkää aina yhtenäistä ja vankkaa jäsennintä.
  • HTTP-uudelleenohjaukset: Hyökkääjä voi antaa sallittujen luettelossa olevan URL-osoitteen, joka ohjautuu sen jälkeen estettyyn sisäiseen IP-osoitteeseen. Sovelluksen on seurattava uudelleenohjauksia huolellisesti ja tarkistettava lopullinen kohde-URL uudelleen.

Tarkistakaa aina ratkaistu URL-osoite uudelleen uudelleenohjausten jälkeen ja ennen lopullisen pyynnön lähettämistä.

SSRF-hyökkäysten estäminen

Mikä seuraavista on tehokkain strategia palvelinpuolen pyyntöjen väärentämisestä (SSRF) johtuvien haavoittuvuuksien estämiseen?

Kertaus: suojaudu SSRF-hyökkäyksiltä

Olette oppineet tunnistamaan ja estämään SSRF-hyökkäyksiä!

  • SSRF mahdollistaa palvelimen luvattomien pyyntöjen lähettämisen sisäisiin tai ulkoisiin järjestelmiin.
  • Tehokkain suojaus on URL-osoitteiden sallittujen luettelo, joka sallii yhteydet vain luotettuihin kohteisiin.
  • Välttäkää estolistoja, sillä ne voidaan helposti ohittaa.
  • Täydentäkää sovellustason suojauksia verkkopalomuureilla ja segmentoinnilla.
  • Suhtautukaa URL-osoitteiden jäsentämisen epäyhtenäisyyksiin varovasti ja tarkistakaa URL-osoitteet aina uudelleen uudelleenohjausten jälkeen.

Pidä backend suojattuna hallitsemalla lähteviä yhteyksiä tiukasti!

Aloita maksutta

Opi Turvallinen koodaus ja backendin OWASP Top 10 tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
12
Oppitunnit
48

Usein kysytyt kysymykset

Onko oppitunti ”SSRF-hyökkäysten estäminen” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Turvallinen koodaus ja backendin OWASP Top 10-oppimispolun 3 oppituntia, myös oppitunnin “SSRF-hyökkäysten estäminen”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Turvallinen koodaus ja backendin OWASP Top 10-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”SSRF-hyökkäysten estäminen”?

Oppikaa tunnistamaan ja lieventämään Server-Side Request Forgery (SSRF) -haavoittuvuuksia validoimalla URL-osoitteet ja rajoittamalla lähteviä verkkopyyntöjä. Harjoittelet Turvallinen koodaus ja backendin OWASP Top 10-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Turvallinen koodaus ja backendin OWASP Top 10-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Turvallinen koodaus ja backendin OWASP Top 10-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”SSRF-hyökkäysten estäminen”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Turvallinen koodaus ja backendin OWASP Top 10-oppitunnilla?

Kyllä. Jokainen Turvallinen koodaus ja backendin OWASP Top 10-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Turvallisten RESTful-rajapintojen suunnittelu
  2. GraphQL-rajapintojen tietoturva
  3. SSRF-hyökkäysten estäminen
  4. APIn rate limiting ja throttling
← Takaisin: Turvallinen koodaus ja backendin OWASP Top 10