¿Cómo puede un cracker superar esta expresión regular?

3

Hace poco tuve una conversación con un cracker y me dijo que puede pasar la comprobación de expresiones regulares de uri.

Estoy comprobando si la ruta_info coincide con mi expresión regular y, a continuación, la comparo con mi tabla de enrutamiento. Si no hay enrutamiento para esa ruta, redirigiré a una página 404.

Tengo un pequeño código aquí y me preguntaba si alguien podría descifrarlo al proporcionar datos incorrectos o si mi aplicación web está protegida. ¿Es posible eludir esto? (Tenga en cuenta que esto es sólo un código de ejemplo):

<?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;
}
?>
    
pregunta Adam Arold 03.10.2011 - 20:56
fuente

2 respuestas

2

El uso de una expresión regular crea incertidumbre, dificulta la depuración y puede requerir muchos recursos. Dicho esto, uso Regex buddy para depurar expresiones regulares . De hecho, esta es una herramienta que utilicé para hackear PHPIDS , que contiene muchas expresiones regulares. Los mejores sistemas de seguridad que he encontrado son muy simples y fáciles de entender, la complejidad es el peor enemigo de la seguridad.

Sin embargo, lo que estás haciendo es solo una simple lista blanca para asegurarte de que $_SERVER["PATH_INFO"] es una ruta aprobada. Esto se puede hacer en O (1) complejidad de tiempo con un diccionario. Cree un diccionario donde cada ruta sea la clave llamada $ route_paths;

if(isset($route_paths[$_SERVER["PATH_INFO"]])){
    // keep on running
} else {
    // 404, sorry
}
    
respondido por el rook 06.02.2012 - 01:28
fuente
-1

Me parece bien, excepto que quizás haga esta expresión regular en su lugar:

'#/([a-z0-9]+(-|/)?)*#i'
  1. Forzará tu url para comenzar con /
  2. Obligará a las partes de tu URL a comenzar con una letra o un número
  3. Entonces permitirá 1 - o / y luego comenzará a escribir letras / numeración nuevamente
  4. Permite letras mayúsculas y minúsculas todo el tiempo

Creo que no hay demasiadas posibilidades, de todos modos, puedes modificarlo nuevamente, pero la razón por la cual IMO fue que podía usar cualquier número de / - en cualquier momento en la URL, tal vez sabía algo sobre eso.

    
respondido por el Mathieu Dumoulin 03.10.2011 - 21:07
fuente

Lea otras preguntas en las etiquetas