Responsible disclosure: SQL Injection su portale sanitario

Hero image: ho trovato una sql injection in un portale sanitario

I dati sanitari delle persone dovrebbero essere tra i segreti meglio custoditi al mondo visto che la loro divulgazione senza esplicito consenso risulterebbe in una gravissima violazione della privacy dei pazienti. Non a caso ogni singolo dato sanitario ottenuto può valere fino a 250$ nel mercato nero .

Proprio per questo motivo mi aspetto che gli applicativi software che trattano questi dati siano protetti seguendo i più alti standard di sicurezza informatica esistenti.

Immaginate il mio stupore quando mi sono accorto che uno dei portali web utilizzati dai medici per il controllo dei proprio assistiti era vulnerabile a quello che OWASP mette al primo posto come fattore di rischio per le web app: la SQL Injection.

Per chi non sapesse di che cosa parlo, tramite un attacco di tipo SQL Injection un attaccante è in grado di eseguire dei comandi in linguaggio SQL con i quali può leggere, alterare ed eliminare qualsiasi dato presente all’interno di un database.

Non oso nemmeno immaginare le conseguenze disastrose che avrebbe potuto avere l’accesso e la divulgazione non consentita dei dati anagrafici e dei percorsi sanitari di migliaia e migliaia di pazienti.

Ma prima di procedere con i dettagli della SQL Injection mi presento: sono Lorenzo Millucci e sono un ingegnere del software che ama lavorare con Symfony e a cui piace condividere in questo blog le cose che impara. Iscriviti anche al mio canale Telegram in cui ogni martedì parliamo di piccole curiosità legate al mondo della tecnologia!

Cos’è una SQL Injection

Un attacco di tipo SQL Injection è un attacco che sfrutta la mancata validazione degli input digitati dall’utente per fare in modo che questi vengano interpretati come comandi per il database al fine di introdursi in un sistema informatico.

SQL infatti è un linguaggio di programmazione utilizzato per creare, modificare ed interrogare un database relazionale.

Normalmente quando un utente prova ad inserire un’istruzione SQL all’interno di un campo di input (come potrebbe esserlo il campo username di una pagina di login) il sistema si occupa di validare i dati inseriti accertandosi che non ci siano caratteri illeciti e/o facendone la traslitterazione verso una versione non dannosa (ad esempio il carattere < di solito viene convertito in &lt;).

Se questo processo di validazione dei dati immessi dall’utente non avviene potrebbe essere possibile sferrare un attacco di tra quelli appartenenti alla famiglia delle injection (a cui la SQL Injection appartiene).

Il tipico esempio di SQL Injection riportato in tutti i libri di testo è quello di una schermata di login in cui, per verificare che username e password siano corretti, viene usata la seguente query:

SELECT * FROM users WHERE username = "Foo" AND password = "bar" 

Un attaccante potrebbe aggirare questa schermata di login digitando come username Foo e come password " OR "" = ". In questo modo la query con i dati inseriti dall’utente diventerebbe:

SELECT * FROM users WHERE username = "Foo" AND password = "" OR "" = "" 

E poiché l’uguaglianza tra stringhe vuote "" = "" risulta essere sempre verificata l’attaccante si vedrebbe garantito l’accesso al sistema come un regolare utente senza che sia stato necessario conoscerne la password.

La SQL Injection sul portale

Esattamente come nell’esempio descritto poco sopra, nel portale in questione era possibile aggirare la pagina di login confezionando una stringa SQL ad-hoc e usandola come nome utente.

Per verificare l’esistenza del problema mi è bastato inserire il carattere ' nel campo username della pagina di login ottenendo come risposta la query SQL che il server ha provato ad eseguire per verificare la correttezza delle credenziali inserite.

Il messaggio d’errore restituito inserendo il carattere ‘ come username

Una volta accertata l’esistenza del problema mi sono immediatamente preoccupato di contattare chi di dovere affinché approntasse un fix per la vulnerabilità.

Timeline

20/10/2020 Mi accorgo del problema sul portale

20/10/2020 Invio email all’indirizzo di supporto generico (mai risposta)

26/10/2020 Invio email al dirigente del reparto IT che mi mette in contatto con il tecnico incaricato del portale

28/10/2020 Riporto la vulnerabilità al tecnico responsabile

11/11/2020 Mi segnalano che la vulnerabilità è stata sistemata

Conclusioni

Il problema sembra essere stato corretto e ora quando si prova ad inserire il carattere ' all’interno dei campi di login non viene più visualizzata la query SQL eseguita ma viene mostrata una semplice pagina bianca. Tutto bene quel che finisce bene.

