Gå til innhold

Hjelp! bbKodene har XSS-hull


Anbefalte innlegg

Hei!

 

Bruker de bbkodene som man finner på bbcode.org som til slutter linker hit: http://duncan.xtreme.net.nz/bbCode.php.txt

 

Men nå fant jeg akkurat ut at de har XSS-hull. Åssen skal jeg validere bildene?

 

På sida mi så var det en fra nederland, som lekte seg litt med kommentarene mine for å prøve å finne XSS-hull på sida mi, og jammen var det ikke det der i bbKodene.

 

$Text = preg_replace("/\[img\](.+?)\[\/img\]/", '<img src="$1" alt="Image" class="screenshot" />', $Text);

Sånn ser bildelinja ut (lagd på class og alt på den i forhold til den som man finner på bbcode.org, men åssen skal jeg validare bildene?

 

Takk for hjelp!

Vil helst tette dem så fort som mulig :)

Lenke til kommentar
Videoannonse
Annonse

om du har installert GD, allow_url_fopen er satt til 1 og du kjører en linux-server kan du bruke preg_replace_callback() og få serveren til å faktisk hente bildet og sjekke om det er en bildefil.

 

edit: do like this:

 

PHP

<?php

while (preg_match("#(.*?)#si",$text)) {

$text preg_replace_callback("#(.*?)#si","img_callback",$text);

}

?>

 

ett annet sted i koden plasserer du dette (pass på at denne koden ikke repeteres):

PHP

<?php

function img_callback($matches) {

$return $matches[1];

$filename array_reverse(explode(".",$matches[1]));

switch ($filename[0]) {

case "jpg":

case "JPG":

case "jpeg":

case "JPEG":

if ($id = @imagecreatefromjpeg($matches[1])) {

$return '<img src="'.$matches[1].'" alt="Image" class="screenshot" />';

imagedestroy($id);

}

break 1;

 

// du skjønner sikkert hva som må inn her for å håndtere

// andre filtyper, som gif, png osv...

 

default:

break 1;

}

 

return $return;

}

?>

 

ulempen er at det ikke lar seg gjøre å validere bilder som spyttes ut av ett php-script, slik at de ikke har filnavn som ikke slutter på .jpg, .gif osv.

 

edit2: BB-kodene på diskusjon.no er fulle av bugs og har nok noen sikkerhetshull de også...

Endret av ventle
Lenke til kommentar

allow_url_fopen..jeg husker ikke, men jeg tror ikke den var på. Kan være at jeg tar feil av den og den som er ganske lik. Den der med fullurl, hvis det der ikke er den?

 

Jaså? [img*]javascript:alert('XSS')[/img*] (uten stjerner - fikk ikke posta med de)

Det var noe ala det der som ble brukt på den sida jeg driver å mekker. Kanskje jeg bare skal ta bort fra bbKodene

Endret av Anders-Moen
Lenke til kommentar

allow_url_fopen er vanligvis på, i hvertfall hvis du har betalt server (tar to sekunder å finne ut med phpinfo()).

 

Den metoden jeg bruker er ikke den beste, ettersom bilder som ikke ender på filutvidelsen sin (for eksempel bilder som er lagret på eurofoto, som får ett åttesifret nummer helt på slutten) ikke vil støttes. Dette støttes heller ikke her på diskusjon.no, så jeg har en mistanke om at de bruker en lignende metode for å kjapt sjekke om det faktisk er ett bilde du pakker inn i -taggen.

 

Det du kan gjøre, er å bare sjekke om adressen til bildet faktisk er en webadresse (veldig sjeldent at du kommer til å bruke relativ url i img-koden), med følgende kode:

 

PHP

<?php

$text preg_replace("#http://(.*?)[/img]#si","<img src='http://1' />",$text);

?>

 

evt. kan du også kjøre noen tester for å forsikre deg om at det ikke er javascript eller andre skadelige ting i img-taggene.

Endret av ventle
Lenke til kommentar

Å stresse med å kjøre det gjennom GD (som er en unødvendig dependency) er lite vits i, det du heller bør arbeide med, er å hindre at tegn som ikke er tillatt i URL-er heller ikke kommer inn i din regex. Typiske tegn som er fy-fy er hermetegnene (både " og '), så dem bør du luke ut med en gang;

 

Svartelisting av " og ';

$Text = preg_replace("/\[img\]([^\'"]+?)\[\/img\]/", '<img src="$1" alt="Image" class="screenshot" />', $Text);

 

Omvent kan du hviteliste alle tegn du vet er trygge (se på $URLSearchString i bbCode.php.txt-saken din);

$Text = preg_replace("/\[img\]([a-zA-Z0-9\-\_\:\.\&\/]+?)\[\/img\]/", '<img src="$1" alt="Image" class="screenshot" />', $Text);

Lenke til kommentar
Så en av de to kodene du posta der, Jorgis, vil fungere, ikke sant? (Har ikke tid til å sjekke selv akkurat nå)

8880561[/snapback]

 

Du bør definitivt sjekke selv, å ukritisk putte kode rett inn i applikasjonen din er ikke særlig lurt. Regelen er; ikke bruk kode du ikke forstår eller på noen måte ikke har 100% peil på nøyaktig hva den gjør.

Lenke til kommentar
Ok, jeg har en idé som kanskje vil fungere. Hvis jeg bruker str_replace og gjør sånn at "javascript" blir til "java script". Har sett andre forumer gjøre det, og det ser ut til å fungere. Da kan jeg jo åpne bilde-koden igjen. Kanskje jeg skal gjøre det?

8911949[/snapback]

 

Bortsett fra at en av utallige andre måter å sette inn XSS på ikke blir blokkert, er det en strålende løsning. :ermm:

 

Et javascript trenger ikke å ha nøkkelordet "javascript" i seg, og du trenger ikke engang å bruke javascript for å kunne kalle det XSS. Jeg vil påstå at om noen kan sette inn en <h1>-heading eller et ukjent antall bilder av valgfri størrelse kan det kalles for et hull i BBCode-parseren.

Lenke til kommentar
Nei, nei. Man kan ikke bruke HTML/XHTML osv. Stripper tags og bytter de med < og > (med htmlentities). Men da, hvis jeg gjør det med "javascript", er det mye mer man kan få gjort?

8912116[/snapback]

 

Vel, javscriptet vil kjøres, selv om "javascript" splittes med f.eks. en tab (\t) eller newline (\n). Så du må i så fall ta høyde for at det kan puttes whitespace-bits inni strengen, eller at strengen kan være i lower-/uppercase og en vilkårlig kombinasjon av disse.

 

Eksempel;

jav	ascript:alert('XSS');

 

Det går til og med an å putte inn javascript uten ordet "javascript" i kilden. NS 4.x lar deg gjøre dette;

&{alert('XSS')}

 

I IE6 kan du sette inn VBScript:

vbscript:msgbox("XSS")

 

Og du kan også putte inn JS i CSS stil-definisjoner;

<div style="width: expression(alert('XSS'));">

 

Se her for utallige eksempler for hvor vanskelig det egentlig er å blokkere for XSS-angrep. Å bare kjøre en enkel str_replace() for å gjøre "javascript" til "java script" er ingen løsning og gir deg bare falsk trygghet.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...