Hallo One2xs,
Ik ga een aantal veelgemaakte fouten uitleggen tijdens het beveiligen van websites.
1.) Cross site scripting.
Een voorbeeld van een stuk javascript code dat lek is is bijvoorbeeld :
Want ja zoals je waarschijnlijk al ziet is de $_GET niet beveiligd, een PHP programmeur zou nu denken BAM htmlentities maar nee dat klopt dus niet...
Hieronder een voorbeeld hoe je htmlentities omzeilt.
Als je nu naar index.php?id=1;alert(1) gaat krijg je jawel een alert met een 1!
een ander voorbeeld is bijvoorbeeld :
want htmlentities escaped alleen de double qoute, je kunt bijvoorbeeld dit doen : index.php?id=1+onclick=alert(1)
Allemaal leuk maar hoe kom je nou van die vervelende Cross site scriptings af?
hiervoor gebruik je de volgende functie
dan worden ook de quotes escaped.
2.) Mysql injections
OOk hier is een belangrijk puntje voor SQL injections die vaak over het hoofd wordt gezien.
Voorbeeld :
Dit is enorm lek, ik ga er niet verder op in hoe je deze injectie uitvoert maar het is beter om het maar te beveiligen.
dat doe je via mysqli_real_escape_string
maar ook hier worden fouten gemaakt :
Voorbeeld :
Hier word het einde niet afgesloten waardoor je nogsteeds bijvoorbeeld "OR sleep(1)" kunt invoegen en de database een "true" terug stuurd (heel handig bij inlog systemen)
een goede query ziet er dus zo uit :
lfi en rfi
Lfi staat voor Local file inclusion en RFI voor Remote File inclusion
Een voorbeeld van een LFI lek is :
Een voorbeeld om dit te misbruiken is als je mensen hun eigen avatar laat uploaden.
dan is mijn avatar inhoud bijvoorbeeld :
en ga ik naar
?p=../images/smiegles.png%00
bij RFI halen mensen de hele pagina op bijvoorbeeld :?page=http://www.nu.nl/news.php?id=1
dan krijg je de inhoud van die pagina.
de LFI kun je zo beveiligen de RFI die moet je gewoon helemaal niet gebruiken.
CSRF
doe ik later ik heb jeuk
Ik ga een aantal veelgemaakte fouten uitleggen tijdens het beveiligen van websites.
- Cross site scripting
- Mysql injections
- lfi & rfi
- CSRF
1.) Cross site scripting.
Een voorbeeld van een stuk javascript code dat lek is is bijvoorbeeld :
<script>
var Website = {
"Contact" : function()
{
this.id = [COLOR= #0000BB]<?php[/COLOR] [URL="http://www.php.net/echo"]echo[/URL] [COLOR= #0000BB]$_GET[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]id[/COLOR][COLOR= #007700]];[/COLOR] ?>;
}
}
Website.Contact();
</script> Want ja zoals je waarschijnlijk al ziet is de $_GET niet beveiligd, een PHP programmeur zou nu denken BAM htmlentities maar nee dat klopt dus niet...
Hieronder een voorbeeld hoe je htmlentities omzeilt.
<script>
var Website = {
"Contact" : function()
{
this.id = [COLOR= #0000BB]<?php[/COLOR] [URL="http://www.php.net/echo"]echo[/URL] htmlentities[COLOR= #007700]([/COLOR][COLOR= #0000BB]$_GET[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]id[/COLOR][COLOR= #007700]]);[/COLOR] ?>;
}
}
Website.Contact();
</script> Als je nu naar index.php?id=1;alert(1) gaat krijg je jawel een alert met een 1!
een ander voorbeeld is bijvoorbeeld :
<input value=[COLOR= #0000BB]<?php[/COLOR] [URL="http://www.php.net/echo"]echo[/URL] htmlentities[COLOR= #007700]([/COLOR][COLOR= #0000BB]$_GET[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]id[/COLOR][COLOR= #007700]]);[/COLOR] ?>> want htmlentities escaped alleen de double qoute, je kunt bijvoorbeeld dit doen : index.php?id=1+onclick=alert(1)
Allemaal leuk maar hoe kom je nou van die vervelende Cross site scriptings af?
hiervoor gebruik je de volgende functie
[COLOR= #0000BB]<?php[/COLOR] [URL="http://www.php.net/echo"]echo[/URL] htmlentities[COLOR= #007700]([/COLOR][COLOR= #0000BB]$_GET[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]id[/COLOR][COLOR= #007700]],[/COLOR]ENT_QUOTES[COLOR= #007700]);[/COLOR] ?> dan worden ook de quotes escaped.
2.) Mysql injections
OOk hier is een belangrijk puntje voor SQL injections die vaak over het hoofd wordt gezien.
Voorbeeld :
mysqli_query("select * from `users` where `id` = ".$_GET[id]."); Dit is enorm lek, ik ga er niet verder op in hoe je deze injectie uitvoert maar het is beter om het maar te beveiligen.
dat doe je via mysqli_real_escape_string
maar ook hier worden fouten gemaakt :
Voorbeeld :
mysqli_query("select * from `users` where `id` = ".mysqli_real_escape_string($_GET[id])); Hier word het einde niet afgesloten waardoor je nogsteeds bijvoorbeeld "OR sleep(1)" kunt invoegen en de database een "true" terug stuurd (heel handig bij inlog systemen)
een goede query ziet er dus zo uit :
mysqli_query("select * from `users` where `id` = ".mysqli_real_escape_string($_GET[id])."); lfi en rfi
Lfi staat voor Local file inclusion en RFI voor Remote File inclusion
Een voorbeeld van een LFI lek is :
[COLOR= #0000BB]<?php
$page[/COLOR] [COLOR= #007700]= ([/COLOR][URL="http://www.php.net/isset"]isset[/URL][COLOR= #007700]([/COLOR][COLOR= #0000BB]$_GET[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]p[/COLOR][COLOR= #007700]]) ?[/COLOR] [COLOR= #0000BB]$_GET[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]p[/COLOR][COLOR= #007700]] :[/COLOR] [COLOR= #DD0000]home[/COLOR][COLOR= #007700]);[/COLOR]
[URL="http://www.php.net/include"]include[/URL] [COLOR= #DD0000]pages/[/COLOR][COLOR= #007700].[/COLOR][COLOR= #0000BB]$page[/COLOR][COLOR= #007700].[/COLOR][COLOR= #DD0000].php[/COLOR][COLOR= #007700];[/COLOR]
?> Een voorbeeld om dit te misbruiken is als je mensen hun eigen avatar laat uploaden.
dan is mijn avatar inhoud bijvoorbeeld :
[COLOR= #0000BB]<?php[/COLOR] [URL="http://www.php.net/eval"]eval[/URL][COLOR= #007700]([/COLOR][COLOR= #0000BB]$_GET[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]a[/COLOR][COLOR= #007700]]);[/COLOR] ?> en ga ik naar
?p=../images/smiegles.png%00
bij RFI halen mensen de hele pagina op bijvoorbeeld :?page=http://www.nu.nl/news.php?id=1
dan krijg je de inhoud van die pagina.
de LFI kun je zo beveiligen de RFI die moet je gewoon helemaal niet gebruiken.
[COLOR= #0000BB]<?php
$files[/COLOR] [COLOR= #007700]=[/COLOR] [URL="http://www.php.net/array"]array[/URL][COLOR= #007700]();[/COLOR]
[URL="http://www.php.net/foreach"]foreach[/URL][COLOR= #007700]([/COLOR][URL="http://www.php.net/glob"]glob[/URL][COLOR= #007700]([/COLOR][COLOR= #DD0000]pages/*.*[/COLOR][COLOR= #007700]) AS[/COLOR] [COLOR= #0000BB]$file[/COLOR][COLOR= #007700]) {[/COLOR]
[COLOR= #0000BB]$files[/COLOR][COLOR= #007700][] =[/COLOR] [COLOR= #0000BB]$file[/COLOR][COLOR= #007700];
}[/COLOR]
[COLOR= #0000BB]$page[/COLOR] [COLOR= #007700]= ([/COLOR][URL="http://www.php.net/isset"]isset[/URL][COLOR= #007700]([/COLOR][COLOR= #0000BB]$_GET[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]p[/COLOR][COLOR= #007700]]) ?[/COLOR] [COLOR= #0000BB]$_GET[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]p[/COLOR][COLOR= #007700]] :[/COLOR] [COLOR= #DD0000]home[/COLOR][COLOR= #007700]);[/COLOR]
[URL="http://www.php.net/if"]if[/URL][COLOR= #007700]([/COLOR][URL="http://www.php.net/in_array"]in_array[/URL][COLOR= #007700]([/COLOR][COLOR= #0000BB]$page[/COLOR][COLOR= #007700],[/COLOR][COLOR= #0000BB]$files[/COLOR][COLOR= #007700])) {[/COLOR]
[URL="http://www.php.net/include"]include[/URL] [COLOR= #DD0000]pages/[/COLOR][COLOR= #007700].[/COLOR][COLOR= #0000BB]$page[/COLOR][COLOR= #007700].[/COLOR][COLOR= #DD0000].php[/COLOR][COLOR= #007700];
}[/COLOR] CSRF
doe ik later ik heb jeuk