O no?

Sinceramente ho l’impressione che il problema sia stato “risolto” semplicemente nascondendo il messaggio d’errore e lasciando la vulnerabilità esattamente dove si trova ma siccome non sono in grado di dimostrare questa mia ipotesi confido nella bontà della correzione. Avrei dormito sogni tranquilli vedendo un messaggio d’errore generico del tipo “nome utente non valido” piuttosto che una pagina bianca.

In ogni caso, vista la natura estremamente sensibile dei dati sanitari, mi auguro che le istituzioni incaricate al controllo e alla gestione di questi dati si impegnino maggiormente a garantire i più alti standard di sicurezza possibili.


Se questo post ti è stato utile puoi farmelo sapere lasciando un commento qui sotto oppure scrivendomi direttamente a t.me/lorenzomillucci.
Inoltre ti invito ad iscriverti al mio canale Telegram e a seguirmi su Twitter per non perderti nemmeno un post del mio blog. A presto!

Windows 10: come rimuovere l’icona “Riunione Immediata” dalla barra delle applicazioni

Windows 10 è un ottimo sistema operativo ma non sopporto l’idea di Microsoft di riempirlo di ogni sorta di pubblicità ai propri servizi.

“Riunione Immediata” è una funzione che sicuramente sarà molto utile a tutte quelle persone che hanno necessità di avviare una video-chiamata con pochi click ma a me disturba l’anima vedere un’icona indesiderata nella barra delle applicazioni.

Soprattutto perché non ho richiesto io di avere quell’applicazione ma me la sono trovata con gli aggiornamenti di sistema.

La mia reazione alla nuova icona

Ecco perché non appena ho visto la nuova icona nella barra ho subito cercato di capire come rimuoverla.

Ma prima di mostrarti come rimuovere dalla vista l’icona mi presento: sono Lorenzo Millucci e sono un ingegnere del software che ama lavorare con Symfony e a cui piace condividere in questo blog le cose che impara. Iscriviti anche al mio canale Telegram in cui, ogni martedì, commento una notizia curiosa legata al mondo tecnologico!

Come rimuovere l’icona “Riunione Immediata”

Fortunatamente rimuovere l’icona dalla barra delle applicazioni è semplicissimo ed esistono almeno due modi per farlo.

Un primo metodo pressoché istantaneo consiste nel fare click destro sull’icona e selezionare Nascondi dal menù.

Nascondi l’icona con un paio di click

L’altro modo è un po’ più lungo ma ugualmente efficace e prevede i seguenti passaggi:

  • Aprire il pannello con le Impostazioni
  • Selezionare la voce Personalizzazione
  • Selezionare la voce Barra delle applicazioni dal menù di sinistra
  • Selezionare la voce Seleziona le icone da visualizzare sulla barra delle applicazioni
  • Deselezionare Riunione immediata
Andare sul pannello di controllo è un po’ più lungo da fare ma ugualmente efficace

Nel caso in cui voglia riattivare l’icona nella barra delle applicazioni devi seguire la procedura appena descritta e abilitare la voce Riunione immediata.


Se questo post ti è stato utile puoi farmelo sapere lasciando un commento qui sotto oppure scrivendomi direttamente a t.me/lorenzomillucci.
Inoltre ti invito ad iscriverti al mio canale Telegram e a seguirmi su Twitter per non perderti nemmeno un post del mio blog. A presto!

Linux: trovare i file più grandi o più piccoli di una certa dimensione

Copertina: trovare i file con dimensione maggiore o minore di una dimensione specificata

Le immagini costituiscono circa il 21% del totale dei dati scaricati per visualizzare una pagina.

Nell’era in cui la velocità di caricamento di un sito è fondamentale il ruolo dell’ottimizzazione delle immagini è sempre più centrale per ottimizzare una pagina web in ottica SEO.

Proprio per questo motivo nei giorni scorsi mi sono trovato a dover cercare tutte le immagini di questo sito che avessero una dimensione eccessiva in modo da poterle comprimere accelerando il caricamento delle pagine.

Se hai mai utilizzato WordPress per creare un blog saprai già che ogni immagine caricata viene salvata all’interno di una cartella con l’anno che al suo interno ne contiene un’altra con il mese (es. /2020/11/myImage.jpg).

