Il mio sito è stato appena colpito da un attacco SQL injection, come posso dire cosa stavano facendo?

9

Quindi una pagina sul mio sito (è una pagina PHP che mostra articoli di newsletter) era vulnerabile all'iniezione SQL e colpita. L'ho scoperto perché stava facendo abbastanza query di database per causare il carico della CPU a picco sul server di database. Ho trovato almeno alcuni degli indirizzi IP che lo stavano facendo dai miei registri di Apache e li ho bloccati nel firewall, e io almeno ho indurito la pagina. Quello che sto cercando di determinare è esattamente quali query stavano facendo, hanno oscurato / fuggito le cose abbastanza bene. Questa è la stringa di query che sto trovando nei log di Apache:

?id=742%2F--%2F%2F!30000and(select%2F--%2F1%2F--%2Ffrom(select%2F--%2Fcount()%2Cconcat((select%2F--%2F(select%2F--%2F(select%2F--%2Fconcat(0x27%2C0x7e%2Cunhex(Hex( cast(sbamail.email%2F--%2Fas%2F--%2Fchar)))%2C0x27%2C0x7e)%2F--%2Ffrom%2F--%2Femail.sbamail%2F--%2Flimit%2F--%2F284079%2C1)%2F--%2F)%2F--%2Ffrom%2F--%2Finformation_schema.tables%2F--%2Flimit%2F--%2F0%2C1)%2Cfloor(rand( 0)2))x%2F--%2Ffrom%2F--%2Finformation_schema.tables%2F--%2Fgroup%2F--%2Fby%2F--%2Fx)a)%2F--%2Fand%2F--%2F1%3D1%2F

Questo è ciò che il database mostrava per le query in esecuzione:

select title from newsletter_articles where article_id = 2010/--//!30000and(select/--/1/--/from(select/--/count(),concat((select/--/(select/--/(select/--/concat(0x27,0x7e,unhex(Hex(cast(sbamail.email/--/as/--/char))),0x27,0x7e)/--/from/--/email.sbamail/--/limit/--/119488,1)/--/)/--/from/--/information_schema.tables/--/limit/--/0,1),floor(rand(0)2))x/--/from/--/information_schema.tables/--/group/--/by/--/x)a)/--/and/--/1=1/

(entrambi quelli ripetuti Ad nauseam con modifiche minori ai parametri) Quando ho provato ad incollare quella query su MySQL, ho riscontrato un errore di sintassi.

Quando effettivamente incollo quella stringa di query sulla pagina interessata (prima che la patching), visualizza semplicemente questo:

Duplicate entry ''[email protected]'~1' for key 'group_key'

Il bit "Duplicate entry" è quello che mi preoccupa davvero. Inizialmente pensavo che fossero solo indirizzi email (non ci sono password memorizzate in questo database, per fortuna); è già successo su altre pagine e tutto quello che posso vedere sono le dichiarazioni "selezionate", ma se fossero in grado di inserire / aggiornare / cancellare è una notizia molto peggiore. Come posso decifrare / decodificare ciò che stavano facendo? Devo andare nel panico e guardare al ripristino del database dal backup?

La pagina in questione si trova su uno stack LAMP piuttosto semplice, se del tutto pertinente. Nessuna struttura o altro.

    
posta joshg 19.02.2013 - 23:45
fonte

1 risposta

6

Innanzitutto dovresti controllare se il tuo utente mysql ha il FILE privilegio. Se è così, considera il sistema completamente compromesso.

Le iniezioni che hai fornito insieme all'errore "voce duplicata" sono un chiaro esempio di iniezione SQL basata su errori .

mysql_query di PHP non supporta più di una query, quindi non è possibile inserire / aggiornare / eliminare da una query di selezione nell'applicazione. Ma se la tua applicazione ha una query di inserimento / aggiornamento / cancellazione vulnerabile a SQL injection (che è molto probabile), allora è possibile manomettere il database.

    
risposta data 20.02.2013 - 05:36
fonte

Leggi altre domande sui tag