PHP: path traversal, script veilig?

Gestart doorDylan9 reacties54 weergaven

10 berichten · pagina 1 van 1

Dylan

Lid · Topicstarter

Berichten
14.025
Reputatie
1
Punten
0,01
Lid sinds
Laatst gezien
Hoi,

Toen ik dit script aan een aantal mensen liet zien zeiden ze dat dat gevaarlijk was, als je dan naar ?p=../../../../../../etc/passwd gaat dat je dan mijn server kan hacken. Maar ik ben het daarmee oneens want in de eerste 10 regels van het script word er gecontroleerd welke files in het mapje pages zit, later word dan gekeken of het bestand wat aangevraagd word in die array zit; zoja is het veilig en zonee word er een 404 code gestuurd.

Codeblok (voorbeeld.php):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23


if(isset($_GET[p])) {
$allowedPages = array();
$openDir = opendir(./pages/);

while(false !== ($entry = readdir($openDir))) {
$allowedPages[] = $entry;
}


closedir($openDir);

$_GET[p] = preg_replace(/([^.]+)(?:.[^.]+)?$/, "$1.php", $_GET[p]);
$_GET[p] = preg_replace(/.[^.]+$/, .php, $_GET[p]);

if(in_array($_GET[p], $allowedPages)) {
include ./pages/.$_GET[p];
}
else {
header("HTTP/1.0 404 Not Found");
header("Location: ./404");
exit();
}
}

?>

Is het nou veilig of niet?
0
Berichten
93.699
Reputatie
0
Punten
1,27
Lid sinds
Laatst gezien
Probeer eens te injecteren met null byte exploit, vaak gebruikt bij path traversal!
0
Berichten
6.485
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
de preg_replaces zijn nutteloos, ze zijn niet recursief.

Bij paypal.com had ik een LFI, ik kon de filter ontwijken door de replace te ontwijken omdat de replace geen recursie toepaste.
...// => ../

Overigens zou allowedpages genoeg moeten zijn.
0
Berichten
93.699
Reputatie
0
Punten
1,27
Lid sinds
Laatst gezien
Regular expression is idd overbodig. Gewoon array maken van alle paginas en kijken of je $_GET[pagina] bestaat in die array, zoja, pagina inladen.
0
Dylan

Lid · Topicstarter

Berichten
14.025
Reputatie
1
Punten
0,01
Lid sinds
Laatst gezien
Raaoul schreef:
Regular expression is idd overbodig. Gewoon array maken van alle paginas en kijken of je $_GET[pagina] bestaat in die array, zoja, pagina inladen.
Dat doe ik al met opendir en een while. Is dat niet veilig?
0
Berichten
93.699
Reputatie
0
Punten
1,27
Lid sinds
Laatst gezien
Dylanh schreef:
Eerdere citaten tonen
Raaoul schreef:
Regular expression is idd overbodig. Gewoon array maken van alle paginas en kijken of je $_GET[pagina] bestaat in die array, zoja, pagina inladen.
Dat doe ik al met opendir en een while. Is dat niet veilig?
ja das goed.
0
Rik

Lid

Berichten
18.393
Reputatie
0
Punten
0,04
Lid sinds
Laatst gezien
In het ergste geval kan je ook nog een check inbouwen of "." of dergelijke characters voorkomen in de p parameter. Aangezien die daar sowieso niet thuis horen
0
Dylan

Lid · Topicstarter

Berichten
14.025
Reputatie
1
Punten
0,01
Lid sinds
Laatst gezien
Rik schreef:
In het ergste geval kan je ook nog een check inbouwen of "." of dergelijke characters voorkomen in de p parameter. Aangezien die daar sowieso niet thuis horen
Ik heb nu dit:

Codeblok (voorbeeld.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
28
29
30
31
32
33
34
35


require_once(./classes/template.php);
require_once(./classes/mysqli.php);

ob_start();
error_reporting(E_ALL);
if(isset($_GET[p])) {
$allowedPages = array();
$openDir = opendir(./views/);

while(false !== ($entry = readdir($openDir))) {
$allowedPages[$entry] = $entry;
}


closedir($openDir);

$_GET[p] = preg_replace(/([^.]+)(?:.[^.]+)?$/, "$1.php", $_GET[p]);
$_GET[p] = preg_replace(/.[^.]+$/, .php, $_GET[p]);

if(in_array($_GET[p], $allowedPages) && !preg_match(/./, $_GET[p])) {
$template = new RouterTemplate_parser(array(
TITLE => Rekentalent:,
CSS => ,
jQuery =>
));

include_once ./views/.$allowedPages[$_GET[p]];
}
else {
header("HTTP/1.0 404 Not Found");
header("Location: /404");
exit();
}
}

ob_end_flush();
?>

Ik heb dus op regel 20 een preg_match toegevoegd, alleen nu laad te pagina erg lang en krijg ik een omleidinglus?
0
Berichten
93.699
Reputatie
0
Punten
1,27
Lid sinds
Laatst gezien
Waarom allow je niet alleen alfanumeriek?
0

Jouw reactie

Deel je idee, stel een vraag of help een ander verder.

Editor laden…

Praat mee met de One2xs-community.

Inloggen om te reageren