内存Webshell简介
内存webshell相比于常规webshell更容易躲避传统安全监测设备的检测,通常被用来做持久化,规避检测,持续驻留目标服务器。无文件攻击、内存Webshell、进程注入等基于内存的攻击手段也受到了大多数攻击者青睐。
内存webshell原理
本篇文章主要讨论的为Webshell脚本类内存马。其原理是先由客户端发起一个web请求,中间件的各个独立的组件如Listener、Filter、Servlet等组件会在请求过程中做监听、判断、过滤等操作,内存马利用请求过程在内存中修改已有的组件或者动态注册一个新的组件,插入恶意的shellcode达到持久化的控制服务器。
PHP内存马
php内存马原理:
php内存马也就是php不死马是将不死马启动后删除本身,在内存中执行死循环,使管理员无法删除木马文件。本次演示是将php不死马放到web目录下访问后及执行会在本地循环生成php一句话木马。
检测思路:
- 检查所有php进程处理请求的持续时间
- 检测执行文件是否在文件系统真实存在
代码:
函数说明:
- ignore_user_abort()函数:函数设置与客户机断开是否会终止脚本的执行,如果设置为 true,则忽略与用户的断开。
- set_time_limit()函数:设置允许脚本运行的时间,单位为秒。如果设置为0(零),没有时间方面的限制。
- unlink(__FILE__)函数:删除文件。
- file_put_contents函数:将一个字符串写入文件。
- usleep函数:延迟执行当前脚本若干微秒(一微秒等于一百万分之一秒)。
php不死马实战:
图:将php不死马放到web目录下
图:访问代码执行成功并生成后门
图:执行完生成php一句话木马
图:菜刀连接成功及时删掉22.php也会再次生成
对于不死马,直接删除脚本是没有用的,因为php执行的时候已经把脚本读进去解释成opcode运行了。使用条件竞争写入同名文件进行克制不死马。
图:将usleep改为小于php不死马的参数
图:查看22.php已修改成叹号
Python内存马
Python内存马原理:
Python内存马利用flask框架中ssti注入来实现,flask框架中在web应用模板渲染的过程中用到render_template_string()进行渲染但未对用户传输的代码进行过滤导致用户可以通过注入恶意代码来实现python内存马的注入。
实战步骤:
简单编写一个flask sstl实例,内容是访问/index加上content参数就会被渲染,渲染的content内容是用户可控,利用这点生成内存马。
图:环境代码
payload:
函数和属性解析
- __class__:返回调用的参数类型
- __bases__:返回基类列表
- __builtins__:内建模块的引用,在任何地方都是可见的(包括全局),每个 Python 脚本都会自动加载,这个模块包括了很多强大的 built-in 函数,例如eval, exec, open等
- __globals__:以字典的形式返回函数所在的全局命名空间所定义的全局变量,这里的函数可以是类class的构造函数如__init__,也可以是flask的函