Anders Moen Skrevet 16. juni 2007 Del Skrevet 16. juni 2007 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
ventle Skrevet 16. juni 2007 Del Skrevet 16. juni 2007 (endret) 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 16. juni 2007 av ventle Lenke til kommentar
Anders Moen Skrevet 16. juni 2007 Forfatter Del Skrevet 16. juni 2007 (endret) 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 16. juni 2007 av Anders-Moen Lenke til kommentar
ventle Skrevet 16. juni 2007 Del Skrevet 16. juni 2007 (endret) 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 16. juni 2007 av ventle Lenke til kommentar
Anders Moen Skrevet 17. juni 2007 Forfatter Del Skrevet 17. juni 2007 (endret) Det ser ut som at den funker. Bare lekte meg litt i kommentarene, og det funka ikke med JS: http://www.andersmoen.com/p/blog/entry/23/ Edit: Nei, det funker ikke. Nå ville jo ikke denne fungere: [img*]http://www.andersmoen.com/img/logo.jpg[/img*] (uten stjerner) Endret 17. juni 2007 av Anders-Moen Lenke til kommentar
jorgis Skrevet 17. juni 2007 Del Skrevet 17. juni 2007 Å 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
Anders Moen Skrevet 17. juni 2007 Forfatter Del Skrevet 17. juni 2007 Så en av de to kodene du posta der, Jorgis, vil fungere, ikke sant? (Har ikke tid til å sjekke selv akkurat nå) Lenke til kommentar
jorgis Skrevet 17. juni 2007 Del Skrevet 17. juni 2007 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
Anders Moen Skrevet 21. juni 2007 Forfatter Del Skrevet 21. juni 2007 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? Lenke til kommentar
jorgis Skrevet 21. juni 2007 Del Skrevet 21. juni 2007 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. 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
Anders Moen Skrevet 21. juni 2007 Forfatter Del Skrevet 21. juni 2007 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? Lenke til kommentar
jorgis Skrevet 21. juni 2007 Del Skrevet 21. juni 2007 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå