HTTP

Messaggi HTTP

Http-msg

Simili a messaggi di posta elettronica.

  • Testata + Corpo (corpo opzionale)
  • Richieste
    • Testata ha tipo richiesta
  • Responsi
    • Testata ha codice responso

Testata ha altri campi contestuali

Richieste

Richiesta GET

Http-get

Richiesta HEAD

Http-head

Richiesta PUT

Http-put

Molti server non implementano la richiesta PUT: Problemi di Sicurezza

Server Side Includes

Considerati obsoleti.

Comandi inseriti nel testo HTML, scanditi ed eseguiti dal server prima dell’invio pagina:

  • Inclusi in commenti e preceduti da ‘#’
  • Il server deve tipicamente essere abilitato a scandire le pagine contenenti SSI
  • Suffisso .shtml

Esempi:

Http-ssi

La Specifica CGI

Common Gateway Interface

  • Il client invia dati al server
    • Dati spesso generati da un FORM
  • Il Server attiva un programma esterno
    • Il programma riceve in input i dati del client
    • Metodi GET e POST
  • Il programma esegue
    • p.es. Query di Database
  • Il programma genera in output una pagina HTML
  • La pagina viene inviata al client

Il Metodo GET

Cgi-get

Il Metodo POST

Cgi-post

Esercizio Docker con HTTP

Va bene come base l'esercizio 01net1-ccli-cssh. Posizionarsi nella ditectory e far partire il progetto:

cd ~/ex/01net1-ccli-cssh
docker compose up -d

Collegarsi al contenitore two col terminale.

Installare il software necessario:

apk add apache2
apk add apache2-utils

Per partire, apache2 ha bisogno di scrivere il suo PID in una directory che al momento non esiste. Creiamola:

mkdir -p /run/apache2

E' opportuno anche dare un ServerName al servizio, Editiamo il file di configurazione di Apache2, cerchiamo il parametro e modifichiamolo:

vi /etc/apache2/httpd.conf
ServerName 192.168.101.12

Lanciamo il server:

httpd -k start

Verifichiamo la partenza con:

ps wax

Prroviamo la connessione dalla macchina host. Apriamo un browser a 192.168.101.12. Dovrebbe funzionare.

File di configurazione principale: /etc/apache2/httpd.conf

include i files di configurazione dalla directory: /etc/apache2/conf.d/*.conf

In particolare DocumentRoot : /var/www/localhost/htdocs

Directory ad Accesso Limitato

Nella DocumentRoot creare una directory restricted e una pagina HTML di prova:

cd /var/www/localhost/htdocs
mkdir restricted
cd restricted
vi index.html
<html>
 <head>
  <title>Club Privato</title>
 </head>
 <body bgcolor="white">
  <h1>Ciao</h1>
 </body>
</html>

Autenticazione Basic

Scrivere il file di limitazione accessi nella directory riservata:

vi .htaccess
AuthType        Basic
AuthName        "Restricted Access"
AuthUserFile    /etc/apache2/users

<Limit GET>
require valid-user
</Limit>

Modificare i permessi del file di configurazione globale /etc/apache2/httpd.conf

Nella sezione di protezione della directory corrispondente al DocumentRoot, da:

AllowOverride None

a

AllowOverride AuthConfig Limit

Generare il file dei permessi:

cd /etc/apache2
htpasswd -mc users pippo
Password:pluto
Repeat password:pluto

Restartare il server:

httpd -k restart

Restricted

Analisi del Traffico

Chiudere il browser poi riaprirlo, poichè usa delle cache.

Aprire la cattura di traffico con dump ASCI con:

tcpdump -A

Aprire il browser e connettersi a http://192.168.101.12/restricted, dando l'utente pippo e la password pluto.

Controllare il traffico catturato da tcpdump. Troveremo:

GET /restricted/ HTTP/1.1
Host: 192.168.101.12
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:121.0) Gecko/20100101 Firefox/121.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
If-Modified-Since: Sat, 02 Mar 2024 20:13:15 GMT
If-None-Match: "70-612b31f6ae088"
Authorization: Basic cGlwcG86cGx1dG8=

La coppia nome:password viene inviata nella testata della richiesta http come stringa non crittografata, ma solo trasformata con l'algoritmo Base64.

Uno sniffer può intercettare la richiesta http e uno hacker la può decodificare, p.es.:

echo "cGlwcG86cGx1dG8K=" | base64 -d
pippo:pluto

Autenticazione Digest

E' un metodo challenge-response.

Non occorre inviare la password, basta dimostrare di saperla.

Chresp

Scrivere il file di limitazione accessi nella directory riservata:

cd /var/www/localhost/htdocs/restricted
vi .htaccess
AuthType                Digest
AuthName                "club"
AuthDigestDomain        /restricted/ http://182.168-101-12/restricted/

AuthDigestProvider file
AuthUserFile /etc/apache2/secure   
 
<Limit GET>
require valid-user
</Limit>

Generare il file dei permessi:

cd /etc/apache2
htdigest -c secure club tizio
Adding password for user tizio in realm club.
New password:caio
Repeat password:caio

Nel file /etc/apache2/httpd.conf:

Togliere il commento alla linea

LoadModule auth_digest_module modules/mod_auth_digest.so

Restart del server corrente:

httpd -k restart

La cattura traffico è completamente differente:

GET /restricted/ HTTP/1.1
Host: 192.168.101.12
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:121.0) Gecko/20100101 Firefox/121.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Authorization: Digest username="tizio", realm="club", nonce="FBRN4bMSBgA=d74359083de5b800e832d25773dcbc555768d016", uri="/restricted/", algorithm=MD5, response="3a4fce5ee9163dd376b803e9cb4f8bbe", qop=auth, nc=00000001, cnonce="0e32602512c548ec"

La password non compare, nemmeno trascodificata.

Se vi sono errori, verificare il file di log /var/www/logs/error.log.