Fino a che il numero di immagini è basso si può anche pensare di cercare manualmente i file navigando tutte le cartelle ma dopo anni e anni di file caricati l’idea di passare tutte le cartelle una per una non mi sembrava percorribile. Per questo motivo mi sono messo a cercare se esistesse un modo più furbo di affrontare il problema. Fortunatamente Linux ci viene incontro con un comando da terminale in grado di trovare istantaneamente tutti i file con dimensione maggiore o minore di un peso dato.

Ma prima di mostrarti come fare per trovare tutti i file con una certa dimensione mi presento: sono Lorenzo Millucci e sono un ingegnere del software che ama lavorare con Symfony e a cui piace condividere in questo blog le cose che impara. Iscriviti anche al mio canale Telegram in cui, ogni martedì, commento una notizia curiosa legata al mondo tecnologico!

Trovare tutti i file con dimensione maggiore o minore di un certo valore

Per farlo ti basterà utilizzare un paio di opzioni aggiuntive del comando find.

Ad esempio per trovare tutti i file maggiori di 1Mb all’interno di una cartella (e di tutte le sue sottocartelle) basterà dare il comando:

find . -type f -size +1M

Per specificare la dimensione dei file da cercare puoi passare all’opzione -size le seguenti unità di misura:

  • c per indicare la dimensione in bytes
  • k per indicare la dimensione in Kilobytes
  • M per indicare la dimensione in Megabytes
  • G per indicare la dimensione in Gigabytes

Per esempio, eseguendo il comando sulla cartella con le immagini caricate in questo blog ottengo come risultato:

./2019/06/print_queue.gif
./2020/03/vue3_cover_lm.jpg
./2020/03/IMG_20200402_121709__01.jpg
./2020/05/webpack_performance.jpg
Tutti i file con dimensione maggiore di 1 Mb

NOTA: di default il comando cerca i file includendo anche tutte le sottocartelle. Se vuoi limitare la ricerca alla sola cartella attuale puoi aggiungere al comando l’opzione -maxdepth 1

Se invece avessi voluto trovare tutti i file con dimensione minore di 500Kb avrei dovuto modificare il comando in:

find . -type f -size -500k

Infine se avessi voluto cercare tutti i file compresi tra 500Kb e 1Mb il comando sarebbe stato:

find . -type f -size +500k -size -2M
Tutti i file con dimensione compresa tra 500Kb e 2Mb

Se questo post ti è stato utile puoi farmelo sapere lasciando un commento qui sotto oppure scrivendomi direttamente a t.me/lorenzomillucci.
Inoltre ti invito ad iscriverti al mio canale Telegram e a seguirmi su Twitter per non perderti nemmeno un post del mio blog. A presto!

GitHub: Code Review direttamente da PHPStorm

Immagine di copertina: Code review da PHPStorm

Scrivere codice di qualità dovrebbe essere l’obiettivo primario di ogni sviluppatore che si rispetti. E, come scrivevo in un articolo sull’importanza della leggibilità del codice, far controllare il codice ad uno sviluppatore esterno prima del merge tramite le cosiddette “code review” è uno dei metodi più efficaci per garantire un codice di alta qualità.

GitHub, GitLab, Bitbucket… sono alcuni dei servizi più famosi che offrono un meccanismo di controllo del codice distribuito e che integrano la possibilità di svolgere le code review direttamente dal browser.

Nel 90% dei casi l’interfaccia offerte da queste piattaforme è più che sufficiente a fare una review ma non è così raro imbattersi in grossi cambiamenti che la UI non riesce a caricare tutti in un’unica volta.

Non sarebbe bello poter fare le code review direttamente da PHPStorm sfruttando tutte le potenzialità dell’IDE e soprattutto senza dover aprire il browser?

Bé, ho scoperto che si può!

Ma prima di mostrarti come fare mi presento: sono Lorenzo Millucci e sono un ingegnere del software che ama lavorare con Symfony e a cui piace condividere in questo blog le cose che impara. Ho anche un canale Telegram in cui ogni martedì condivido una mia riflessione su una notizia legata al mondo tecnologico!

Connettere PHPStorm a GitHub

La prima cosa da fare per poter visionare le Pull Requests aperte da PHPStorm è collegare il proprio IDE a GitHub. Per farlo basta andare su:

File > Settings > Version Control > GitHub

E premere il tasto + in alto a destra.

Ci verranno chieste le credenziali dell’account (e il codice di accesso nel caso in cui sia attiva la two-factor authentication).

Collegamento dell'account GitHub con PHPStorm
Collegamento dell’account GitHub con PHPStorm

Visualizzare le pull requests

