Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: WHK en 21 Diciembre 2011, 18:40 pm



Título: Recopilatorio de Filtros, Casting y Parsing para PHP
Publicado por: WHK en 21 Diciembre 2011, 18:40 pm
Quiero comenzar abriendo este post para poder ir poniendo todos los cast o parser mas utiles para filtrar strings, objetos, etc de la mejor forma posible y no tener que andar buscando de un lugar para otro.

Información adicional de casting básico:
http://php.net/manual/es/language.types.type-juggling.php
http://foro.elhacker.net/nivel_web/como_evitar_la_inyeccion_sql-t252384.0.html


A veces necesitamos llamar a un archivo desde peticiones get o post y debemos evitar LFI, una forma es haciendo un file_exists() y preg match de esta forma:

Código
  1. <?php
  2. if(file_exists($file = './module/'.preg_replace('|[^A-Za-z0-9_\-]|i', '', $_GET['file']).'.php'))
  3. include($file);
  4. unset($file);
  5. ?>

El problema es que siempre queda la posibilidad de bypasear los strings o meterse donde uno no debe, talves un archivo restringido como llamar al index.php principal, por eso desde hace algún tiempo estoy utilizando algo muchisimo mas limpio y efectivo y evita el 100% de los ataques LFI y RFI:

Código
  1. <?php
  2. if(in_array(($file = './module/'.$_GET['file'].'.php'), glob('./module/*.php')))
  3. include($file);
  4. ?>

De esta forma la función glob() nos dará un array con todas las rutas que contengan un archivo php dentro del directorio módulos, asi que si tratamos de hacer un LFI nos dará negativo siempre:

Código
  1. <?php
  2. $files = glob('./module/*.php')
  3. echo './module/'.$_GET['file'].'.php es igual a '.$files[0].' ???';
  4. ?>

Citar
./module/../../../../config/config.php es igual a ./module/main.php ???


Siempre he visto en varios post dentro del foro sobre como saber si un string es una dirección e-mail o no, pues fácil:
Código
  1. filter_var('test@gmail.com', FILTER_VALIDATE_EMAIL)

Debuelve true o false.


Alguna ves has necesitado ingresar una string dentro de un tag <script> sin que te salga un xss?

Digamos que tengo esto:
Código
  1. <script>
  2. var test = '<?php echo addslashes(htmlspecialchars($_GET['test'], ENT_QUOTES)); ?>';
  3. </script>

Dejemne decirles que los que utilizan addslashes o htmlspecialchars están expuestos a un xss o a que simplemente no funcione siempre bién ya que addslashes y htmlspecialchars no filtran cosas como saltos de linea, parentesis y comentarios, por lo tanto con un simple %0a%0d puedes comenzar a inyectar código arbitrario.

Que hacemos en este caso?
Lo que google hace es pasar todo a unicode y los carácteres especiales quedan algo así: \u0010, pero yo lo hago de una forma mucho mas efectiva, limpia y con menos bites:

Código
  1. <script>
  2. var test = '<?php echo str_replace(array('+', '%'), array(' ', '\x'), urlencode($_GET['test'])); ?>';
  3. </script>

De esta forma todos los carácteres especiales incluyendo saltos de linea quedarán así:

Código
  1. <script>
  2. var test = '\x0a\x0cprueba de caracteres\x3c\x22';
  3. alert(test);
  4. </script>

La ventaja es que javascript interpreta de forma nativa los valores hexadecimales los pases a comillas simples o a comillas dobles asi que podrás seguirlo usando tan normal como siempre:

Código
  1. <div></div>
  2. <script>
  3. var test = '\x0a\x0cprueba de caracteres\x3c\x22';
  4. $('div').text(test);
  5. </script>