HTTP
Messaggi HTTP
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
Richiesta HEAD
Richiesta 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:
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
Il Metodo 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
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.
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
.