Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
com
restituire falso;
Connessione con = nullo;
Tentativo
{
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); con =
DriverManager.getConnection(getConnectionInfo()); PreparedStatement st =
con.prepareStatement(
"exec pubs..sp_GetCreditCard ?");
st.setString(1, arg);
ResultSet rs = st.executeQuery(); while
(rs.next()) {
// Ottieni i dati da rs.getString(1);
}
rs.close();
st.chiudi();
}
cattura (SQLException e)
{
System.out.println("Errore SQL: " + e.toString()); restituire falso;
}
cattura (ClassNotFoundException e2) {
}
Finalmente
{
Tentativo
{
con.close();
} catch(SQLException e) {}
}
restituisce vero;
}
Peccato 1: ione SQL Inject
23
Redenzione ColdFusion
Per ColdFusion, usacfqueryparamnel <cfquery>tag per rendere la query più sicura con i
parametri, ma solo dopo aver eseguito la convalida dei dati:
<CFIF è definito("URL.IDcliente")
AND NOT IsNumeric(URL.clientID)> <!---
Errore --->
</CFIF>
<CFQUERY>
SELEZIONARE *
DA tblClient
WHERE clientid = <cfqueryparam value="#URL.clientID#"
CFSQLTYPE="CF_SQL_INTEGER">
</CFQUERY>
Redenzione SQL
Non dovresti davvero eseguire un parametro non attendibile all'interno di una stored procedure. Detto
questo, come meccanismo di difesa in profondità, potresti utilizzare alcune funzioni di controllo delle stringhe
per determinare se il parametro è formato correttamente. Il codice seguente verifica se il parametro in
entrata è composto solo da quattro cifre. Si noti che la dimensione del parametro è stata impostata su una
dimensione molto più piccola, rendendo più difficile l'aggiunta di altri input.
SELECT @query = 'seleziona ccnum da cust dove id = ''' + @id + '''' EXEC @query
FINE
RITORNO
Microsoft SQL Server 2005 aggiunge espressioni regolari conformi a POSIX, così come Oracle
10Ge più tardi. Le soluzioni per le espressioni regolari sono disponibili anche per DB2 e Microsoft
SQL Server 2000. MySQL supporta le espressioni regolari tramite la clausola REGEXP. Troverai
maggiori informazioni su tutte queste soluzioni nella prossima sezione "Altre risorse".
24 24 peccati capitali della sicurezza del software
Usa CAT.NET
Se utilizzi il set di strumenti di sviluppo Microsoft .NET, dovresti utilizzare CAT.NET per individuare le
vulnerabilità SQL injection (e specifiche per il Web) nel tuo codice. CAT.NET è un componente
aggiuntivo di Visual Studio che esegue l'analisi statica per aiutare a trovare SQL injection e vulnerabilità
specifiche del Web. Ecco un frammento di codice peccaminoso abbreviato scritto in C#; La Figura 1-1
mostra CAT.NET in azione.
sql.Open();
stringa sqlstring = "SELEZIONA informazioni" +
" FROM cliente WHERE nome=" + nome; SqlCommand cmd
= new SqlCommand(sqlstring, sql); ccnum =
(stringa)cmd.ExecuteScalar();
Lo strumento lo ha determinatotxtNome.txtnon è attendibile e viene utilizzato per creare una stringa SQL, che
viene quindi utilizzata per eseguire una query SQL. Chiaramente, questo è un vero e proprio bug di SQL injection.
Un collegamento a CAT.NET si trova nella sezione "Altre risorse".
Usa URLScan
Microsoft ha aggiornato URLScan, uno strumento che limita le richieste HTTP al server Web IIS,
nel 2008 per aiutare a difendersi da alcune classi di attacchi SQL injection da Internet.
Come nota finale, storicamente, una ben nota difesa PHP era assicurarsi di impostare
magic_quotes_gpc=1in php.ini, ma questa funzionalità è deprecata in PHP 6.0.0 e versioni successive.
ALTRE RISORSE
- CWE-89: Mancata sanificazione dei dati all'interno delle query SQL (ovvero "SQL
Injection"): http://cwe.mitre.org/data/definitions/89.html
- “Le espressioni regolari semplificano la corrispondenza dei modelli e l'estrazione dei dati"
di David Banister: http://msdn.microsoft.com/en-us/magazine/cc163473.aspx
- “DB2 porta la potenza della corrispondenza delle espressioni regolari in SQL”:
www-106.ibm.com/developerworks/db2/library/techarticle/0301stolze/
0301stolze.html
- Espressioni regolari MySQL: http://dev.mysql.com/
doc/mysql/en/Regexp.html
- “Cheat Sheet di SQL Injection”: http://ferruh.mavituna.com/
sql-injection-cheatsheet-oku/
- “Elimina gli attacchi SQL Injection in modo indolore con LINQ”:
www.devx.com/dotnet/Article/34653
Peccato 1: ione SQL Inject
27
RIEPILOGO
- Farecapire il database che usi. Supporta le stored procedure? Cos'è
l'operatore di commento? Consente all'attaccante di richiamare
funzionalità estese?
- Farecomprendere i comuni metodi di attacco SQL injection contro il database
utilizzato.
- Farecontrollare l'input per la validità e l'attendibilità.
- Fareverificare la validità dell'input sul server.
- Farenegare l'accesso agli oggetti di database sottostanti e concedere l'accesso solo alle stored
procedure e alle viste.
- Nonutilizzare la concatenazione di stringhe per creare istruzioni SQL a meno che non ci sia
assolutamente altro modo per creare un'istruzione SQL in modo sicuro.
29
30 24 peccati capitali della sicurezza del software
- Innanzitutto, c'è stata un'esplosione nella quantità di applicazioni basate sul web.
- In secondo luogo, nella folle corsa alla scrittura e distribuzione di applicazioni Web, gli sviluppatori
continuano a essere completamente all'oscuro dei problemi di sicurezza e scrivono codice non
sicuro!
- In quarto luogo, una grande quantità di ricerca all'interno della comunità della sicurezza ha
trovato nuove e interessanti varianti di bug relative a XSS che potrebbero potenzialmente rendere
inerti le difese comuni.
- In quinto luogo, i bug XSS sono abbastanza facili da individuare con poco più di un browser
web e un po' di know-how.
- Infine, poiché i grandi ISV rafforzano i loro sistemi operativi, il numero e l'impatto delle
classiche vulnerabilità di sovraccarico del buffer stanno diminuendo, quindi gli aggressori e i
ricercatori devono trovare nuovi tipi di vulnerabilità, quindi perché non scegliere qualcosa
che sia più onnipresente di Microsoft Windows? La rete!
Diamine, c'è persino un sito web, www.xssed.com/, che elenca le vulnerabilità XSS e
relative a XSS su siti web pubblici!
Tieni presente che i test per problemi XSS su un sito Web che non ti appartiene potrebbero portare
a un problema con la legge. Leggi "Segnalare le vulnerabilità è per i coraggiosi" (vedi "Altre risorse")
per alcune informazioni.
I bug XSS del server Web e relativi a XSS sono una forma di bug di sicurezza univoco per le applicazioni
basate sul Web che consentono a un utente malintenzionato di compromettere un client che si connette al
server Web vulnerabile. Esempi di compromissione includono il furto di cookie o la manipolazione della
pagina web così come viene vista dall'utente. Ora abbiamo visto una serie di worm basati sul Web che
utilizzano le vulnerabilità XSS per propagarsi.
Ora chiariamo bene una cosa prima di continuare. I bug XSS non sono un bug nel server
web stesso; piuttosto sono bug nelle pagine web rese dal server web. Quindi non incolpare
Microsoft Internet Information Services (IIS) o Apache. Certo, alcune di quelle pagine
potrebbero venire con l'installazione del server!
Peccato 2: vulnerabilità legate al server Web (XSS, XSRF e Response Spl itt ing) 31
Detto questo, per un po' c'è stato molto dito puntato. Gli sviluppatori del server Web hanno
detto: "È colpa del client, stanno rendendo spazzatura" e gli sviluppatori del client avrebbero
ribattuto "beh, ci stai servendo spazzatura".
Fondamentalmente, non c'è modo per il browser di sapere quali tag di script sono previsti dal
programmatore e quali vengono iniettati da un utente malintenzionato.
RIFERIMENTI CWE
Il progetto Common Weakness Enumeration include le seguenti voci; i primi due fanno
anche parte della CWE/SANS Top 25 Most Dangerous Programming Errors:
- CWE-79: mancato mantenimento della struttura della pagina Web (noto anche come "Cross-site scripting" [XSS])
LINGUE INTERESSATE
Qualsiasi linguaggio o tecnologia utilizzata per creare un'applicazione Web, ad esempio Ruby on
Rails, Python, PHP, C++, Active Server Pages (ASP), C#, VB.Net, ASP.NET, J2EE (JSP, Servlet), Perl e
Common Gateway Interface (CGI), può essere interessato.
IL PECCATO SPIEGATO
Tecnicamente, ci sono tre tipi di peccati XSS e due tipi di peccato correlati; sono
Poiché così tanti bug XSS basati su DOM sono attacchi locali, tratteremo questa variante del
peccato in modo molto più dettagliato nel prossimo capitolo, perché abbiamo visto questo
peccato commesso più e più volte nelle nuove tecnologie di Microsoft, Apple, Yahoo e Google
chiamate gadget o widget, che sono, a tutti gli effetti, mini-applicazioni create da raccolte di
pagine HTML, file JavaScript e file di configurazione e grafica di supporto.
Potresti aver notato che abbiamo usato le parole "la maggior parte degli attacchi XSS" perché una nuova ricerca
ha dimostrato che è possibile montare alcune forme di attacco, come il furto della cronologia del browser senza l'uso
di script! Fare riferimento all'articolo "Steal Browser History Without JavaScript" elencato nella sezione "Altre risorse"
per saperne di più.
La Figura 2-1 mostra come funziona un attacco XSS di tipo 1. Il motivo per cui questo peccato
è chiamato "XSS riflesso" è perché l'input dannoso viene ripetuto, o riflesso, immediatamente dal
server Web al client.
Poiché il codice dannoso (il codice che si trovava nella stringa di query e
successivamente echeggiato dal server nel browser della vittima) è in esecuzione nel
contesto del dominio del server Web vulnerabile (ad esempio, www.example.com), può
accedere il cookie della vittima legato al dominio del server vulnerabile. Il codice può
anche accedere al Document Object Model (DOM) del browser e modificare qualsiasi
elemento al suo interno; ad esempio, il codice di attacco potrebbe aggiornare tutti i
collegamenti in modo che puntino a siti porno o di odio. Oppure, come nel caso delle
elezioni presidenziali del 2008, il sito web della campagna di Barack Obama potrebbe
puntare al sito web della campagna di Hillary Clinton! A molti utenti (e ad alcuni
membri della stampa) sembrava che il sito web di Obama fosse stato violato, ma in
realtà non era così;
Peccato 2: vulnerabilità legate al server Web (XSS, XSRF e Response Spl itt ing) 33
Figura 2-1.Una pagina web peccaminosa soggetta a una vulnerabilità XSS di tipo 1 sotto attacco
Non è necessario che l'output sia visibile per portare a un bug XSS; qualsiasi tipo di eco sarà sufficiente. Ad
esempio, il server web potrebbe ripetere l'input come argomento in un blocco JavaScript valido nella pagina
web, o forse i dati sono il nome di un file immagine in un tag <img>.
Ricorda, un exploit XSS ha accesso in lettura e scrittura a tutte le pagine servite dal dominio che
ospita la pagina Web incriminata. Ad esempio, www.example.com/about.jsp può potenzialmente
attaccare qualsiasi contenuto proveniente da www.example.com in conformità con la politica della
stessa origine del browser web.
Puoi provare tu stesso l'attacco semplicemente scrivendo parte del codice peccaminoso mostrato più
avanti in questo capitolo, e poi usando una stringa come
<script>avviso("XSS");</script>
Si potrebbe pensare che eseguire un attacco con qualcosa di simile al codice precedente
nella querystring sia un po' troppo ovvio! Ebbene, l'aggressore può sfuggire alla sequenza in
molti modi o, meglio ancora, utilizzare un servizio come tinyurl.com o snurl.com per creare una
ricerca abbreviata. Ad esempio, l'URL
http://tinyurl.com/3asxla
mappe a
http://www.dailymail.co.uk/home/search.html?s=y&searchPhrase=">
<script>alert('xss');</script>
A un certo punto, il sito Web DailyMail nel Regno Unito ha commesso un peccato XSS, ma se
inserisci l'URL tinyurl, non vedrai il payload XSS. Scaltro!
Figura 2-2.Una pagina web peccaminosa soggetta a una vulnerabilità XSS di tipo 2 sotto attacco
Come probabilmente avrai già intuito, i peccati XSS "classici" vengono commessi utilizzando
funzionalità che scrivono l'output nel corpo HTML, come ASP.NET e JSP e l'operatore "<%=" di
Ruby on Rails. I peccati RS vengono impegnati utilizzando funzioni o metodi che scrivono nelle
intestazioni HTTP, come i metodi Response.SetHeader, Response.SetCookie o Response.Redirect
di ASP.NET, response.setHeader di JSP, response.headers di Ruby on Rails o PHP funzione
header().
Si noti che per impostazione predefinita ASP.NET è immune ai bug di divisione della risposta
Response.Redirect perché esegue automaticamente l'escape di molti caratteri non validi, incluse le
combinazioni CRLF.
È importante conoscere tutti i metodi che impostano le intestazioni nelle risposte HTTP. Pensa a
cosa fanno questi metodi; Response.Redirect, ad esempio, aggiunge un'intestazione 302 (Oggetto
spostato) alla risposta, nonché la posizione a cui reindirizzare. Si verificano problemi se l'argomento di
Response.Redirect non viene convalidato e finisce per essere inserito nell'intestazione HTTP Location:.
Posizione: test2.aspx
Contenuto-Lunghezza: 130
Aggiungi un CRLF alla fine di quell'input non attendibile e l'attaccante può iniziare a inserire le
proprie intestazioni nella risposta, o persino fabbricare nuove risposte, come questa:
È possibile avere varianti di divisione della risposta HTTP non persistenti e persistenti, ma a
differenza dei peccati XSS, oggi non sono suddivise in questo modo.
Il tipo di danno che un utente malintenzionato può causare con un attacco RS è tutto ciò che può fare con un
attacco XSS e altro ancora, incluso l'avvelenamento della cache Web e proxy, il che significa manipolare le pagine
memorizzate nella cache in modo che altri utenti recuperino pagine contaminate.
Peccato 2: vulnerabilità legate al server Web (XSS, XSRF e Response Spl itt ing) 37
http://www.example.com/request.php?create-new http://www.example.com/
request.php?read-NNNN http://www.example.com/request.php?delete- NNNN
http://www.example.com/request.php?junk-NNNN http://www.example.com/
request.php?move-NNNN-ToFolder-YYYY http://www.example.com/
request .php?delete-all
In questi esempi, NNNN è un valore univoco (probabilmente un GUID) che identifica l'elemento di posta
elettronica e YYYY è una cartella di destinazione.
Se l'utente si è già autenticato con il sistema di posta elettronica di back-end e l'aggressore può indurre
l'utente ad aprire una pagina Web che include un collegamento al sistema di posta elettronica dell'utente, il
browser effettuerà la richiesta come se l'utente aveva avviato lei stessa la richiesta.
Ad esempio, se la pagina Web dell'attaccante ha un collegamento come questo:
<IMG SRC=http://www.example.com/request.php?delete-98765-124871>
E Mary apre la pagina web dell'aggressore, il numero di posta elettronica 98765-124871 verrà rimosso
dalla posta in arrivo di Mary.
In breve, XSRF è quando il server non è in grado di dire se l'utente ha avviato fisicamente un'operazione o se un
utente malintenzionato ha causato l'avvio dell'operazione da parte del browser dell'utente.
Diamo un'occhiata ad alcuni esempi di codice peccaminoso.
redirect_to(url)
importa cgi
modulo = cgi.FieldStorage()
email = form.getvalue("EmailAddress") print
"Content-Type: text/html" print
importa cgi
importare Cookie
c = Cookie.SimpleCookie() form =
cgi.FieldStorage()
email = form.getvalue("EmailAddress") c['addr'] =
email
Peccato 2: vulnerabilità legate al server Web (XSS, XSRF e Response Spl itt ing) 39
<cfoutput>
ID oggetto: #Form.itemID#
</cfoutput>
pFC->AddHeader(pFC,"X-SomeHeader:", lpEcb->lpszQueryString);
40 24 peccati capitali della sicurezza del software
L'esempio seguente imposta un cookie basato su dati non attendibili. Chiaramente peccaminoso.
O
<img src='<%= Request.Querystring("Nome") %>'>
<%
response.sendRedirect("/language.jsp?lcid="+
request.getParameter("lcid"));
%>
<?php
$nome=$_GET['nome'];
if (asset($nome)) {
echo "Ciao $nome";
}
?>
<?php
$lcid = $_GET['lcid'];
...
header("locale: $lcid");
?>
42 24 peccati capitali della sicurezza del software
# !/usr/bin/perl
usa CGI;
usare rigoroso;
my $cgi = nuovo CGI; print
CGI::header();
my $nome = $cgi->param('nome'); print
"Ciao, $nome";
# !/usr/bin/perl
usa Apache::Util;
usa Apache::Request;
usare rigoroso;
my $apr = Apache::Request->new(Apache->request); mio $nome
= $apr->param('nome');
$apr->content_type('text/html'); $apr-
>send_http_header;
$apr->print("Ciao");
$apr->stampa($nome);
http[s]://example.com?qualcheverbo
Peccato 2: vulnerabilità legate al server Web (XSS, XSRF e Response Spl itt ing) 43
- L'applicazione Web accetta l'input da un'entità HTTP come una stringa di query, un'intestazione
o un modulo.
Una volta che ti rendi conto che il codice sta eseguendo input e output, devi ricontrollare se i dati
sono disinfettati e ben formati o meno. In caso contrario, probabilmente hai un bug di sicurezza XSS.
I dati potrebbero non passare direttamente da un oggetto richiesta a un oggetto risposta; potrebbe esserci qualche
http[s]://example.com?qualcheverbo
Pensa a come un utente malintenzionato può trarre vantaggio da quel tipo di URL.
# !/usr/bin/perl
usa HTTP::Request::Common qw(POST GET); usa
LWP::UserAgent;
# Stringhe di iniezione
my @xss = ('><script>alert(window.location);</script>',
'\"; avviso(1);',
'\' onmouseover=\'alert(1);\' \'',
'\"><script>alert(1);</script>',
'\"<<script>alert(1);</ script>', '\"></
a><script>alert(1);</script>', '{[alert(1)]};',
'\xC0\xBCscript>[foo]\xC0\xBC/script>', '</XSS/*-*/STYLE=xss:e/**/
xpression(alert(\'XSS\'))>', '<a href=\”javascript#foo\”>',
'xyzzy');
# Costruisci la richiesta.
mio $url = "http://127.0.0.1/form.asp"; my
$inject;
foreach $inject (@xss) {
my $req = POST $url, [Nome => $inject,
Indirizzo => $iniettare,
Zip => $iniettare];
my $res = $ua->request($req);
# Ottieni la risposta.
# Se vediamo lo script iniettato, potremmo avere un problema. $_ =
$res->come_stringa;
print "Potenziale problema XSS [$url]\n" if (index(lc $_, lc $inject)!=-1);
}
Il sito http://ha.ckers.org mantiene un cheat sheet XSS che include stringhe per aiutare a
bypassare i controlli XSS. Vedere la sezione "Altre risorse" per tutti i dettagli.
Sono disponibili numerosi strumenti per testare i bug XSS e XSRF, inclusi, ma non
limitati a, i seguenti:
ESEMPIO PECCATI
Le seguenti voci sul sito Web Common Vulnerabilities and Exposures (CVE) (http://
cve.mitre.org/) sono esempi di XSS e delle relative vulnerabilità.
<%
in caso di errore riprendere
successivo . . .
urlView = Request.QueryString("visualizza")
%>
<HTML>
<TITLE>Microsoft Outlook Web Access</TITLE> <script
language='javascript'>
...
var iCurView = <%=urlView%>;
<%
In caso di errore Riprendi Avanti
Peccato 2: vulnerabilità legate al server Web (XSS, XSRF e Response Spl itt ing) 47
Probabilmente hai appena notato che abbiamo elencato due vulnerabilità nello stesso componente che
sono state risolte da due aggiornamenti rilasciati a quasi un anno di distanza! Quello che è successo? È
interessante notare che le correzioni del codice erano relativamente vicine l'una all'altra. Al momento in cui
Microsoft ha rilasciato MS03-047, il mondo non aveva sentito parlare delle vulnerabilità di HTTP Response
Splitting. Quindi, il 4 marzo 2004, Sanctum (acquistato da Watchfire, che da allora è stato acquistato da IBM)
ha pubblicato un documento intitolato "Divide and Conquer" che descrive la variazione XSS. Quando gli
ingegneri Microsoft hanno risolto il primo bug, la seconda classe di bug era sconosciuta.
Questo è un meraviglioso esempio della massima "Gli attacchi migliorano solo".
http://www.example.com/support/cp/tt/view.php?tid=2&delete=1
Dovresti davvero eseguire tutte le serie di passaggi di riscatto nel tuo codice; i seguenti esempi di codice
illustrano come eseguire uno o entrambi i passaggi.
// Converte un flusso HTML non elaborato in una versione con codifica HTML //
Args
// strRaw: puntatore ai dati HTML
// risultato: un riferimento al risultato, contenuto in std::string
// Ritorna
// false: impossibile codificare tutti i dati HTML true:
// codificati tutti i dati HTML
bool HtmlEncode(const char *strRaw, std::string &risultato) {
size_t iLen = 0;
dimensione_t i = 0;
if (strRaw && (iLen=strlen(strRaw))) {
per (i=0; i < iLen; i++)
switch(strRaw[i]) {
case '\0' : break; caso '<'
: risultato.append("<"); rottura; :
caso '>' risultato.append(">"); rottura; :
caso '(' risultato.append("("); rottura; :
caso ')' risultato.append(")"); rottura; :
caso '#' risultato.append("#"); rottura; :
caso '&' risultato.append("&"); rottura; :
caso '"' risultato.append("""); rottura;
case '\'' : result.append("'"); rottura; caso '%'
: risultato.append("%"); rottura; :
caso '+' risultato.append("+"); rottura; :
caso '-' risultato.append("-"); rottura; :
predefinito risultato.append(1,strRaw[i]); rottura;
}
}
return i == iLen ? vero falso;
}
# include <regex>
...
Peccato 2: vulnerabilità legate al server Web (XSS, XSRF e Response Spl itt ing) 49
if (regex_match(strIP,rx)) {
// valido
} altro {
// Non valido
}
Questa libreria è disponibile in Visual C++ 2008 SP1 e versioni successive e gcc 4.3 e versioni successive.
importa cgi
modulo = cgi.FieldStorage()
email = form.getvalue("EmailAddress") print
"Content-Type: text/html" print
<%
nome = Richiesta.Querystring("Nome")
Imposta r = new RegExp
r.Pattern = "^\w{5,25}$"
r.IgnoreCase = Vero
Impostare m = r.Execute(name)
If (len(m(0)) > 0) Then
Response.Write(Server.HTMLEncode(nome)) End If
%>
50 24 peccati capitali della sicurezza del software
Una soluzione più robusta consiste nell'utilizzare la libreria Microsoft AntiXss per ripulire l'output come
mostrato nel seguente frammento di codice ASP.NET:
utilizzando Microsoft.Security.Application; . . .
- Fa più della semplice codifica HTML; ad esempio, può codificare XML, script
e URL.
- Funziona in modo più sicuro non codificando ciò che è noto per essere sicuro, ma
codificando tutto il resto. La codifica HTML codifica ciò che sa essere potenzialmente
pericoloso e che non può mai essere totalmente sicuro a lungo termine.
utilizzando Microsoft.Security.Application; . . .
if(corpoContenuto != null) {
System.out.println(bodyContent.getString()); Contenuto
della stringa = bodyContent.getString(); String regExp =
new String("^\\w{5,25}$");
bodyContent.getEnclosingWriter().
scrivere(contenuto);
} cattura (IOException e) {
System.out.println("Eccezione" + e.getMessage());
}
restituisce EVAL_BODY_INCLUDE;
} altro {
Tentativo {
bodyContent.getEnclosingWriter().
write(codifica(contenuto)); }
cattura (IOException e) {
System.out.println("Eccezione" + e.getMessage());
}