struts2 实验报告
Struts2漏洞测试书面报告

Struts2漏洞测试书⾯报告Struts2 漏洞测试报告信息化建设处2016年6⽉15⽇Struts2 漏洞测试报告0.前期⼯作准备前期的⼯作主要围绕以下⼏个⽅⾯进⾏:分析从2014年以来Struts2官⽅所披露的⼏个⾼危/重要漏洞的版本号、形成的原因、影响的范围以及修复的建议。
了解乌云知识库⾥对相关漏洞原理的分析对学校218和216⽹段的所有开启“Apache Tomcat/Coyote JSP”服务的IP进⾏扫描,并根据服务器所属的业务,对⽬标IP进⾏分类处理。
0.1Struts2重要漏洞的类型纵观2014年以来Struts2官⽅所披露的各种漏洞,归纳起来,主要有3种类型:“classLoader导致特定环境下的DOS漏洞”、“开启DMI导致的远程代码执⾏漏洞”和“使⽤REST插件导致的远程代码执⾏漏洞”。
本次测试根据此3种类型,选取具有代表性的⼏个重要漏洞进⾏分析。
S2-037[1]:2016年6⽉16⽇,乌云漏洞报告平台,报告了⼀份最新的S2-037漏洞(官⽅⽹站仍未正式更新)。
主要原因是使⽤REST插件导致的远程代码执⾏漏洞,受影响的版本号为2.3.20-2.3.28.1。
S2-032[2]:2016年4⽉21⽇Struts2官⽅发布S2-032漏洞,评级为⾼。
主要原因是在开启动态⽅法调⽤(Dynamic Method Invocation,DMI)的情况下,会被攻击者实现远程代码执⾏攻击,受影响的版本号为2.3.18-2.3.28 ( 2.3.20.2和2.3.24.2除外)。
S2-021/S2-020[3][4]:2014年左右频繁爆发的漏洞类型主要是“classLoader导致特定环境下的DOS漏洞”,受影响的版本号为2.0.0 - 2.3.16.1。
0.2Nmap扫描结果与分类在分析测试之前,由于没有218和216段服务器的相关资料,为了避免盲⽬地进⾏测试,因此,选⽤nmap⼯具,对218和216段(⼀共512个IP)进⾏扫描,从⽽得到所有开启“Apache Tomcat/Coyote JSP”服务的IP地址。
实验报告3 (2)

实验2 Struts2类型转换(2学时)题目/任务1.掌握基于OGNL的类型转换。
2.掌握基于OGNL表达式对于Map集合的转换。
难度系数知识点说明/训练要点1.基于OGNL的类型转换。
2.基于OGNL表达式对于Map集合的转换。
实现效果1、运行结果:a)基于OGNL的类型转换:b)基于OGNL表达式对于Map集合的转换实现步骤1、搭建环境。
◆将当前目录下,环境工程包内StrutsDemo20文件导入到eclipse中。
2、进行实验。
在edu.zb.entity包下有一个User实体类,User里有userName、password、age属性。
并且已添加set、get方法以及有参和无参的构造方法,并且重写了toString()方法。
◆基于OGNL的类型转换:●打开edu.zb.action包下的loginAction类,添加一个User类型的user属性。
并添加set、get方法。
●打开WebContent目录下的login.jsp页面,将第一个“<s:textfield>”标签里的name和id属性改为“erName”。
●将第二个“<s:textfield>”标签里的的name和id属性改为“user.age”。
●将“<s:password>”标签里的name和id属性改为“user.password”。
●打开WebContent目录下的index.jsp页面,在body使用ValueStack对象实现获取引用的过程:调用request的getAttritube(“struts.valueStack”)方法,返回ValueStack类型的对象,命名为vs,然后跳跃vs的findString(“user”)方法获得user的相关属性值。
实际代码如下所示:●在第一行里page属性后面添加对相关类的导入。
如下所示:●运行login.jsp,在login、年龄、pass文本框内分别输入”admin”、“20“、”123456 “。
实验六 Struts2 的开发应用

