it-swarm-es.com

Prueba PHP inyección de formulario

Estoy escribiendo una aplicación muy pequeña PHP 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 desinfecta la entrada:

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

Pero si trato de inyectar el código PHP ("; print phpinfo();, "etc.) simplemente me devuelve el eco 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 arbitrariamente [PHP código?

Me he dado cuenta de que mi máquina tiene instalado el parche PHP Suhosin (Ubuntu 10.10). ¿Sería un escape/desinfección automática para mí?

7
Andrew

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

Por ejemplo, intente inyectar:

<script> alert('woot Security.SE rulez!');</script>
9
AviD

"Inyección PHP" no es posible a menos que su aplicación esté utilizando 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 terminan con .php, .phtml o cualquier otra PHP extensiones de archivo registradas.

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

Intente descargar "Tamper Data" ... es un complemento para Firefox que hace que sea 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 lo sepas tú mismo!

4
Mark E. Haase

Solo para su información, no consideraría usar stripcslashes, ya que también podría causar XSS.

Déjame explicarte: stripslashes vs stripcslashes

stripslashes elimina todas las barras invertidas independientemente del tipo

stripcslashes eliminará todas las barras diagonales inversas, excepto los caracteres hexadecimales, por lo que esto significa que podría realizar un ataque XSS en una función que utiliza 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

Lo cual cuando es evaluado por la función stripcslashes resultará en: alerta ('XSS!');

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

Solo asegúrese de hacer su investigación sobre las funciones que está utilizando antes de usarlas, ya que podría estar causando más problemas de lo que vale.

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

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

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

> 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 PHP código sin usar algo como include (), require (), eval (), system () (Tienes más preocupaciones si están utilizando system () en la entrada del usuario que PHP Ejecución de código arbitrario).

2
DarkMantis