小知识:Tomcat是Sun的JSWDK(JavaServer Web Development Kit)中Servlet的运行环境(Servlet容器)。Tomcat的源代码被提供给Jakarta项目,在Open Source的模型下进行进一步的开发。Tomcat是一个Server容器,同样的,EJB运行在EJB的容器中。对于初学者来说,可以这样认为:当在一台机器上配置好Apache服务器,可利用它响应对HTML页面的访问请求。实际上Tomcat部分是Apache服务器的扩展,但它是独立运行的,所以当你运行Tomcat时,它实际上作为一个与Apache独立的进程单独运行的。也就是说当配置正确时,Apache为.HTML页面服务,而Tomcat实际上运行.jsp页面和Servlet。
先看看JSP的安全机制。JSP和PHP、ASP等语言的工作机制不一样,虽然它也是一种WEB编程语言,但首次调用JSP文件其实是执行一个编译为Servlet的过程——敏感部位暴露出来了,如果能够让JSP在编译前被浏览器当作一个文本或其它文件发送给客户端,或在JSP装载的时候不去执行编译好的Servlet,而直接读JSP的内容并发送给客户端,会出现什么问题呢?
对于Tomcat这样公布源代码的程序,若有更多的人使用并研究其代码,则可以找到并修补愈多的安全漏洞。但是,对从来不修补漏洞的人们来说,我就可以利用这些漏洞,做我喜欢做的事情了。
前一段时间应朋友之邀,我对他们托管的三台主机进行了测试,其中两台为Linux,一台为Windows系统,在路由器后面还有一台Cisco PIX 525对三台主机进行保护,只允许外部用户连接不同主机的部分端口,例如80,25,110。根据检测,Cisco PIX防火墙过滤规则设置比较严密,没有多余端口允许外部用户访问。细致分析后,发现目标网络的主机通过地址转换来提供对外访问,内部使用192.168.*.*地址段。先找个扫描软件来看看主机的安全情况。
我找来了X-Scan,在外部对这几台主机进行了端口扫描之后,生成了一份关于端口的报表,发现其中有一个Tomcat服务器,解释的自然就是JSP文件了。
尝试一下通过WEB服务进行间接***。首先检查TCP/80端口的服务,发现新闻搜索的功能是由端口8080提供的,输入http:// ;202.103.*.168:8080/之后,得到了一个系统管理登录页面,简单地测试一下,输入test/test作为用户名/口令,似乎认证成功,但实际上并不能进入下一个页面。彷徨之间,我进行了JSP大小写的测试,因为JSP对大小写是敏感的,Tomcat只会将小写的JSP后缀的文件当作是正常的JSP文件来执行,如果大写了就会引起Tomcat将Index.jsp当作是一个可以下载的文件让客户下载。经过测试发现这个方法无效,可能管理员已经在服务器软件的网站上下载了最新的补丁。
找了一个朋友的JSP空间,仔细研究后发现大部分的JSP应用程序在当前目录下都会有一个WEB-INF目录,这个目录通常存放的是JavaBeans编译后的Class 文件,如果不给这个目录设置正常的权限,所有的Class就会曝光。而采用JAD软件对下载的Class文件反编译后,原始的Java文件甚至变量名都不会改变。如果网页制作者开始把数据库的用户名密码都写在了Java代码中,反编译后,说不定还能看到数据库的重要信息。那么,怎么得到这些文件呢?思考中……
Tomcat版本的缺省/admin目录是很容易访问的,不知道这个粗心大意的管理员是否做了相关处理。输入:http://202.103.*.168/admin/,管理员目录赫然在列。之后,我看到了“Tomcat WEB Server Administration Tool”的页面,默认情况下,他们的“User Name”应该是admin,“Password”应该是空,输入用户和密码后,并点击“Login”按钮,不能进入,陆续使用了几个比较常见的密码,也无济于事。
默认情况下,Tomcat打开了目录浏览功能,在对多个Resin或Tomcat服务器站点的测试中,我都碰到过管理员忽视这个问题的情况。