Una volta completata la connessione con l’account per visualizzare le Pull Requests del progetto ti basta andare su:

VCS > Git > View Pull Requests
Visualizzare le pull requests aperte per il progetto

A questo l’IDE mostrerà l’elenco di tutte le Pull Request aperte nel repository del progetto. Selezionandone una sarà possibile visualizzare lo storico dei commit, l’elenco di tutti i cambiamenti e aggiungere nuovi commenti.

Di seguito trovi un paio di screenshot di come si mostra l’interfaccia dell’IDE quando si prova a fare una code review. (Ho preso come esempio la pull request #37595 di Symfony)

NOTA: io in questo articolo mi sono riferito a PHPStorm perché è l’IDE che utilizzo quotidianamente. La procedura descritta dovrebbe essere replicabile al 100% su qualunque altro prodotto della JetBrains (WebStorm, IntelliJ Idea, PyCharm ecc…)

Conclusioni

L’interfaccia web dei vari servizi di versioning del codice è molto buona e per diversi anni ho utilizzato solo quella per fare le code review ma da quando ho scoperto la possibilità di farle direttamente dall’IDE ho praticamente smesso di usarla. La possibilità di poter fare control+click per vedere la definizione di un metodo o la possibilità di utilizzare il potente motore di ricerca di PHPStorm sono delle comodità troppo grosse per poterle ignorare.

Sicuramente non sarà questa funzione a cambiarti la vita ma anche solo un 1% di miglioramento in una delle azioni che si svolgono frequentemente può portare a notevoli quantità di tempo risparmiato.


Se questo post ti è stato utile puoi farmelo sapere lasciando un commento qui sotto oppure scrivendomi direttamente a t.me/lorenzomillucci.
Inoltre ti invito ad iscriverti al mio canale Telegram e a seguirmi su Twitter per non perderti nemmeno un post del mio blog. A presto!

Millewin: estrarre l’elenco degli ultimi pazienti visitati

Logo: millewin - estrarre l'elenco degli ultimi pazienti visitati

Visto il recente aumento di casi di COVID-19 può tornare utile avere un elenco di tutti i pazienti incontrati nello studio in un certo arco di tempo.

Per farlo basta eseguire una query da Millewutilità nel seguente modo:

  1. Aprire Milleutilità
  2. Aprire il menù Statistiche e selezionare Impostazione Estrazioni SQL Personali
  3. Aggiungere il codice SQL
    Premendo il pulsante Nuovo creare una nuova estrazione chiamata Ultimi contatti e incollare nel campo Comando SQL il codice riportato sotto. Una volta fatto salvare il tutto con il bottone Salva
  4. Eseguire l’estrazione
    Premere il tasto Applica per eseguire l’estrazione. Il programma chiederà su quali dati eseguire l’estrazione. In questo passo è importante selezionare l’intervallo di date di interesse su cui eseguire la query. Una volta deciso, proseguire con il comando Avanti.
    Si aprirà una nuova schermata da cui è possibile eseguire l’estrazione mediante il pulsante Esegui posto in alto a destra.
  5. Salvare i dati in formato Excel
    A seconda dell’intervallo di date selezionato e del numero di accessi allo studio medico il programma potrebbe impiegare più o meno tempo a fornire l’elenco di tutti i pazienti incontrati. Una volta che il processo di estrazione è terminato è possibile esportare i dati in formato Excel mediante il pulsante Salva in alto a sinistra.

Di seguito è riportato il codice da inserire nel campo Comando SQL descritto al punto 3:

select
	data_contatto,
	ora_contatto,
	cognome,
	nome,
	codfiscale,
	datanasc,
	tipo
from
	v_contatti
order by
	data_contatto,
	ora_contatto

BONUS: estrarre i pazienti con più contatti in un dato periodo

Facendo delle piccole modifiche alla query riportata poco sopra è possibile ripetere lo stesso procedimento per ottenere il numero di volte che un paziente di è presentato allo studio in un determinato intervallo di tempo. Per farlo la query da eseguire è la seguente:

select
	cognome,
	nome,
	codfiscale,
	tipo,
	count(*) as totale_contatti
from
	v_contatti
group by
	cognome, 
	nome,
	codfiscale,
	tipo
order by
	cognome,
	nome

Se questo post ti è stato utile puoi farmelo sapere lasciando un commento qui sotto oppure scrivendomi direttamente a t.me/lorenzomillucci.
Inoltre ti invito ad iscriverti al mio canale Telegram e a seguirmi su Twitter per non perderti nemmeno un post del mio blog. A presto!