# 攻击JavaWeb应用[1]-JavaEE 基础

Author: 乌云历史资料库 (@wooyun_archive)
Published: 2013-07-04T10:46:00Z
Canonical: https://wepostx.com/topics/577

> 乌云历史资料归档
>
> **原始作者：** iswin
> **原始编号：** superkieran-wooyundrops:35
> **原始发布时间：** 2013-07-04 18:46
> **声明：内容仅用于技术研究和个人使用，版权归 wooyun.org。**

---

### 0x00 JavaEE 基础

JSP: 全名为java server page，其根本是一个简化的[Servlet](http://baike.baidu.com/view/25169.htm)。
Servlet：Servlet是一种服务器端的Java应用程序，可以生成动态的Web页面。
JavaEE: JavaEE是J2EE新的名称。改名目的是让大家清楚J2EE只是Java企业应用。
什么叫Jsp什么叫Java我真的非常让大家搞清楚！拜托别一上来就来一句：“前几天我搞了一个jsp的服务器，可难吭了。”。
请大家分清楚什么是jsp什么是JavaEE! Java平台结构图：

![原文图片](/media/2016/06/17e4e054cabee4a86fbe5d09ab1f6a86)

可以看到Java平台非常的庞大，而开发者的分化为：

![原文图片](/media/2016/06/a696b9eee1c47705ee246c11202ea192)

列举这两个图的原因就是让你知道你看到的JSP不过是冰山一角，Jsp技术不过是Java初级开发人员必备的技术而已。
我今天要讲的就是Java树的最下面的两层了，也是初级工程师需要掌握的东西。
Web请求与相应简要的流程：

![原文图片](/media/2016/06/226767742aa01d9240c58b37d63a10e9)

这是一个典型的就是客户端发送一个HTTP请求到服务器端，服务器端接收到请求并处理、响应的一个过程。
如果请求的是JSP，tomcat会把我们的JSP编译成Servlet也就是一个普通的Java类。
其实JSP是Servlet的一种特殊形式，每个JSP页面就是一个Servlet实例。Servlet又是一个普通的Java类它编译后就是一个普通的class文件。
这是一个普通的jsp脚本页面，因为我只用JSP来作为展示层仅仅做了简单的后端数据的页面展示：

![原文图片](/media/2016/06/aca76a95fc5666537f2e591cf1130f8f)

上图可以非常清晰的看到通常的Jsp在项目中的地位并不如我们大多数人所想的那么重要，甚至是可有可无！因为我们完全可以用其他的东西来代替JSP作为前端展示层。 我们来看一下这个页面编译成class后是什么样子：

![原文图片](/media/2016/06/3340545efb369b8ec92ea0f7ce769340)

你会发现你根本就看不懂这个class文件，因为这是字节码文件我们根本就没法看。通过我们的TOMCAT编译后他编程了一个Java类文件保存在Tomcat的work目录下。
文件目录：C:\apache-tomcat-7.0.34\work\Catalina\localhost\你的项目名\org\apache\jsp

![原文图片](/media/2016/06/36ba79820e123947c21d766f4ff51472)

我们只要打开index_jsp.java或者用jd-gui（Java反编译工具）打开就行了：

![原文图片](/media/2016/06/78bebe31f64b577a88b4cceb7ba7fc5a)

有人说这是Servlet吗？当然了。

![原文图片](/media/2016/06/ce9dae640f84fb2705d6d310ec42b1f7)

继承HttpJspBase类，该类其实是个HttpServlet的子类(jasper是tomcat的jsp engine)。
Jsp有着比Servlet更加优越的展现，很多初学PHP的人恐怕很难把视图和逻辑分开吧。比如之前在写PHPSQL注入测试的DEMO：

![原文图片](/media/2016/06/628a3cf4a2794c9ef301351bca82b227)

这代码看起来似乎没有什么大的问题，也能正确的跑起来啊会有什么问题呢？原因很简单这属于典型的展现和业务逻辑没有分开！这和写得烂的Servlet差不多！
说了这么多，很多人会觉得Servlet很抽象。我们还是连创建一个Servlet吧：

![原文图片](/media/2016/06/94a3017bb56951f76b3778c649a3d13c)

创建成功后会自动的往web.xml里面写入：

![原文图片](/media/2016/06/9f33d170d701e8e508ab1de681e942da)

其实就是一个映射的URL和一个处理映射的类的路径。而我们自动生成的Java类精简后大致是这个样子：

![原文图片](/media/2016/06/26a04eb9f86862088fe59e0f31ee91c8)

请求响应输出内容：

![原文图片](/media/2016/06/a328fa79e87db8862f3f4a4273f5dcc6)

熟悉PHP的大神们这里就不做解释了哦。了解了Jsp、Servlet我们再来非常简单的看一下JavaWeb应用是怎样跑起来的。
加载web.xml的配置然后从配置里面获取各种信息为WEB应用启动准备。

#### 科普： C:\apache-tomcat-7.0.34\webapps 下默认是部署的Web项目。webapps 下的文件夹就是你的项目名了，而项目下的WebRoot一般就是网站的根目录了，WebRoot下的文件夹WEB-INF默认是不让Web访问的，一般存在配置泄漏多半是nginx配置没有过滤掉这个目录。

![原文图片](/media/2016/06/75467b1054106d10be3fdda33909e959)

![原文图片](/media/2016/06/b5618ea50cad617b95e0c59366457f86)

快速定位数据库连接信息：
大家可能都非常关心数据库连接一般都配置在什么地方呢？
答案普遍是：C:\apache-tomcat-7.0.34\webapps\wordpress\WEB-INF下的***.xml
大多数的Spring框架都是配置在applicationContext里面的：

![原文图片](/media/2016/06/f171949b5425c3fd1f7f05f6b9eb6992)

如果用到Hibernate框架那么：WebRoot\WEB-INF\classes\hibernate.cfg.xml

![原文图片](/media/2016/06/f0e2c8e6c3c02e58f8f1bc786f17ca00)

还有一种变态的配置方式就是直接卸载源代码里面:

![原文图片](/media/2016/06/3c7bf6b7268820551b7380d067098f07)

Tomcat的数据源（其他的服务器大同小异）：
目录：C:\apache-tomcat-7.0.34\conf\context.xml、server.xml

![原文图片](/media/2016/06/a7237ebf80a430e95588ab761b866e47)

![原文图片](/media/2016/06/c29dca313d09f105b5a6556f2a1ecd92)

Resin数据源：
路径：D:\installDev\resin-pro-4.0.28conf\resin.conf(resin 3.x是resin.xml)
其他的配置方式诸如读取如JEECMS读取的就是.properties配置文件，这种方式非常的常见：

![原文图片](/media/2016/06/b5bb7d088d98bb5606d21f18800d6256)

### 0x01 Tomcat 基础

![原文图片](/media/2016/06/970174cfd5e31a5a9c429581d567cdbb)

没错,这就是 TOM 猫。楼主跟这只猫打交道已经有好几年了,在 Java 应用当中 TOMCAT 运用的非常的广泛。
TOM 猫是一个 Web 应用服务器,也是 Servlet 容器。
Apache+Tomcat 做负载均衡:

![原文图片](/media/2016/06/1fb2bd646260154bf1e6dabfe68f00f1)

#### Tomcat快速定位到网站目录：
如何快速的找到tomcat的安装路径:

```text
1、不管是谁都应该明白的是不管apache还是tomcat安装的路径都是随意的，所以找不到路径也是非常正常的。 2、在你的/etc/httpd/conf/httpd.conf里面会有一个LoadModule jk_module配置用于集成tomcat然后找到JkWorkersFile也就是tomcat的配置，找到.properties的路径。httpd里面也有可能会配置路径如果没有找到那就去apache2\conf\extra\httpd-vhosts看下有没有配置域名绑定。 3、在第二步的时候找到了properties配置文件并读取，找到workers.tomcat_home也就是tomcat的配置路径了。 4、得到tomcat的路径你还没有成功，域名的具体配置是在conf下的server.xml。 5、读取server.xml不出意外你就可以找到网站的目录了。 6、如果第五步没有找到那么去webapps目录下ROOT瞧瞧默认不配置的话网站是部署在ROOT下的。 7、这一点是附加的科普知识爱听则听：数据库如果启用的tomcat有可能会采用tomcat的数据源配置未见为conf下的context.xml、server.xml。如果网站有域名绑定那么你可以试下ping域名然后带上端口访问。有可能会出现tomcat的登录界面。tomcat默认是没有配置用户登录的，所以当tomcat-users.xml下没有相关的用户配置就别在这里浪费时间了。 8、如果配置未找到那么到网站目录下的WEB-INF目录和其下的classes目录下找下对应的properties、xml（一般都是properties）。 9、如果你够蛋疼可以读取WEB.XML下的classess内的源码。 10、祝你好运。
```

#### apache快速定位到网站目录：
普通的域名绑定：
直接添加到confhttpd.conf、confextrahttpd-vhosts.conf

#### Resin快速定位到网站目录:
在resin的conf下的resin.conf(resin3.x)和resin.xml(resin4.x)
Resin apache 负载均衡配置(从我以前的文章中节选的)
APACHE RESIN 做负载均衡,Resin 用来做 JAVAWEB 的支持,APACHE 用于处理静态
和 PHP 请求,RESIN 的速度飞快,RESIN 和 apache 的配合应该是非常完美的吧。
域名解析:
apache 的 httpd.conf:

![原文图片](/media/2016/06/e8380c0b7ffed40b716f4d9b385fe750)

需要修改:Include conf/extra/httpd-vhosts.conf(一定要把前面的#除掉,否则配置不起作用)
普通的域名绑定:
直接添加到 httpd.conf

```text
<VirtualHost *:80> ServerAdmin [email protected] DocumentRoot E:/XXXX/XXX ServerName beijingcanyinwang.com ErrorLog E:/XXXX/XXX/bssn-error_log CustomLog E:/XXXX/XXX/bssn_log common </VirtualHost>
```
二级域名绑定,需要修改:

```text
E:\install\apache2\conf\extra\httpd-vhosts.conf
```
如:

```text
<VirtualHost *:80> DocumentRoot E:/XXXXXXX/XXX ServerName bbs.beijingcanyinwang.com DirectoryIndex index.html index.php index.htm </VirtualHost>
```

![原文图片](/media/2016/06/e4eed8388c096cccb7743a853f212bfe)

Resin 的

![原文图片](/media/2016/06/06b418779acdfb6d994bcbd866a9a4d9)

请求处理:

```text
<LocationMatch (.*?).jsp> SetHandler caucho-request </LocationMatch> <LocationMatch (.*?).action> SetHandler caucho-request </LocationMatch> <LocationMatch union-resin-stat-davic> SetHandler caucho-request </LocationMatch> <LocationMatch stat> SetHandler caucho-request </LocationMatch> <LocationMatch load> SetHandler caucho-request </LocationMatch> <LocationMatch vote> SetHandler caucho-request </LocationMatch>
```
APACHE 添加对 Resin 的支持:

![原文图片](/media/2016/06/81f5f685bafb357d4942624810cfd043)

```text
LoadModule caucho_module "E:/install/resin-pro-3.1.12/win32/apache-2.2/mod_caucho. dll"
```
然后在末尾加上:

```text
<IfModule mod_caucho.c> ResinConfigServer localhost 6800 CauchoStatus yes </IfModule>
```
只有就能让 apache 找到 resin 了。
PHP 支持问题:
resin 默认是支持 PHP 的测试 4.0.29 的时候就算你把 PHP 解析的 servlet 配置删了一样解析 PHP,无奈换成了 resin 3.1 在注释掉 PHP 的 servlet 配置就无压力了。

![原文图片](/media/2016/06/575fa0e51543a65f75a0ab78bf848a84)

整合成功后:

![原文图片](/media/2016/06/30fc1f520e54d7e6f43cc1734b45a10b)

## Replies
