Tutorials

beveiliging | xss, versie 2

Weer een tut over xss, maar nu met wat meer concrete vorbeelden, over het uitvoeren van een xss hack, en goede en foute filters.

Pagina 1

Inleiding

Op mijn vorige tutorial heb ik redelijk wat commentaar gehad, vooral omdat ik volgens sommigen niet diep genoeg in ben gegaan op de code zelf.
In deze tutorial ga ik proberen om met wat meer praktijvoorbeelden de beveiliging tegen xss hacks uit te leggen.

in de rest van deze tutorial ga ik ervan uit dat je internet exporer gebruikt als browser, omdat hiermee de meeste hacks werken.
Firefox heeft namelijk de javascript: methode van javascript uitvoeren uitgeschakeld, en er is geen manier om hier omheen te komen.
voorbeeld:
<img src="javascript:alert('XSS');"></img>

zal wel in internet explorer werken, maar in firefox krijg je een not permitted error.
Pagina 2

Waarom is xss zo schadelijk?

Nog één redelijk abstracte pagina, om zometeen meteen met codevoorbeelden te beginnen.


XSS is eigenlijk een verzamelnaam voor allerlei verschillende hacks, zoals cookie stealing, embedded commands, redirecting en script injection.

Cookie stealing is schadelijk, omdat de meeste php login systemen werken met behulp van sessies, en die sessies vaak niet ip gebonden zijn. Als een gebruiker dus jou sessie id weet, kan hij op jouw account!
Ook worden vaak (al dan niet geencrypte) gebruikersnamen en wachtwoorden in sessies opgeslagen, als je op de site zo'n leuk "onthoud mij" vinkje kan zetten.
Ook hier geld, als een hacker die sessie gegevens weet, kan hij gewoon inloggen op jouw account..


Embedded commands, hiervan zijn er op iedere website wel 1 of meer te vinden, ik heb er gister op phphulp ook meerdere gevonden.
Maar wat is het? Als je bij php een GET request maakt, roep je in feite alleen een url aan, in die url zijn de namen van velden en hun waardes gezet.
Stel je nou voor, dat je een plaatje op je website zet, en dat plaatje heeft als url een php script, met daarin een get variabele, en een waarde.
Iedere gebruiker die dat plaatje ziet, roept die php pagina aan, met die waarde als GET.
voorbeeld:
<img src="http://www.site.com/target.php?ban=huib"></img>

Als nu een moderator, of iemand die bevoegd is tot bannen, dat plaatje ziet, word ik gebanned! Dit is maar op een manier op te lossen, voor belangrijke dingen alleen POST gebruiken.


Url redirection word vaak gebruikt bij phishing mails, mailtjes waar mensen data uit jou proberen te krijgen, zoals wachtwoorden bij je bank en dergelijke.
Voor url redirection maakt de hacker gebruik van een fout in jou code, en hij leid mensen vanaf jouw site om naar de site van de hacker.
Mensen die een mailtje krijgen van "jouw" webserver, met daarin de vraag of ze even hun wachtwoord in willen vullen op "jouw" site, omdat er een storing is, of iets dergelijks, zullen daar sneller intrappen als die link ook daadwerkelijk begint met http://jouwserver/.

Script injection is niet echt een vorm van xss, maar het word toch vaak in een adem genoemt. Script injection is een van de ergste bugs die een website kan hebben, omdat alle gegevens die op de server staan naar buiten kunnen komen.
Wanneer is een script vatbaar voor script injection? Nou bijvoorbeeld, als je gebruikers bestanden laat includen, en deze vatevoren niet checkt, of als je perongeluk de verkeerde quotes gebruikt.. `` ipv '' is dodelijk!
<?php echo `cmd.exe`;?>

