Hey one2xs,
Ik zie weer steeds vaker mensen die hun sites niet geod beveiligen, en daardoor onnodig in de problemen komen bij een verkoop. Ik wil jullie hierbij een beetje verder helpen, en zal de meest voorkomende problemen uitleggen, en er een oplossing voor geven.
Plaintext, Noscript, Redirects en andere html-troep
Doordat je een gebruiker bij 9/10 sites iets wilt kunnen laten invoeren (gebruikersnaam, reacties enzovoorts), en niet elke gebruiker het beste met je site voor heeft krijg je problemen dat je site door een beveiligingslek wordt ge-noscript, of mensen plaatsen een redirect op je pagina. Dit is natuurlijk niet de bedoeling, en daarvoor is eigenlijk een simpele oplossing, htmlentities.
Htmlentities zet de string om in html entities. Zo zet hij bijvoorbeeld © om in ©. Zo wordt alles wat is ingevoerd letterlijk weergegeven, maar niet uitgevoerd. Je krijgt dus nu te zien, in plaats van dat het uitgevoerd word.
SLECHT:
GOED:
ENT_QUOTES staat trouwens voor het feit dat en " ook worden omgezet, wat eigenlijk wel het beste is.
Mysql-exploits
veel sites zijn ook gevoelig voor mysql exploits. Zo zijn deze bijvoorbeeld niet beveiligd tegen namen zoals bijvoorbeeld "x; DROP TABLE users;". Waardoor, zoals je waarschijnlijk als wel snapt, de hele users tabel weg wordt gegooid. Hiervoor gebruik je het beste mysql_real_escape_string. Ik heb zelf geen ervaring met het exploiten van mysql, dus het voorbeeld kan niet helemaal kloppen, maar het geeft je een goede indruk wat er kan gebeuren.
SLECHT:
GOED:
Input checken
Voordat je iets in de database zet moet je altijd je input checken. Ik haal even een voorbeeld van een ander forum, aangezien dat een goede uitleg is, en ik eigenlijk niet beter dan dat uit kan leggen. Dus met dank aan Daniel (Smashdown):
Quote:
Ik zal in deze tutorial gaan een beetje uitleggen hoe je clientside (dit betekend dus dat jij het alleen ziet) een exploit kan maken en zo deze serverside (zodat iedereen het dus ziet) maken. We beginnen met een formpje met een SELECT dingetje erin. Deze code ziet er als volgt uit.
Nu krijgen wij dus een lijstje waar wij kunnen klikken of wij een meisje of een jongen zijn. Wanneer wij meisje aanklikken zullen wij in de database komen te staan onder geslacht als meisje. Wanneer wij jongen aanklikken zullen wij in de database komen te staan onder geslacht als jongen. Nu gaan wij met Firebug deze code clientside aanpassen als volgt.
Als hierop niet beveiligt is zullen wij in de database komen te staan als Exploit zoeker et voila, we hebben onze eerste exploit te pakken.
Je moet dus altijd checken of hetegene dat verzonden word, ook daadwerkelijk mag
Het slechte voorbeeld hoef ik niet te laten zien, dat is gewoon zonder checks, dus hierbij alleen het goede voorbeeld:
Wachtwoorden
Wachtwoorden worden op bijna elke site wel gebruikt. Maar wat nou als onze database met wachtwoorden word gestolen? Dan zijn al onze gebruikers de sjaak. Daarvoor hebben beveiligingsspecialisten de hashalgoritme uitgevonden. Een hashalgoritme is een functie die een wachtwoord omzet in een "onleesbare" code. Er zijn in de loop van de tijd heel wat hashes gemaakt. Maar de meest gebruikte zijn "md5" en "sha".
Aangezien md5 steeds vaker word gezien als onveilig, raad ik je ook af om md5 als hashmethode te gebruiken. Daarom ga ik ook alleen in op de sha methode.
Ten eerste moet je kijken welke hashing methodes jou host ondersteund. Dit kan je doen door phpinfo te gebruiken. Zoek hierbij naar "Hashing Engines" of gewoon "Hash". Je krijgt dan een lijst met hashing methodes die worden ondersteund. In mijn geval:
Quote:
md2 md4 md5 sha1 sha224 sha256 sha384 sha512 ripemd128 ripemd160 ripemd256 ripemd320 whirlpool tiger128,3 tiger160,3 tiger192,3 tiger128,4 tiger160,4 tiger192,4 snefru snefru256 gost adler32 crc32 crc32b salsa10 salsa20 haval128,3 haval160,3 haval192,3 haval224,3 haval256,3 haval128,4 haval160,4 haval192,4 haval224,4 haval256,4 haval128,5 haval160,5 haval192,5 haval224,5 haval256,5
Wij gaan gebruik maken van een van de dikgedrukte methodes, indien aanwezig.
Voor sha1 gebruik je de functie sha1 voor de rest gebruiken we hash.
Indien geen van deze hashing methodes worden ondersteund op jouw host zou ik toch naar een andere host gaan zoeken.
Het toepassen van een hash is vrij simpel:
Om het nog veiliger te maken, kun je ook gebruik maken van een salt. Een salt is een code die bij jou wachtwoord word gevoegd. Zo zijn zelfs wachtwoorden als "lol1" niet meer te kraken:
Zorg wel dat je bij zowel het ophalen va wachtwoorden, als het invoegen van wachtwoorden dezelfde hashing methode en eventuele salt gebruikt, anders zal je nooit het goede wachtwoord meer terugvinden.
Eindwoord
Dit zijn de meest voorkomende lekken die voorkomen bij sites, en hoe je ze kan oplossen. Indien men tegen andere problemen aan loopt kan je die hier altijd neerzetten, zodat ik er eventueel een oplossing voor het hele forum bij kan zetten.
Eventuele typ / script fouten voorbehouden. Deze tutorial mag niet op andere sites geplaats worden zonder toestemming.
Ik zie weer steeds vaker mensen die hun sites niet geod beveiligen, en daardoor onnodig in de problemen komen bij een verkoop. Ik wil jullie hierbij een beetje verder helpen, en zal de meest voorkomende problemen uitleggen, en er een oplossing voor geven.
Plaintext, Noscript, Redirects en andere html-troep
Doordat je een gebruiker bij 9/10 sites iets wilt kunnen laten invoeren (gebruikersnaam, reacties enzovoorts), en niet elke gebruiker het beste met je site voor heeft krijg je problemen dat je site door een beveiligingslek wordt ge-noscript, of mensen plaatsen een redirect op je pagina. Dit is natuurlijk niet de bedoeling, en daarvoor is eigenlijk een simpele oplossing, htmlentities.
Htmlentities zet de string om in html entities. Zo zet hij bijvoorbeeld © om in ©. Zo wordt alles wat is ingevoerd letterlijk weergegeven, maar niet uitgevoerd. Je krijgt dus nu te zien, in plaats van dat het uitgevoerd word.
SLECHT:
[COLOR= #0000BB]<?php
$string[/COLOR] [COLOR= #007700]=[/COLOR] [COLOR= #DD0000]"Mijn site is <noscript> gevoelig"[/COLOR][COLOR= #007700];[/COLOR]
[URL="http://www.php.net/echo"]echo[/URL] [COLOR= #0000BB]$string[/COLOR][COLOR= #007700];[/COLOR] [COLOR= #FF8000]// Dit zal enkel "mijn site is" laten zien, de rest word door noscript niet meer uitgevoerd[/COLOR]
?> GOED:
[COLOR= #0000BB]<?php
$string[/COLOR] [COLOR= #007700]=[/COLOR] [COLOR= #DD0000]"Mijn site is <noscript> gevoelig"[/COLOR][COLOR= #007700];[/COLOR]
[URL="http://www.php.net/echo"]echo[/URL] htmlentities[COLOR= #007700]([/COLOR][COLOR= #0000BB]$string[/COLOR][COLOR= #007700],[/COLOR] ENT_QUOTES[COLOR= #007700]);[/COLOR] [COLOR= #FF8000]// Dit zal enkel "mijn site is <noscript> gevoelig" laten zien, precies wat we willen![/COLOR]
?> ENT_QUOTES staat trouwens voor het feit dat en " ook worden omgezet, wat eigenlijk wel het beste is.
Mysql-exploits
veel sites zijn ook gevoelig voor mysql exploits. Zo zijn deze bijvoorbeeld niet beveiligd tegen namen zoals bijvoorbeeld "x; DROP TABLE users;". Waardoor, zoals je waarschijnlijk als wel snapt, de hele users tabel weg wordt gegooid. Hiervoor gebruik je het beste mysql_real_escape_string. Ik heb zelf geen ervaring met het exploiten van mysql, dus het voorbeeld kan niet helemaal kloppen, maar het geeft je een goede indruk wat er kan gebeuren.
SLECHT:
[COLOR= #0000BB]<?php
$user[/COLOR] [COLOR= #007700]=[/COLOR] [COLOR= #DD0000]"x; DROP TABLE users; SELECT 1 from 1 where 1 = 1"[/COLOR][COLOR= #007700];[/COLOR]
[URL="http://www.php.net/mysql_query"]mysql_query[/URL][COLOR= #007700]([/COLOR][COLOR= #DD0000]"SELECT * FROM users WHERE naam = "[/COLOR] [COLOR= #007700].[/COLOR] [COLOR= #0000BB]$naam[/COLOR] [COLOR= #007700].[/COLOR] [COLOR= #DD0000]""[/COLOR][COLOR= #007700]);[/COLOR]
[COLOR= #FF8000]/* Wanneer je dit uitvoert voer je als het ware deze qeury uit:
SELECT * FROM users WHERE naam = x; DROP TABLE users; SELECT 1 from 1 where 1 = 1
Hiermee selecteer je de naam x, drop je de tabel users, en selecteer je als het ware niets.*/[/COLOR]
?> GOED:
[COLOR= #0000BB]<?php
$user[/COLOR] [COLOR= #007700]=[/COLOR] [COLOR= #DD0000]"x; DROP TABLE users;"[/COLOR][COLOR= #007700];[/COLOR]
[URL="http://www.php.net/mysql_query"]mysql_query[/URL][COLOR= #007700]([/COLOR][COLOR= #DD0000]"SELECT * FROM users WHERE naam = "[/COLOR] [COLOR= #007700].[/COLOR] [URL="http://www.php.net/mysql_real_escape_string"]mysql_real_escape_string[/URL][COLOR= #007700]([/COLOR][COLOR= #0000BB]$naam[/COLOR][COLOR= #007700]) .[/COLOR] [COLOR= #DD0000]""[/COLOR][COLOR= #007700]);[/COLOR]
[COLOR= #FF8000]/* Wanneer je dit uitvoert voer je als het ware deze qeury uit:
SELECT * FROM users WHERE naam = x; DROP TABLE users; SELECT 1 from 1 where 1 = 1 Hiermee selecteer je de naam "x; DROP TABLE users; SELECT 1 from 1 where 1 = 1"*/[/COLOR]
?> Input checken
Voordat je iets in de database zet moet je altijd je input checken. Ik haal even een voorbeeld van een ander forum, aangezien dat een goede uitleg is, en ik eigenlijk niet beter dan dat uit kan leggen. Dus met dank aan Daniel (Smashdown):
Quote:
Ik zal in deze tutorial gaan een beetje uitleggen hoe je clientside (dit betekend dus dat jij het alleen ziet) een exploit kan maken en zo deze serverside (zodat iedereen het dus ziet) maken. We beginnen met een formpje met een SELECT dingetje erin. Deze code ziet er als volgt uit.
<strong>Ik ben een:</strong>
<select name="geslacht">
<option value="Jongen">Jongen
<option value="Meisje">Meisje
</select> Nu krijgen wij dus een lijstje waar wij kunnen klikken of wij een meisje of een jongen zijn. Wanneer wij meisje aanklikken zullen wij in de database komen te staan onder geslacht als meisje. Wanneer wij jongen aanklikken zullen wij in de database komen te staan onder geslacht als jongen. Nu gaan wij met Firebug deze code clientside aanpassen als volgt.
<strong>Ik ben een:</strong>
<select name="geslacht">
<option value="Jongen">Jongen
<option value="Meisje">Meisje
<option value="Exploit zoeker">Exploit zoeker
</select> Als hierop niet beveiligt is zullen wij in de database komen te staan als Exploit zoeker et voila, we hebben onze eerste exploit te pakken.
Je moet dus altijd checken of hetegene dat verzonden word, ook daadwerkelijk mag
Het slechte voorbeeld hoef ik niet te laten zien, dat is gewoon zonder checks, dus hierbij alleen het goede voorbeeld:
[COLOR= #0000BB]<?php[/COLOR]
[URL="http://www.php.net/if"]if[/URL][COLOR= #007700]([/COLOR][COLOR= #0000BB]$_SERVER[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]REQUEST_METHOD[/COLOR][COLOR= #007700]] ==[/COLOR] [COLOR= #DD0000]POST[/COLOR][COLOR= #007700]){[/COLOR]
[URL="http://www.php.net/if"]if[/URL][COLOR= #007700]([/COLOR][COLOR= #0000BB]$_POST[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]geslacht[/COLOR][COLOR= #007700]] !=[/COLOR] [COLOR= #DD0000]jongen[/COLOR] [COLOR= #007700]||[/COLOR] [COLOR= #DD0000]meisje[/COLOR][COLOR= #007700]){[/COLOR]
[URL="http://www.php.net/echo"]echo[/URL] [COLOR= #DD0000]Foutief geslacht[/COLOR][COLOR= #007700];
}[/COLOR] [URL="http://www.php.net/else"]else[/URL] [COLOR= #007700]{[/COLOR]
[URL="http://www.php.net/mysql_query"]mysql_query[/URL][COLOR= #007700]();[/COLOR] [COLOR= #FF8000]// Invoeren van geslacht, en hierbij ALSNOG mysql_real_escape_string gebruiken, just to be sure![/COLOR]
[COLOR= #007700]}
}[/COLOR]
?> Wachtwoorden
Wachtwoorden worden op bijna elke site wel gebruikt. Maar wat nou als onze database met wachtwoorden word gestolen? Dan zijn al onze gebruikers de sjaak. Daarvoor hebben beveiligingsspecialisten de hashalgoritme uitgevonden. Een hashalgoritme is een functie die een wachtwoord omzet in een "onleesbare" code. Er zijn in de loop van de tijd heel wat hashes gemaakt. Maar de meest gebruikte zijn "md5" en "sha".
Aangezien md5 steeds vaker word gezien als onveilig, raad ik je ook af om md5 als hashmethode te gebruiken. Daarom ga ik ook alleen in op de sha methode.
Ten eerste moet je kijken welke hashing methodes jou host ondersteund. Dit kan je doen door phpinfo te gebruiken. Zoek hierbij naar "Hashing Engines" of gewoon "Hash". Je krijgt dan een lijst met hashing methodes die worden ondersteund. In mijn geval:
Quote:
md2 md4 md5 sha1 sha224 sha256 sha384 sha512 ripemd128 ripemd160 ripemd256 ripemd320 whirlpool tiger128,3 tiger160,3 tiger192,3 tiger128,4 tiger160,4 tiger192,4 snefru snefru256 gost adler32 crc32 crc32b salsa10 salsa20 haval128,3 haval160,3 haval192,3 haval224,3 haval256,3 haval128,4 haval160,4 haval192,4 haval224,4 haval256,4 haval128,5 haval160,5 haval192,5 haval224,5 haval256,5
Wij gaan gebruik maken van een van de dikgedrukte methodes, indien aanwezig.
Voor sha1 gebruik je de functie sha1 voor de rest gebruiken we hash.
Indien geen van deze hashing methodes worden ondersteund op jouw host zou ik toch naar een andere host gaan zoeken.
Het toepassen van een hash is vrij simpel:
[COLOR= #0000BB]<?php[/COLOR]
[URL="http://www.php.net/sha1"]sha1[/URL][COLOR= #007700]([/COLOR][COLOR= #DD0000]MijnWachtwoord112[/COLOR][COLOR= #007700]);[/COLOR]
hash[COLOR= #007700]([/COLOR][COLOR= #DD0000]sha512[/COLOR][COLOR= #007700],[/COLOR] [COLOR= #DD0000]MijnWachtWoord112[/COLOR][COLOR= #007700]);[/COLOR]
hash[COLOR= #007700]([/COLOR][COLOR= #DD0000]sha256[/COLOR][COLOR= #007700],[/COLOR] [COLOR= #DD0000]MijnWachtWoord112[/COLOR][COLOR= #007700]);[/COLOR]
?> Om het nog veiliger te maken, kun je ook gebruik maken van een salt. Een salt is een code die bij jou wachtwoord word gevoegd. Zo zijn zelfs wachtwoorden als "lol1" niet meer te kraken:
[COLOR= #0000BB]<?php
$salt[/COLOR] [COLOR= #007700]=[/COLOR] [COLOR= #DD0000]"qwDdd872+0-4er0Sd5hž643«Gd24S2¤3Fy54Gs3dssÀõasd9137kmdjLldj/a"[/COLOR][COLOR= #007700];[/COLOR]
[URL="http://www.php.net/sha1"]sha1[/URL][COLOR= #007700]([/COLOR][COLOR= #DD0000]MijnWachtwoord112[/COLOR] [COLOR= #007700].[/COLOR] [COLOR= #0000BB]$salt[/COLOR][COLOR= #007700]);[/COLOR]
hash[COLOR= #007700]([/COLOR][COLOR= #DD0000]sha512[/COLOR][COLOR= #007700],[/COLOR] [COLOR= #DD0000]MijnWachtWoord112[/COLOR] [COLOR= #007700].[/COLOR] [COLOR= #0000BB]$salt[/COLOR][COLOR= #007700]);[/COLOR]
hash[COLOR= #007700]([/COLOR][COLOR= #DD0000]sha256[/COLOR][COLOR= #007700],[/COLOR] [COLOR= #DD0000]MijnWachtWoord112[/COLOR] [COLOR= #007700].[/COLOR] [COLOR= #0000BB]$salt[/COLOR][COLOR= #007700]);[/COLOR]
?> Zorg wel dat je bij zowel het ophalen va wachtwoorden, als het invoegen van wachtwoorden dezelfde hashing methode en eventuele salt gebruikt, anders zal je nooit het goede wachtwoord meer terugvinden.
Eindwoord
Dit zijn de meest voorkomende lekken die voorkomen bij sites, en hoe je ze kan oplossen. Indien men tegen andere problemen aan loopt kan je die hier altijd neerzetten, zodat ik er eventueel een oplossing voor het hele forum bij kan zetten.
Eventuele typ / script fouten voorbehouden. Deze tutorial mag niet op andere sites geplaats worden zonder toestemming.



