JSP 全称 Java Server Page,基于 Java 语言,是一种动态网页技术。
它使用 JSP 标签在 HTML 网页中插入 Java 代码。标签通常以<% code %>
显示。
JSP 本质是简化版的 Servlet,JSP 在编译后就变成了 Servlet。JVM 只能识别Java 的类,是无法识别 JSP 代码的。所以 WEB 服务器会将 JSP 编译成 JVM 能识别的 Java类。JSP 跟 Servlet 区别在于,JSP 常用于动态页面显示,Servlet 常用于逻辑控制。在代码中常使用 JSP 做前
端动态页面,在接收到用户输入后交给对应的 Servlet 进行处理。当然 JSP 也可以当做后端代码进行逻辑控制。
后缀为*.jsp
如
常用:
<%
out.println("hellpo JSP!");
%>
<jsp:scriptlet>
代码片段
</jsp:scriptlet>
编译阶段 -> 初始化阶段 -> 执行阶段 -> 销毁阶段 ,此处多了一个编译阶段,是将JSP 编译成 Servlet 的阶段。
JSP 指令:是用来设置 JSP 整个页面属性的。格式为: <%@ directive attribute="value" %>
指令 | 描述 |
---|---|
<%@ page ... %> | 定义网页依赖属性,比如脚本语言、error页面、缓存需求等等 |
<%@ include ... %> | 包含其他文件 |
<%@ taglib ... %> | 引入标签库的定义 |
这九个对象,可以不用声明直接使用
名称 | 类型 | 描述 |
---|---|---|
out | javax.servlet.jsp.JspWriter | 页面输出 |
request | javax.servlet.http.HttpServletRequest | 获得用户请求 |
response | javax.servlet.http.HttpServletResponse | 服务器向客户端的回应信息 |
config | javax.servlet.ServletConfig | 服务器配置,可以取得初始化参数 |
session | javax.servlet.http.HttpSession | 保存用户的信息 |
application | javax.servlet.ServletContext | 所有用户的共享信息 |
page | java.lang.Object | 指当前页面转换后的Servlet类的实例 |
pageContext | javax.servlet.jsp.PageContext | JSP的页面容器 |
exception | java.lang.Throwable | 表示JSP页面所发生的异常,在错误页中才起作用 |
新建一个项目
login.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>User Login Page</title>
</head>
<body>
<hr>
<h2>登录页面</h2>
<form action="do_login.jsp" method="get">
<h3>Please input your message:</h3>
<label for="username">Name:</label>
<input type="text" id="username" name="username"><br><br>
<label for="password">Pswd:</label>
<input type="password" id="password" name="password"><br><br>
<input type="submit" value="提交">
<input type="reset" value="重置">
</form>
</body>
</html>
do_login.jsp
<%--
Created by IntelliJ IDEA. User: Administrator Date: 2025/3/25 Time: 17:42 To change this template use File | Settings | File Templates.--%>
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
<%@ page import="java.sql.*" %>
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8">
<title>服务器处理注册页面</title>
</head>
<body>
<%
String username = request.getParameter("username");
String password = request.getParameter("password");
// 模拟登录成功与否
if ("admin".equals(username) && "password".equals(password)) {
response.getWriter().write("Success!");
} else {
response.getWriter().write("Error!");
}%>
</body>
</html>
前几年是 JSP 木马的鼎盛时期,由于技术的迭代。现在大型企业使用 SprinBoot 框架来开发的系统了,该框架默认是不引入 JSP 解析的,需要引入特定依赖才可以。而且现在前端大多使用vue,thymeleaf,freemarker等等。因此JSP木马也算逐渐没落了。
但我们还是得学习了解,毕竟网站数量基数很大,难免会在授权的测试中遇见。
JSP木马也可以称作JSP Webshell,如果对方在上传文件或其他功能没有做防护的话,攻击者可以利用任意文件上传漏洞将恶意代码传到后端,继而攻击者可以达到操作目标网站的目的。
推荐一些较为老派的 JSP 木马的 github 仓库:Page not found · GitHub · GitHub
近两年主流 webshell 管理工具:冰蝎,哥斯拉,蚁剑......
冰蝎: https://github.com/rebeyond/Behinder
蚁剑: https://github.com/AntSwordProject
哥斯拉: https://github.com/BeichenDream/Godzilla
JSP 大马,在代码中写入了更多功能,可以实现在网页中进行一些危险操作。
以下演示案例中的JSP大马用的是 https://github.com/theralfbrown/WebShell-2/tree/master/jsp 这个仓库中 无密码的jsp大马.jsp 。