de backtick operator (`) doet in feite hetzelfde als system(), hij voert de meegegeven waarde uit, alsof het een programma is!
(dit klinkt misschien heel dom, maar er zijn genoeg mensen die het niet weten, en die zonder zich bewust te zijn van de risicos `` gebruiken!
Pagina 3

Voorbeelden van foute filters

Op deze pagina ga ik een paar filters laten zien, en uitleggen waarom je deze niet moet gebruiken, of in ieder geval wat moet aanpassen, voor dat je ze gebruikt.


filter 1)
filtert alle instanties van <script>.

<?php
function filter1($p_sString){
	$return = $p_sString;
	$return = nl2br($return);
	$return = preg_replace('(<script>)isU', '', $return);
	return $return;
}
?>

ookal lijkt het alsof het nu onmogelijk is om een <script> tag te vormen, dit kan nog steeds!

<?php echo filter1('<scr<script>ipt>'); ?>



filter 2)
gebruikt htmlspecialchar, striptags, maar een gebrekkige bb implementatie.


<?php
function filter2($text){
	$text = stripslashes($text);
	$text = htmlentities($text, ENT_QUOTES);
	$text = strip_tags($text);
	$text = nl2br($text);
	$text = preg_replace('(\[img\](.+?)\[/img\])', '<img src="$1">', $text);
	return $text;
}
?>

deze functie ziet er misschien op het eerste gezicht netjes uit, want alle illegale tekens worden geëntitied, en als er toch nog een <> doorslipt word ie verwijdert..

maar, zoals met ieder filter, de zwakste schakel bepaalt hoe sterk het filter is..
de image tag is ZEKER exploitbaar, want alle tekens zijn daar toegestaan!
[img]javascript:alert('XSS');[/img]



filter 3)
Een veelgemaakte fout, ik strip alle html, ik zorg ervoor dat er geen illegale tekens (zoals (, ), ', ", {, }) in de img tag mogen staan, maar ik vergeet 1 hele belangrijke! (#);

<?php
function filter3($text){
	$text = stripslashes($text);
	$text = strip_tags($text);
	$text = nl2br($text);
	$text = preg_replace('(\[img\]([^\;\`\(\)\"\'\{\}]+?)\[/(?:img)?\])', '<img src="$1">', $text);
	return $text;
}
?>


Zoals je in mijn vorige tutorial al hebt kunnen lezen, is het heel goed mogelijk met alleen & en # en een nummer een image tag te voorzien van javascript.


[img]&#106&#97&#118&#97&#115&#99&#114&#105&#112&#116&#58&#97&#108&#101&#114&#116&#40&#39&#88&#83&#83&#39&#41&#59[/img]

Pagina 4

hoe moet het wel?

Hier 2 voorbeelden van GOEDE filters, de eerste is een filter waarbij de gebruiker html in mag voeren, maar.. alleen DIE html, die ik goedkeur..
en, misschien nog wel belangrijker, als ik iets filter (weghaal), zorg er dan altijd voor dat je er een lusje omheen zet, om te kijken of er niet, zoals in voorbeeld 1, na het filteren een goede tag is ontstaan.
Ook filteren deze scripts op een relatief nieuwe hack, waar Rsnake mij attent op heeft gemaakt, namelijk het gebruik van variable width characters.

http://applesoup.googlepages.com/bypass_filter.txt

hier staat hoe het precies werkt, voor mensen die geinteresseerd zijn, en nogal wat technische kennis hebben;)
het enige wat je hoeft te doen om je hiertegen te beschermen, is ervoor zorgen dat mensen geen ' of " rechtstreeks op een pagina kunnen plaatsen..

filter 1)
laat bepaalde html tags toe, en filtert de rest.


<?php
function goedfilter1($text){
	$text = stripslashes($text);
	
	//transformeert eerst de "goede" tags naar hun bb versie, zodat ze door het strip_tags filter niet aangetast worden.
	$text = preg_replace("(<img src=\"([a-z0-9_\-\.\/:]+?)\"></img>)", "[img]$1[/img]", $text);
	$text = preg_replace("(<b>(.+?)</b>)", "[b]$1[/b]", $text);
	
	$text = strip_tags($text);
	$text = htmlentities($text, ENT_QUOTES);
	$text = preg_replace('(\[img\]http://([a-z0-9_\-\.\/:]+?)\[/(?:img)?\])', '<img src="http://$1">', $text);
	$text = preg_replace('(\[img\]([a-z0-9_\-\.\/:]+?)\[/(?:img)?\])', '<img src="http://$1">', $text);
	$text = preg_replace('(\[b\](.+?)\[/b\])', '<b>$1</b>', $text);
	return $text;
}
?>

Ik ben het met je eens als je zegt dat dit een omslachtige manier is, maar, hij filtert wel ALLES, er is geen enkele manier om hier omheen te komen.. als je je character encoding niet op us-ascii zet..;)

filter 2)
UBB filter, wat (voor zover ik weet), alle xss filterd.

<?php
function bb($text, $img = "true"){
$text = stripslashes($text);
$text = strip_tags($text);
$text = htmlentities($text, ENT_QUOTES);
$text = nl2br($text);
$text = preg_replace('(\[b\](.+?)\[/b\])', '<strong>$1</strong>', $text);
$text = preg_replace('(\[img\]http://([a-z0-9_\-\.\/:]+?)\[/(?:img)?\])', '<img src="http://$1">', $text);
$text = preg_replace('(\[img\]([a-z0-9_\-\.\/:]+?)\[/(?:img)?\])', '<img src="http://$1">', $text);
}
return $text;
}?>




Ik hoop dat jullie hier wat aan hebben, als je nog vragen hebt, of wil weten of jouw filter veilig is, stuur me gerust een berichtje!


~huib

Reacties

0
Nog geen reacties.