首页 > 安全资讯 >

JSP应用的安全性研究

05-10-23

内容提要:通过介绍常见的具有JSP服务的操作系统的漏洞和JSP程序的漏洞,详细的阐述了JSP应用存在的安全性问题, 给出了相应的解决办法和建议。最后介绍了自己设计的基于JSP的在线图书管理系统所采取的安全措施。 关键词:JSP(Ja

内容提要:通过介绍常见的具有JSP服务的操作系统的漏洞和JSP程序的漏洞,详细的阐述了JSP应用存在的安全性问题, 给出了相应的解决办法和建议。最后介绍了自己设计的基于JSP的在线图书管理系统所采取的安全措施。


关键词:JSP(Jackson Structured Programming,杰克逊结构程序设计技术)
Java Servlet(是Java技术对CGI编程的回答)
JavaBean(是描述Java的软件组件模型,有点类似于Microsoft的COM组件概念)
 

Research on the Security of JSP Applications
Author name
(Dep.   Address+zip )
Abstracts: This article describes the problems of JSP Applications security in detail, by introducing the operation system providing the JSP service and JSP program, and gives the corresponding resolvents and advices . Last, this article shows the security methods in books database management system which author has designed.  
Subject words: JSP 、Java Servlet、JavaBean

JSP编程语言以其运行效率高、与平台无关、可扩展好、面向对象等特性得到了越来越广泛的应用,并迅速成为系统集成平台的主流技术之一。许多商家都开发出了各种各样的支持平台,如IBM(International Business Machines美国商用机器公司)公司的WebSphere、BEA公司的Web Logic等等,也有越来越多的网站开始将自己的平台架构在JSP 环境中。但是随之而来的也引发了一系列的安全漏洞问题,如源代码暴露、远程任意命令执行等。随着JSP 应用推广和普及,安全问题也会越来越多了。,目前已知并公开的关于JSP 的漏洞问题多达二、三十条。随着电子商务的出现,尤其是涉及资金支付和认证方面的电子商务,安全是第一要考虑的问题。下面对JSP的安全问题进行讨论。
第一章JSP的执行过程及其机制

JSP是Java Servlet 的扩展。它将Java(一种由Sun公司提出的,从C++发展而来的程序设计语言)脚本编写的动态部分嵌入到普通的HTML(Hypertext Markup Language, 超文本链接标示语言)或XML(Extensible Markup Language也是一种置标语言)网页中。一个完整的Web应用由三层构成:Web服务器,Servlet引擎和Jsp引擎。当Web应用程序服务器第一次收到JSP页面时,先由JSP引擎预处理并转换成Java Servlet,这个Servlet(Servlet为Web开发员提供了一个简单、一致的机制,来扩展Web服务器的功能,并且和已有的业务系统交互。)经过配置,可以处理对JSP页面的请求。虽然JSP和Servlet在功能上是等价的,但是,JSP的动态内容生成方法与Servlet的恰好相反。JSP是把Java代码嵌入到文档之中,而不是把文档嵌入到Java应用之中。
JSP在网络安全方面的优点:
(1) JSP源程序不大可能被下载,特别是JavaBean程序完全可以放到不对外的目录中。
(2) 基于Java的,具有Java 的一切安全特性。

第二章JSP中存在的安全漏洞和解决方法

JSP把Java代码嵌入到HTML文档之中,为访问外部功能和可重用对象,JSP提供了一些用来和JavaBean组件交互的额外标记。特别地,为了便于动态生成内容和格式,JSP允许在标记之内嵌入其他标记,这些标记的语法和HTML标记相似。HTML语法属于JSP语法的一个子集(一个纯HTML文档是一个合法的JSP页面),但反过来不一定正确。特别地,为了便于动态生成内容和格式,JSP允许在标记之内嵌入其他标记。这些结构都增加了安全问题的复杂性。另外,JSP的体系结构相当复杂,其中包含许多相互协作的子系统。这些子系统之间的交互也是安全隐患的根源。
由于完全开放了对服务器资源的访问,从JSP页面转换得到的不安全的Servlet可能给服务器、服务器所在的网络和访问页面的客户机之中的任意一个或全体带来威胁,甚至通过Dodos或蠕虫分布式攻击,还可能影响到整个Internet(Interactive Network Analysis 交互式网络分析)。人们往往认为,Java作为一种强类型安全的、具有垃圾收集能力的、具有沙箱(Sandbox)机制的语言,它能够奇迹般地保证软件安全。而且事实上,许多在其他语言中存在的低层次安全问题,比如缓冲或堆溢出,很少给Java程序带来危害。然而,这并不意味着人们很难写出不安全的Java程序,特别是对编写Servlet来说。验证输入和控制对资源的访问是始终必须关注的问题。另外,JSP的体系结构相当复杂,其中包含许多相互协作的子系统。这些子系统之间的交互常常是安全隐患的根源。除此之外,虽然现在所有的JSP实现都围绕着Java,但JSP规范允许几乎所有其他语言扮演这个角色。这样,这些替代语言的安全问题也必须加以考虑。总之,在JSP系统中有很多产生安全漏洞的机会。下面将讨论最常见的一部分。 

2.1  源代码及文件路径暴露
2.1.1  在HTTP请求中添加特殊字符后缀导致JSP源代码文件暴露
  Unify eWave ServletExec 是Java/Java Servlet 引擎插件,主要用于 WEB 服务器.当一个 HTTP(Hypertext Transfer Protocol,超文本传输协议) 请求中添加下列字符之一,ServletExec 将返回 JSP 源代码文件。
    %2E + %2B  %5C %20 %00。例如输入形如http://target/ jsp/file.jsp%2E的请求就会导致JSP源代码暴露。
受影响的系统有:
  Unify eWave ServletExec 3.0c、 Sun Solaris 8.0、Microsoft Windows 98、Microsoft Windows NT 4.0、
Microsoft Windows NT 2000、Linux kernel 2.3.x、IBM AIX 4.3.2、HP HP-UX 11.4
     解决办法:可以配置一个默认的 servlet,并将它们映射到一个默认的 servlet。这样当收到一个未映射到某servlet 的 URL(Uniform Resource Locator,网页地址,是因特网上标准的资源的地址) 时,这个默认的servlet 就会被调用。用它来对请求进行处理。

2.1.2路径权限引起的文件JSP源代码暴露
    大部分的JSP应用程序在当前目录下有一个WEB-INF目录,这个目录通常存放JavaBean编译后的class 文件,如果不给这个目录设置正常的权限, class文件有可能会暴露。如Apache1.3.中,如果程序在http://site.running.websphere/login.jsp,只要修改一下http://site.running.websphere/WEB-INF/,所有这个目录下以及其子目录中的class
文件就可以看到,还可下载到本机。因为Apache1.3.12默认的设置是可以读取目录的。这种class文件经过反编译以后,就能看见源文件了。 解决方法:将一些比较重要的目录如WEB-INF、classes等设置上访问的权限,不允许读取只允许执行。以Apache 下为例,可以在httpd.conf文件中添加一个目录WEB-INF并设置Deny from all等属性。
2.1.3 IE缓存JSP文件导致源代码暴露
如果浏览器设置“浏览网页时首先查看本地缓冲里的页面”,这对合法用户可加快浏览Web页面的速度,而对非法用户则提供了一个越权浏览的机会。因此对于重要的Web页面,必须禁止页面缓存,强制浏览器每次向Web服务器请求新页面。可使用下面脚本解决:
<% 
response.setHeader(Pragma,No-cache); 
response.setHeader(Cache-Control,no-cache); 
response.setDateHeader(Expires, 0); 
String userName = (String) session.getAttribute(User);
if (null == userName) {
 request.setAttribute(Error, Session has ended. Please login.);
 RequestDispatcher rd = request.getRequestDispatcher(login.jsp);
 rd.forward(request, response);
}
%> 或者
<HEAD> 
<META HTTP-EQUIV=Pragma CONTENT=no-cache> 
<META HTTP-EQUIV=Cache-Control CONTENT=no-cache> 
<META HTTP-EQUIV=Expires CONTENT=0> 
</HEAD>
上面代码的意思是:通过设置头信息和检查HttpSession中的用户名确保了浏览器不缓存页面。同时,如果用户没有登录,受保护的JSP页面将不会发送到浏览器,取而代之的将是登录页面login.jsp。实际应用中,如果要求特别高,还可以记录最后登录时间,即记录每个用户的最后登录时间。对于采用关系型数据库安全域来说,可以通过在某个表中加上lastLogin等字段轻松实现。此外,为了使代码更简练有效,一些冗余的代码可以剔除掉。比如把这些加强安全的代码写到一个单独的JSP页中,通过<jsp:include>标签在其他页面也可以引用。这样问题就可以比较简单地解决了。

2.1.4文件不存在引起的绝对路径暴露问题
微软IIS (Internet Information Server的缩写,

热点推荐