Sakte Loris-angrep ved bruk av JavaScript på en PHP-server [og forebygging!]

Glem innlegget et øyeblikk, la oss begynne med hva denne tittelen handler om! Dette er en nettsikkerhetsbasert artikkel som vil komme inn i det grunnleggende om hvordan HTTP fungerer. Vi vil også se på et enkelt angrep som utnytter måten HTTP-protokollen fungerer på.

Hva er HTTP?

HTTP, HyperText Transfer Protocol, er protokollen som brukes av nettet for kommunikasjon. Enheten din bruker denne spesielle protokollen til å sende forespørsler til eksterne servere for å be om data fra dem når du bruker en nettleser.

Det er i utgangspunktet som du sa til moren din: "Hei mamma, jeg må spise varen i kjøleskapet som er tilstede på hylle 2, kan du gi den til meg?"

Og moren din sier, "Jada, her går du", og sender deg den varen. Nå er HTTP slik du klarte å kommunisere denne informasjonen til moren din, mer som språket du brukte til kommunikasjon.

Hvordan HTTP fungerer

Her er en TL; DR-video hvis du er en videoperson. Ellers fortsett med artikkelen:

HTTP (Layer 7) er bygget på toppen av TCP-protokollen (Layer 4). Vi kan bruke nc(netcat) -verktøyet til å åpne en rå TCP-stikkontakt til ethvert nettsted som kjører på HTTP (vanligvis port 80). Se følgende eksempel på hvordan vi kobler til HTTP-port 80 for google.com ved hjelp av netcat:

Se dataene vi sendte:

GET / HTTP/1.1 Host: google.com X-header-1: somemoredata X-header-2: somemoredata 

Ignorer de ekstra X-header-*overskriftene, de er bare tilfeldige overskrifter du kan sende med din forespørsel. Den viktige overskriften som skal inkluderes i HTTP / 1.1-spesifikasjonen, er Hosttoppteksten.

Og svaret vi fikk:

HTTP/1.1 301 Moved Permanently Location: //www.google.com/ Content-Type: text/html; charset=UTF-8 Date: Tue, 01 Oct 2019 23:24:13 GMT Expires: Thu, 31 Oct 2019 23:24:13 GMT Cache-Control: public, max-age=2592000 Server: gws Content-Length: 219 X-XSS-Protection: 0 X-Frame-Options: SAMEORIGIN Accept-Ranges: none Via: HTTP/1.1 forward.http.proxy:3128 Connection: keep-alive  301 Moved 

301 Moved

The document has moved here.

HTTP er således en klartekstprotokoll som består av forespørselsinformasjonen sendt av klienten og svaret som vist ovenfor.

Sakte Loris Attack

Et langsomt Loris-angrep utnytter det faktum at jeg kunne komme med en HTTP-forespørsel veldig veldig sakte. Med andre ord, jeg kan starte en HTTP-forespørsel til serveren og fortsette å sende data til serveren veldig sakte for å holde tilkoblingen i live. Og samtidig slutter det aldri denne tilkoblingen og åpner flere slike tilkoblinger for å tømme tilkoblingsbassenget til serveren.

Ansvarsfraskrivelse - Penetrasjonstesting av online / offline tjenester som ikke eies av deg uten forutgående skriftlig tillatelse er ulovlig, og jeg er ikke ansvarlig for skader forårsaket. Bruk bare dette innholdet til pedagogiske formål.

Langsom Loris-demonstrasjon:

Dette betyr at jeg kan fortsette å sende tilleggsdata til serveren i form av overskrifter. Nå skal jeg starte en enkel PHP-utviklingsserver på maskinen min:

Og jeg bruker et enkelt Node-skript for å utføre det vi diskuterte ovenfor på min lokale server:

Du finner Node-skriptet som brukes her.

Etter en stund vil du se at PHP-serveren vår faktisk krasjer!

Dette er fordi det er altfor mange åpne forbindelser, og PHP kan ikke håndtere flere åpne forbindelser (på grunn av minne- / maskinvaregrenser).

Nå fungerer dette selvfølgelig feilfritt på en lokal utviklingsserver. Men hvis du klarer å finne en server som ikke implementerer beskyttelse mot langsomme lorisangrep, er det et stort problem for dem.

Beskyttelse mot et sakte Loris-angrep

  • Bruk løsninger som Cloudflare foran serverne dine for å forhindre DoS / DDoS

    Sitat fra Cloudflares nettsted:

Cloudflare buffrer innkommende forespørsler før du begynner å sende noe til opprinnelsesserveren. Som et resultat når “lav og langsom” angrepstrafikk som Slowloris-angrep aldri det tiltenkte målet. Lær mer om hvordan Cloudflares DDoS-beskyttelse stopper slowloris-angrep.
  • Hastighetsgrense antall samtidige tilkoblinger som åpnes av en bestemt IP-adresse til et lite antall. Dette kan oppnås ved å bruke enkle frontend-omvendte proxy-servere som nginx ved hjelp av deres lekkasje-algoritmeimplementering. Hvordan det fungerer, er noe for en annen dag!
  • Øker serverkapasiteten - Nå kan dette redusere små angrep, men ærlig talt kan og kan angriper ganske enkelt skalere / forsterke det opprinnelige angrepet på grunn av mindre båndbredde som kreves for å utføre et slikt angrep.

Konklusjon

Mange servere (nginx / apache2 nye versjoner) kommer med langsom loris angrepbeskyttelse som standard. Men for mange interne tjenester kan servere være sårbare for dette enkle angrepet.

Det kan være lurt å sjekke tjenestene dine og implementere løsningene. Nettsikkerhet er et spennende område, og jeg planlegger å gjøre en webserie om den på codedamn. Du kan også få kontakt med meg på Twitter for oppdateringer. Inntil da, vær trygg!