JSP的本质是servlet,当外面攻击者将jsp文件上传到程序目录下,就能通过访问jsp文件进行服务攻击,可以通过程序避免jsp文件上传。
如果jsp文件已经上传上去,可以避免jsp文件被直接访问,思路是通过servlet对*.jsp、*.jspx文件进行过滤,核心代码如下:
Servlet文件:
Object flag = request.getAttribute("org.apache.catalina.core.DISPATCHER_TYPE");
if (flag != null)
{
if ((("javax.servlet.DispatcherType".equals(flag.getClass().getName())) &&
("REQUEST".equals(flag.toString()))) || (
((flag instanceof Integer)) && (((Integer)flag).intValue() == 8))) {
response.setContentType("text/html;charset=UTF-8");
Writer writer = response.getWriter();
boolean isJspExist = new File(request.getServletContext().getRealPath(request.getServletPath())).exists();
String htmlOutput = isJspExist ? "<!DOCTYPE html>\r\n<html lang=\"zh-cn\">\r\n<head>\r\n<title>由于安全原因JSP功能默认关闭</title></head>\r\n<body>由于安全原因,JSP功能默认被禁止</body>\r\n</html>";
if (this.springBoot)
writer.write(htmlOutput.replace("##WARNINFO##", "如需开启请在SpringBoot启动程序中修改相关配置"));
else {
writer.write(htmlOutput.replace("##WARNINFO##", "如需开启请编辑WEB应用的web.xml文件"));
}
writer.flush();
writer.close();
return;
}
}
web.xml中的配置:
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>tomcat.SecurityJspServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>