Explotación de PHP a través de parámetros GET

9

Para ser claros, esto está en el interés de las pruebas éticas para asegurar una aplicación en nombre de mi trabajo.

Ahora que está fuera del camino, aquí están los detalles:

  1. Los parámetros GET sin desinfectar se usan en un script PHP para modificar dinámicamente una página HTML.
  2. Solo la subcadena param antes de que se escriba un / en el archivo HTML

Estoy intentando que el código <?php phpinfo() ?> se ejecute cuando se representa la página HTML.

Cuando navego a:

[host]/index.php/someparam=<?php phpinfo() ?>

La fuente de la página muestra que el código se ha incluido en un comentario:

<!--?php phpinfo() ?-->

El código solo se envuelve en un comentario html cuando se detecta <? , es decir, ?> por sí solo está bien.

¿Alguna idea sobre derrotar esto? Lo he intentado:

%3C%3F%70%68%70%20%70%68%70%69%6E%66%6F%28%29%20%3F%3E

que todavía resulta en:

<!--?php phpinfo() ?-->

base64 simplemente se procesa como está y no se trata como un código, los valores decimales no están presentes en ninguna parte de la fuente (ni siquiera se incluyen en un comentario html).

    
pregunta Très 28.05.2013 - 06:32
fuente

2 respuestas

9

El escenario simplista sería intentar y enviar --><?php phpinfo();?><!-- . Si se escapa la etiqueta <?php , esto daría como resultado

 <!-- -->
 <?php phpinfo();
 <!-- -->

(nuevas líneas agregadas para mayor claridad). Pero la presencia de <?php ...?> en la página HTML podría no ser suficiente; el código PHP debe ser interpretado del lado del servidor, no solo enviado de vuelta al cliente.

Al examinar más de cerca el principio de la cadena resultante:

 <!--?

está claro que no es la etiqueta de PHP, sino el < solo lo que activa el escape, y esto probablemente sea una defensa HTML / XML / XSS. Lo que significa que no puede enviar contenidos activos y hacer que se ejecuten, o se procesen en forma ejecutable por el cliente.

Nuevamente, puedes intentar con "pre-escape", enviando

 < --><hr><!-- >

y viendo si esto se transforma ingenuamente en

 <!----><hr><!-- -->

que se representaría como HTML, o se modifica más a fondo en

 <!-- -- --><!-- hr --><!-- !-- -->

que no sirve para nada útil. Esto depende completamente de cómo se realiza la detección de etiqueta abierta HTML y cómo funciona. A veces, preg_replace se usa con expresiones regulares incorrectas, incompletas o no lo suficientemente codiciosas, que pueden desfigurar solo la primera o la última etiqueta, o desfigurar ciegamente la primera abertura con el último cierre, ignorando cualquier cosa que se encuentre en el medio. Si ese es el caso, entonces la página es vulnerable a la inyección de Javascript y una variedad de ataques relacionados.

¿El código de desinfección está disponible para inspección?

Ejemplo de validación ingenua

Por ejemplo, este código aparentemente desinfecta la salida HTML.

preg_replace("/<(.*)>/", "<!-- \1 -->", $input);

pero (aparte de ser una medida mal pensada), ¿la falta de un operador que no se siente bien? lo deja vulnerable a un simple ataque preescape:

<?php
    $params = array(
            "<script>alert('FAIL');</script>",
            "< --><script>alert('Success');</script><!-- >",
    );
    foreach($params as $param)
            print preg_replace("/<(.*)>/", "<!-- \1 -->", $param) . "\n\n\n";
?>

hace que el primer ataque ingenuo falle, mientras que el segundo tiene éxito:

<!-- script>alert('FAIL');</script -->

<!--  --><script>alert('Success');</script><!--  -->

Lamentablemente, esta opción preg_replace a menudo se sugiere o implementa como una "solución rápida" para los ataques de inyección HTML, y como la mayoría de las "soluciones temporales" suelen hacerlo, puede convertirse en permanente .

Una mejor estrategia sería filtrar cualquier cosa que no pertenezca al parámetro original (por ejemplo, reemplazar [^A-Za-z0-9_] por nada en absoluto), o suponer que la presencia de caracteres prohibidos significa que Algo malo viene de esta manera , y por lo tanto, la reacción más segura es descartar la solicitud por completo (tal vez informar al usuario, en caso de que ocurra por accidente o debido a un problema, por ejemplo, un enlace sintácticamente incorrecto, en otro lugar, por lo que se recomienda encarecidamente el registro de HTTP_REFERER ).

    
respondido por el LSerni 28.05.2013 - 09:00
fuente
2

Viendo esto, lo único que se me ocurre es un ataque XSS . Lo que está intentando probablemente fallará, no porque el sitio filtre ciertas entradas, es solo la forma en que se implementa esta "funcionalidad". Es muy probable que sea algo como esto:

echo '<!--'.$_GET['someparam'].'-->';

Incluso sin el <!-- --> , lo que el script está haciendo es tomar su entrada, almacenarla en una variable y luego imprimirla de nuevo, el intérprete de PHP no la está procesando nuevamente.

Una situación explotable sería eval($_GET); , pero claramente ese no es el caso aquí.

    
respondido por el Adi 28.05.2013 - 08:36
fuente

Lea otras preguntas en las etiquetas