Probando la inyección de formularios PHP

7

Estoy escribiendo una aplicación PHP muy pequeña que recibe información a través de un formulario. Como podría esperarse para una primera revisión, el código no escapa ni se desinfecta la información:

if( $_POST["var"] != "" ) {
    print "Current value: ".$_POST["var"]."\n";
}

Pero si trato de inyectar el código PHP ( "; print phpinfo(); , "etc.) simplemente me lo devuelven en lugar de ejecutarlo.

Soy consciente de cómo limpiar la entrada usando htmlspecialchars , addcslashes , mysqli_real_escape_string etc., pero antes de usarlos, ¿qué sintaxis necesito para inyectar con éxito un código PHP arbitrario?

Me he dado cuenta de que mi máquina tiene instalado el parche de PHP Suhosin (Ubuntu 10.10). ¿Sería eso un proceso de escape / saneamiento automático para mí?

    
pregunta Andrew 17.02.2011 - 01:48
fuente

3 respuestas

9

Para ese código, no esperaría recibir una inyección de PHP, pero me gustaría ver Cross-Site Scripting (XSS) en su lugar.

Por ejemplo, intente inyectar:

<script> alert('woot Security.SE rulez!');</script>
    
respondido por el AviD 17.02.2011 - 01:58
fuente
4

"Inyección PHP" no es posible a menos que su aplicación utilice include (), require (), eval (), create_function (), o cualquiera de esas funciones similares que invocan al intérprete. O si su aplicación escribe en archivos en la ruta de PHP que termina con .php, .phtml o cualquier otra extensión de archivo registrada en PHP.

Sin embargo, como lo señaló AviD, el marcado y la inyección de scripts son definitivamente posibles en su ejemplo.

Intente descargar "Datos de manipulación" ... es un complemento para Firefox que hace ridículamente fácil realizar ataques de inyección contra una aplicación web. Incluso tiene algunos ataques predeterminados incorporados que puedes probar, ¡en caso de que no conozcas ninguno!

    
respondido por el Mark E. Haase 09.03.2011 - 00:10
fuente
2

Solo para tu información, no consideraría el uso de barras de barras ya que también podría causar XSS.

Déjame explicarte: barras desplegables vs barras diagonales

stripslashes elimina todas las barras invertidas independientemente del tipo

stripcslashes eliminará todas las barras invertidas excepto los caracteres hexadecimales, por lo que esto significa que puedes realizar un ataque XSS en una función que usa stripcslashes haciendo algo como esto:

\x3c\x73\x63\x72\x69\x70\x74\x3e\x61\x6c\x65\x72\x74\x28\x27\x58\x53\x53\x21\x27\x29\x3b\x3c\x2f\x73\x63\x72\x69\x70\x74\x3e

El cual, cuando se evalúe mediante la función stripcslashes, resultará en: alert ('XSS!');

Esto fue realmente una vulnerabilidad que encontré dentro de un popular plugin de Wordpress (Platinum SEO < = 1.3.7)

Solo asegúrese de investigar sobre las funciones que está utilizando antes de usarlas, ya que podría estar causando más problemas de los que vale la pena.

Esto también se aplica a su uso de addcslashes (), ya que podría forzarlo a evaluar el código donde no lo desea, así:

$>php -r 'echo addcslashes("\x41", "A..z");' 
\A   

Y aquí hay un ejemplo básico de eso en uso para una cadena XSS mal formada:

> php -r 'echo addcslashes("\x3c\x73\x63\x72\x69\x70\x74\x3e\x61\x6c\x65\x72\x74\x28\x27\x58\x53\x53\x21\x27\x29\x3b\x3c\x2f\x73\x63\x72\x69\x70\x74\x3e", "/");'   
<script>alert('XSS!');<\/script>

Como puede ver, eso aún ejecutaría la alerta.

Como mehaase confirmó, no hay forma posible de invocar el código PHP sin usar algo como include (), require (), eval (), system () (Tiene más preocupaciones si está usando system () en entrada de usuario que PHP Ejecución de código arbitrario).

    
respondido por el DarkMantis 25.09.2013 - 13:19
fuente

Lea otras preguntas en las etiquetas