Hee tweakers,
Na toch al een paar uur verspild te hebben aan dit probleem wil ik graag jullie hulp inroepen. Ik heb het volgende PHP script:
De functie van het script lijkt me vrij duidelijk, een user gaat naar www.mijnsite.nl/getpage.php?page=about en als alles goed gaat wordt about.txt gelezen en weergegeven op de site.
Ik heb een aantal checks ingebouwd om te zorgen dat users niet ?page=../al_mijn_wachtwoorden.txt intypen om maar een voorbeeld te noemen. De checks gaan goed daarmee bedoel ik dan: htmlentities en stripslashes maar met de laatste beveiligingsmaatregel gaat was mis:
De PHP.NET manual voor strpos zegt het volgende:
Kan iemand mij op weg helpen?
Na toch al een paar uur verspild te hebben aan dit probleem wil ik graag jullie hulp inroepen. Ik heb het volgende PHP script:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| <?php /* Script to retrieve the page content from a text file.*/ $page = $_GET["page"]; function secure_string($string) { /*Function to check for possible SQL-Injection, and other vulnerabilities. */ $string = htmlentities($string, ENT_QUOTES); $string = stripslashes($string); if(strpos($string,"<") && strpos($string,";") && strpos($string,"@") && strpos($string,"!") && strpos($string,">") && strpos($string,"?") && strpos($string, ".") == false ) { return $string; } else { /*header('Location: TheDudeIsTryingToHackUs.on.nimp.org'); Send possible attackers to the hyperlink */ echo $string; return "page_not_found"; } } /*Open the file to read content */ $filename = "./content/" . secure_string($page) .".txt"; $handle = fopen($filename , "r"); $content = fread($handle, filesize($filename)); echo $content; ?> |
De functie van het script lijkt me vrij duidelijk, een user gaat naar www.mijnsite.nl/getpage.php?page=about en als alles goed gaat wordt about.txt gelezen en weergegeven op de site.
Ik heb een aantal checks ingebouwd om te zorgen dat users niet ?page=../al_mijn_wachtwoorden.txt intypen om maar een voorbeeld te noemen. De checks gaan goed daarmee bedoel ik dan: htmlentities en stripslashes maar met de laatste beveiligingsmaatregel gaat was mis:
PHP:
1
2
3
| if(strpos($string,"<") && strpos($string,";") && strpos($string,"@") && strpos($string,"!") && strpos($string,">") && strpos($string,"?") && strpos($string, ".") == false ) { return $string; } |
De PHP.NET manual voor strpos zegt het volgende:
Als het goed is en geen van deze characters zijn aanwezig moet de if statement false returnen. Vul ik echter ?page=about> in dan wordt het else statement ge-execute. Maar het meest rare is: vul ik "?page=about" in, waar dus geen characters in zitten die niet voor mogen komen. Wordt nog steeds het else statement ge-execute.Returns the position as an integer. If needle is not found, strpos() will return boolean FALSE.
Kan iemand mij op weg helpen?