1. 前言
简陋的学习记录
2. Java内存马
2.1 什么是内存马
内存马是无文件攻击的一种常用手段,也就是我们常说的无文件落地的webshell。webshell内存马是在内存中写入恶意后门和木马并执行,达到远程控制web服务器的一类内存马。常规的webshell一般被我们分为了三类,分别是大马、小马、一句话木马。
1. 大马
1. 体积大、功能全
2. 会调用系统的关键函数
3. 以代码加密进行隐藏
2. 小马
1. 体积小、功能少
2. 只有一个上传功能
3. 一句话木马
1. 代码短,只有一行代码
2. 使用场景广泛,可以单独生成可插入文件
3. 安全性高,隐匿性强,可变性免杀
4. 框架不变,数据执行
2.2 webshell
web服务器管理页面 –> 大马 –> 小马拉大马 –> 一句话木马 –> 加密一句话木马 –> 加密内存马
2.3 Java web三大组件
- Listener: JavaWeb开发中的监听器(Listener)就是Application、Session和Request三大对象创建、销毁或者往其中添加、修改、删除属性时自动执行代码的功能组件。
- Filter: Filter也称为过滤器,是对Servlet技术的一个强补充,其主要功能是在http服务请求到达Servlet之前,拦截客户的http服务请求,根据需要检查http服务请求,也可以修改http服务请求头和数据。在http服务响应到达客户端之前,拦截http服务响应,根据需要检查http服务响应,也可以修改http服务响应头和数据。
- Servlet: Servlet是运行在Web服务器或应用服务器上的程序,它是作为来自HTTP客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层。
2.4 常见的内存马
目前比较常见的内存马主要分为以下几种方式:
- 动态注册 servlet/filter/listener(使用servlet-api具体实现)
- 动态注册 interceptor/controller(使用框架,如spring/struts2)
- 动态注册使用职责链设计模式的中间件、框架的实现(如Tomcat的Pipeline & Valve,Grizzly的FilterChain & Filter等等)
- 使用Java agent技术写入字节码
2.5 Java内存马原理
在Java程序中,客户端发起的web请求会一次经过Listener、Filter、Servlet三个组件,Java内存马的原理即在客户端发起web请求的这个过程中,修改内存中已有的组件或者动态注册一个新的组件,然后插入恶意的shellcode,从而达到我们的目的。
3. JSP
简单了解了Java内存马,接下来再来看下什么是JSP。JSP(Java Server Pages),是Java的一种动态网页技术。JSP可以看作一个Java Servlet,主要用于实现Java web应用程序的用户界面部分。网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。
当第一次访问JSP页面时,Tomcat服务器会将JSP页面翻译成一个Java文件,并将其编译为.class文件。JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态的创建网页。
3.1 JSP语法
脚本程序
脚本程序可以包含任意量的Java语句、变量、方法或表达式,只要它们在脚本语言中是有效的。脚本程序的格式如下:
1 | <% 代码片段 %> |
等价于下面的XML语句
1 | <jsp:scriptlet> |
接下来让我们试试看,安装一个Tomcat,然后修改index.jsp文件为如下内容
1 | <html> |
开启Tomcat后,访问页面
成功解析。
JSP声明
一个声明语句可以声明一个或多个变量、方法,供后面的Java代码使用。JSP声明语句格式如下:
1 | <%! 声明 %> |
等价于下面的XML语句
1 | <jsp:declaration> |
示例如下
1 | <html> |
JSP表达式
如果JSP表达式中为一个对象,则会自动调用其toString()方法。格式如下:
1 | <%= 表达式 %> |
等价于下面的XML表达式
1 | <jsp:expression> |
示例如下
1 | <html> |
JSP指令
JSP指令用来设置与整个JSP页面相关的属性。下面有三种JSP指令
指令 | 描述 |
---|---|
<%@ page … %> | 定义页面的依赖属性,比如脚本语言、error页面、缓存需求等 |
<%@ include … %> | 包含其他文件 |
<%@ taglib … %> | 引入标签库的定义,可以是自定义标签 |
比如可以通过page指令来设置jsp页面的编码格式
1 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> |
示例如下
1 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> |
JSP注释
格式如下
1 | <%-- 注释内容 --%> |
3.2 JSP内置对象
JSP有九大内置对象,他们能够在客户端和服务器端交互的过程中分别完成不同的功能。特点如下:
- 由JSP规范提供,不用编写者实例化
- 通过Web容器实现和管理
- 所有JSP页面均可使用
- 只有在脚本元素的表达式或代码段中才能使用
对象 | 类型 | 描述 |
---|---|---|
request | javax.servlet.http.HttpServletRequest | 获取用户请求信息 |
response | javax.servlet.http.HttpServletResponse | 响应客户端请求,并将处理信息返回到客户端 |
response | javax.servlet.jsp.JspWriter | 输出内容到HTML中 |
session | javax.servlet.http.HttpSession | 用来保存用户信息 |
application | javax.servlet.ServletContext | 所有用户共享信息 |
config | javax.servlet.ServletConfig | 这是一个Servlet配置对象,用于Servlet和页面的初始化参数 |
pageContext | javax.servlet.jsp.PageContext | JSP的页面容器,用于访问page、request、applicaion和session的属性 |
page | javax.servlet.jsp.HttpJspPage | 类似于Java类的this关键字,表示当前JSP页面 |
exception | javax.lang.Throwable | 该对象用于处理JSP文件执行时发生的错误和异常。只有在JSP页面的page指令中指定isErrorPage的取值true时,才可以在本页面使用exception对象。 |
未完待续。。。
参考链接
1 | Java安全学习——内存马 |
发布时间: 2023-06-25
最后更新: 2023-09-26
本文标题: Java内存马系列
本文链接: https://foxcookie.github.io/2023/06/25/Java内存马系列/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!