实验六Struts2 的开发应用网络11-2班3110757214 陈宇鹏一、实验目的理解MVC设计模式的基本概念和Java Web开发的两种模式Model1和Model2,以及Struts开发工作流程和基本应用。
二、实验要求1.掌握Struts2.0的开发环境的建立。
2.理解Struts的框架原理。
3.掌握Struts的工作流程。
4.掌握Struts2.0的基本应用。
三、实验内容(一)Struts2的文件上传1.文件上传页面,其中包含两个表单域:文件标题和文件浏览域♦程序功能:上传页面,包含两个表单域。
♦程序源码:upload.html<html xmlns="/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=GBK" /><title>简单的文件上传</title></head><body><form action="upload.action" method="post" enctype="multipart/form-data">文件标题:<input type="text" name="title" /><br>选择文件:<input type="file" name="upload" /><br><input value="上传" type="submit" /></form></body></html>2.处理上传请求的Action类程序源码:UploadAction.javapublic class UploadAction extends ActionSupport{private String title;private File upload;private String uploadContentType;private String uploadFileName;//接受依赖注入的属性private String savePath;//接受依赖注入的方法public void setSavePath(String value){this.savePath = value;}private String getSavePath() throws Exception{return ServletActionContext.getRequest().getRealPath(savePath);}public void setTitle(String title) {this.title = title;}public void setUpload(File upload) {this.upload = upload;}public void setUploadContentType(String uploadContentType) { this.uploadContentType = uploadContentType;}public void setUploadFileName(String uploadFileName) {this.uploadFileName = uploadFileName;}public String getTitle() {return (this.title);}public File getUpload() {return (this.upload);}public String getUploadContentType() {return (this.uploadContentType);}public String getUploadFileName() {return (this.uploadFileName);}@Overridepublic String execute() throws Exception{System.out.println("开始上传单个文件-----------------------");System.out.println(getSavePath());System.out.println("==========" + getUploadFileName());System.out.println("==========" + getUploadContentType());System.out.println("==========" + getUpload());//以服务器的文件保存地址和原文件名建立上传文件输出流FileOutputStream fos = new FileOutputStream(getSavePath() + "\\" + getUploadFileName());FileInputStream fis = new FileInputStream(getUpload());byte[] buffer = new byte[1024];int len = 0;while ((len = fis.read(buffer)) > 0){fos.write(buffer , 0 , len);}return SUCCESS;}}1.配置文件上传的Action程序源码:Struts.xml<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""/dtds/struts-2.0.dtd"><struts><constant name="struts.custom.i18n.resources" value="globalMessages"/><constant name="struts.i18n.encoding" value="GBK"/><package name="lee" extends="struts-default"><action name="upload" class="lee.UploadAction"><param name="savePath">/upload</param> <result>/succ.jsp</result></action></package></struts>.部署并浏览该页面。
Struts2实践总结

Struts2中的属性驱动和模型驱动Struts2中的属性驱动和模型驱动2Struts2中的异常处理机制ognl表达式Struts2中文件的上传和下载拦截器Struts2中的输入校验Struts2中的类型转换使用Annotation取代struts.xml配置Struts2中文乱码处理Struts2常用标签UI标签的主题设置Struts2与AJAX交互◆驾驭XML数据◆驾驭JSON数据第一个Struts2程序当我们在一个新的工作空间中创建一个Web项目的时候首先要将我们自己的Tomcat绑定到MyEclipse中。
接下来我们可以使用自己安装的JDK,Windows→Preferences→输入Installed JREs建一个Web Project拷struts.xml(可从下载的struts目录下的示例中拷)。
将<struts>标签下的内容都注释掉,这样自己写的时候可供参考。
拷struts2所需要的lib,直接从示例中拷,只需要8个(首字母以c、c、c、f、j、o、s、x 开头,其中的javaassist包一定不能少)查看项目目录在磁盘上的结构:Window→Show View→Navigator在web.xml文件中配置Struts2的核心控制器(直接从示例中拷)下面我们修改struts.xml文件,添加以下配置:<package name="default" namespace="/" extends="struts-default"><action name="hello"><result>/Hello.jsp</result></action></package>我们将原来的index.jsp改名为Hello.jsp,打开该JSP文件(使用MyEclipse JSP Editor打开,不要使用默认的图形编辑器打开,这样速度很慢),适量修改一下页面信息。
实验六 Struts2 Action实验(一)

实验六 Struts2 Action实验(一)
一、实验目的:
熟悉Struts2 Action类的基本用法,掌握Struts2 Action类在MVC程序开发中的编写和应用,初步实现CRUD编程。
二、实验内容:
在MyEclipse环境下运用Struts2技术改写实验四内容,完成相应的数据库CRUD功能,调试运行程序。
三、实验要求:
1. 掌握运用Struts2 开发MVC程序的基本步骤;
2. 掌握Struts2 Action接收请求参数、调用业务逻辑、封装结果数据并转向结果页面的
用法
3. 掌握在struts.xml文件中对Struts2 Action的基本配置;
4. 运用相关技术(Struts2以及JDBC等)完成规定功能;
5. 写出实验报告。
四、实验学时:2学时
五、实验步骤:
1.进入MyEclipse环境,新建一个Web Project;
2. 设计一个数据库,包括出版社表和书籍表,出版社表字段包括序号(自增主键)、出版
社编码和出版社名称,书籍表字段包括序号(自增主键)、书号、书名、作者、价格和出版社;
3. 采用Struts2技术完成出版社基本信息管理模块的主要功能,包括:
3.1 设计封装了出版社表信息的JavaBean;
3.2 设计封装了针对出版社表信息进行CRUD操作的工具JavaBean(DAO类);
3.3 设计并开发页面
3.4 设计并开发Action控制器
3.5. 完成显示所有出版社信息的功能;
3.6. 完成对出版社信息的增加功能;
4. 调试运行程序。
六、选作实验
1. 完成对出版社信息的条件查询功能;
2. 完成对出版社信息的修改和删除功能。
网络工程网络编程实验报告7-struts2程序

《J2EE程序设计与应用开发》实验报告实验序号:07 实验项目名称:struts2程序学号姓名专业、班20网络工程实验地点指导教师实验时间2022一、实验目的及要求1、利用Struts编写用户登录。
二、实验设备(环境)及要求一台Windows XP、JDK1.6、MyEclipse 8.5三、实验内容与步骤四、实验结果与数据处理1、输入相同的账号和密码2、输入不同的账号和密码附源程序清单:1、Login.jsp<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%><html><body><form action="/prj14/login.action" method="post">请您输入账号:<input name="account" type="text"><br>请您输入密码:<input name="password" type="password"><br><input type="submit" value="登录"></form></body></html>2、LoginSuccess.jsp<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%><html><body>登录成功</body></html>3、LoginFail.jsp<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%><html><body>登录失败</body></html>LoginActionpackage prj14;public class LoginAction {private String account;public String getAccount(){return account;}public void setAccount(String account){this.account=account;}private String password;public String getPassword(){return password;}public void setPassword(String password){this.password = password;}public String execute() throws Exception{if(account.equals(password)){return "success";}return "fail";}}6、struts.xml<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "/dtds/struts-2.1.dtd"><struts><package name="struts2" extends="struts-default"><action name="login" class="prj14.LoginAction"><result name="success">/loginSuccess.jsp</result><result name="fail">/loginFail.jsp</result></action></package></struts>。
Struts2综合实验报告

沈阳工学院综合实验验收报告题目:论坛系统的设计与实现院系:信息与控制学院专业:计算机科学与技术班级学号: 11301203 11301103 11301228 学生姓名:韩雨辰赫梓屹田皓指导教师:靳新成绩:2013年 12 月 15 日综合实验论坛系统的设计与实现【开发语言及实现平台或实验环境】Windows系统,JDK,myEclipse开发环境,Tomcat服务器,Struts2、Hibernate开发平台【实验要求和内容】论坛系统是用于用户之间交流的一个信息平台,它是网站开发中很典型的一个例子,通过网上论坛系统的设计和开发掌握Struts2和Hibernate实现的基本功能。
●系统基本功能系统分为前台和后台,分别为用户和管理员提供不同的功能服务,对普通用户来说,系统提供注册、登录、浏览信息、发帖、回贴等功能;对管理员来说,系统提供登录验证、管理帖子、管理用户等功能。
●系统功能模块及介绍论坛系统的设计与实现前台用户模块后台管理员模块用户注册登录模块信息浏览模块发帖回帖模块管理员登录验证模块帖子管理模块管理用户模块图1 系统功能模块图♦前台用户模块(1)用户注册登录模块:为新用户提供填写表单注册成为会员的服务;为已注册的会员提供登录验证的服务,验证成功后就可以登录系统。
(2)信息浏览模块:用户可以浏览帖子列表、详细内容及回帖内容。
(3)发帖回帖模块:已登录的合法用户可以发帖和回帖。
♦后台管理员模块(1)管理员登录验证模块:对管理员的身份进行验证,只有管理员才能登录后台。
(2)帖子管理模块:对帖子提供修改、删除操作。
(3)管理用户模块:提供删除用户的功能。
1 系统分析与设计1.1 需求分析1.1.1 功能性需求开发BBS论坛系统的目的是提供一个供用户交流的平台,为广大用户提供交流经验、探讨问题的社区。
因此,BBS论坛系统最基本的功能首先是发表主题,其次是其他人员根据主题发表自己的看法。
此外,为了记录主题的发表者和主题的加复者信息民,系统还需要提供用户注册和登录的功能。
Struts2全部实验报告

实验时间2015年11月6日19:00时至22:00时学时数 4 1.实验名称实验一:熟悉Struts2核心文件2.实验目的(1)熟悉Struts2的配置文件web.xml和struts.xml。
(2)熟悉如何书写用户定义的控制器。
(3)深刻理解DMI和通配符的使用。
(4)学会struts2接收参数的方法。
3.实验内容(1)将如下页面中登陆和注册的action配置用通配符实现。
(2)理解局部结果和全局结果,学会在struts.xml 中配置全局结果。
(3)实现增加书籍信息的业务处理。
(4)修改管理员登陆后的页面并新写页面addBook.jsp,使得点击添加书籍信息后呈现下面的页面4.实验原理或流程图要求:➢管理员登录后跳到管理员登陆成功的页面➢普通用户登录后跳到普通用户登陆成功的页面➢注册后跳到注册成功的页面➢登录时用户名密码输入错跳到出错页➢注册和登录时用户名,密码没有输入时跳到登陆注册页,并在登陆注册页上显示校验失败的相关提示。
要求如下:➢当输入书名,作者和定价后,要求使用属性驱动、模型驱动或今天新学的接收参数的方法进行参数接收。
➢使用集合模拟数据库。
➢理解chain结果类型,使得增加书籍后马上能将新增书籍的信息显示出来。
呈现出如下的页面:(注意:此处需要学会读取struts2中ValueStack中的内容)5.实验过程或源代码6.实验结论及心得通过本此实验,知道了Action配置采用通配符的方式该如何编写,也会了动态调用Action里面的方法,懂得了全局结果的配置,也会使用了接受参数的方法。
项目名称/login.jsp,查看运行结果。
(3)使用内置校验器进行校验项目3:用户注册验证。
步骤1:register.jsp文件步骤2:Register.java文件步骤3:新建 Register-register-validation.xml文件步骤4:struts.xml文件步骤5:运行程序,URL地址栏中输入http://主机名:端口名称/项目名称/register.jsp,查看运行结果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.系统分析与设计1.1 系统功能描述本系统是个非常简单的注册、登录系统。
本系统的实现是基于Struts2、Spring、Hibernate 三个框架,系统功能单一,业务逻辑简单。
当用户注册信用户时,就是向系统中增加一个新用户,对应的数据库增加一条记录。
当用户输入注册信息时,系统提供了基本的输入验证判断用户输入是否合法,只有当用户输入满足基本输入要求时,才会被提交到实际的登录系统,进行实际的登录处理。
系统还使用了随机产生的图形验证码来防止刷新,防止用户通过单击浏览器的书安心按钮来重复注册多个用户。
系统还提供了一种Ajax方式来验证用户输入的注册名是否有效,系统要求所有的用户名不能重复。
故当用户输完用户名后,系统立即在页面上方提示用户该用户名是否可用,如果系统中没有该用户名,则系统提示该用户名可用;否则提示用户该用户名重复,用户必须重新选择用户名注册。
当用户注册一个新用户名之后,就可以使用系统的登录功能来登录系统了,用户输入登录用的用户名、密码后,系统一样提供了基本的输入校验。
除此之外,系统还采用了随机产生图形验证码来防止恶意用户的暴力破解,系统随机生成一个图形验证码,而用户登录必须输入图形验证码中显示的字符串,只有用户输入的字符串和系统随机生成的验证码字符相同时,系统才允许用户登录。
1.2 系统功能流程1.3 数据库设计相关的映射文件:<hibernate-mapping package = <class name ="User" table ="user_table"> <id name ="id"column ="user_id"><generator class ="identity"</id ><property name ="user"column =nique ="true"/><property name ="pass"column ="user_pass"not-null ="true"length ="50"/><property name ="email"length ="100"/></class ></hibernate-mapping >一旦提供了上面的映射文件,Hibernate 就可以理解User 和user_table 之间的对应关系。
2.系统实现与测试 2.1 系统采用的关键技术MVC 框架采用了Struts2框架,Struts2框架的易用性,极好的简化了系统的MVC 层的实现;本系统使用了Struts2的JSON 插件来完成Ajax 功能,除此之外本系统为了避免进行底层的Ajax 交互,还是用了一个简单Prototype.js 函数库,用以简化Ajax 编程。
Struts2框架的稳定性,为系统的稳定运行提供了保证。
Spring 容器作为系统的Ioc 容器,将系统中所有组件都放在Spring 容器中进行管理,并且充分利用了Spring Ioc 容器的功能,采用依赖注入来管理系统中各组件的依赖关系,避免了各组件之间的硬编码耦合,提高了系统的可扩展性。
借助Hibernate ORM 框架实现系统的持久化,通过Hibernate 的框架帮助,允许上层程序采用面向对象的方式编程,二Hibernate 负责把面向对象的持久化操作转换成JDBC 操作,但Hibernate 的底层操作对开发者完全透明,从而让用户从具体的JDBC 访问中释放出来,无需理会底层的JDBC 数据库访问,而是以面向对象的方式进行持久化操作。
2.2 关键程序流程以注册为例说明:加载类(FilterDispatcher )读取配置(struts 配置文件中的Regist.Action ) 派发请求(客户端发送请求)调用Action (FilterDispatcher 从struts 配置文件中读取与之相对应的Action ) 启用拦截器(WebWork 拦截器链自动对请求应用通用功能) 处理业务(回调RegistAction 的execute()方法)返回响应(通过execute 方法将信息返回到FilterDispatcher )查找响应(FilterDispatcher 根据配置查找响应的是什么信息如:SUCCESS 、ERROER ,将跳转到哪个jsp 页面) 响应用户(jsp--->客户浏览器端显示)2.3 关键代码分析Regist.action 的execute 方法public String execute() throwsException{Map session = ActionContext.getContext().getSession(); String ver2 = (String )session.get("rand");session.put("rand" , null ); if (vercode .equals(ver2)) {if (mgr return }else {return}} else {addActionError("验证码不匹配,请重新输入"); }return "failure";}业务逻辑层:publicint addUser(String user , String pass , String email) throws Exception{ try { User u = new User(); u.setUser(user);userDaoreturn }catche.printStackTrace();thrownew Exception("新增用户时出现异常"); }}publicvoid save(User user){getHibernateTemplate().save(user); }SessionFactory 是Hibernate 的持久化操作的基础对象,是整个数据库经过编辑后的内存镜像,通常对应一个底层数据库。
进行Hibernate 的持久化操作前,必须先完成SessionFactory 的初始化。
本系统通过Spring 容器管理SessionFactory ,从而允许开发人员无需手动管理Hibernate 的SessionFactory 。
代码如下:<bean id ="sessionFactory"class ="org.springframework.orm.hibernate3.Loc alSessionFactoryBean"><property name ="dataSource"ref ="dataSource"/> <property name ="mappingResources"> <list ><value >User.hbm.xml </value ></list > </property ><property name ="hibernateProperties"> <props > <prop key ="hibernate.dialect">><prop key ="show_sql">true </prop ><prop key ="hibernate.hbm2ddl.auto">update </prop ><prop key ="hibernate.jdbc.batch_size">20</prop > </props > </property > </bean >DAO 组件是基于Hibernate 的持久化操作的,因此必须获得SessionFactory 的引用才可以进行持久化操作。
由于系统的DAO 组件将由Spring 容器来管理,而且系统的SessionFactory 也是由Spring 的容器来管理,因此DAO 组件无需显示去的SessionFactory 的引用,而是接受Spring 容器注入即可。
配置如下:<bean id ="userDao"class ="org.reg_erDaoHibernate"><property name ="sessionFactory"ref ="sessionFactory"/> </bean >配置业务逻辑组件所依赖的DAO 组件。
代码如下:<bean id ="mgr"class ="org.reg_erManagerImpl"> <property name ="userDao"ref ="userDao"/> </bean >在Spring 容器中配置了业务逻辑组件后,还必须为业务逻辑方法增加事物控制。
因为用户的业务逻辑方法对应用户的一次业务请求,通常而言,用户的每次业务请求都是逻辑不可分的,一次应该为该方法增加事物控制。
本系统采用Spring 的BeanNameAutoProxyCreator 后处理器完成。
代码如下:<bean id ="transactionManager"class ="org.springframework.orm.hibernate3.HibernateTransactionManager"><property name ="sessionFactory"ref ="sessionFactory"/> </bean ><bean id ="transactionInterceptor"class ="org.springframework.transaction.interceptor.TransactionInterceptor">name ="transactionManager"ref =<property name = <props ><prop key ="get*">PROPAGATION_REQUIRED,readOnly </prop ><prop key ="*">PROPAGATION_REQUIRED </prop ></props ></property ></bean ><bean class ="org.springframework.aop.framework.autoproxy.BeanNameAutoP roxyCreator"><property name ="beanNames"> <list ><value >mgr </value > </list > </property ><property name ="interceptorNames"> <list ><value >transactionInterceptor </value > </list > </property > </bean >由于Struts2的Action 也是由Spring 容器负责管理,因此,必须保证Spring 容器在Web 应用初始化时立即创建。