Come può un cracker superare questa regexp?

3

Recentemente ho avuto una chat con un cracker e mi ha detto che può superare il controllo uri regexp.

Sto controllando se path_info corrisponde alla mia espressione regolare e successivamente lo abbino alla mia tabella di routing. Se non esiste un instradamento per quel percorso, reindirizzo a una pagina 404.

Ho un po 'di codice qui e mi chiedevo se qualcuno potrebbe risolvere il problema fornendo dati errati o la mia app web è protetta? È possibile aggirare questo? (Si prega di notare che questo è solo un codice di esempio):

<?php
// alphabetic characters, numbers, "-" and "/" are allowed
$pathRegex = '/[a-zA-Z0-9\/-]+/';
$pathInfo = $_SERVER["PATH_INFO"];
$routes = array(
    "homepage" => "/",
    "some_page" => "/param1/param2-something"
);

$res = preg_match($pathRegex, $pathInfo, $matches);
if ($res && $matches[0] == $pathInfo) {
    if (checkRouting($pathInfo, $routes)) {
        // keep on running
    } else {
        // 404, sorry
    }
} else {
    // wrong path
}

function checkRouting($path, $routes) {
    $res = false;
    foreach($routes as $key => $val) {
        if ($val == $path) {
            $res = true;
            break;
        }
    }
    return $res;
}
?>
    
posta Adam Arold 03.10.2011 - 20:56
fonte

2 risposte

2

L'uso di un'espressione regolare crea incertezza, rende difficile il debug e può richiedere un uso intensivo delle risorse. Detto questo, utilizzo amico Regex per eseguire il debug delle espressioni regolari . In realtà questo è uno strumento che ho usato per hackerare PHPIDS , che contiene molte espressioni regolari. I migliori sistemi di sicurezza che ho incontrato sono molto semplici e facili da capire, la complessità è il peggior nemico di sicurezza.

Tuttavia ciò che stai facendo è solo una semplice lista bianca per assicurare che $_SERVER["PATH_INFO"] sia un percorso approvato. Questo può essere fatto in O (1) tempo con un dizionario. Crea un dizionario in cui ogni percorso è la chiave chiamata $ route_paths;

if(isset($route_paths[$_SERVER["PATH_INFO"]])){
    // keep on running
} else {
    // 404, sorry
}
    
risposta data 06.02.2012 - 01:28
fonte
-1

Mi sembra soddisfacente, tranne forse farei questa espressione regolare, invece:

'#/([a-z0-9]+(-|/)?)*#i'
  1. Forza l'url a iniziare con /
  2. Costringerà le parti dell'URL a iniziare con una lettera o un numero
  3. Consentirà quindi 1 - o / e quindi ricomincerà a scrivere / numerare
  4. Consente sempre lettere maiuscole e minuscole

Penso che non ci siano troppe possibilità, comunque puoi modificarlo di nuovo, ma la ragione per cui IMO era che poteva usare qualsiasi numero di / - in qualsiasi momento nell'url, forse sapeva qualcosa al riguardo.

    
risposta data 03.10.2011 - 21:07
fonte

Leggi altre domande sui tag