Struts2框架优缺点.docx

上传人:b****3 文档编号:2151164 上传时间:2022-10-27 格式:DOCX 页数:33 大小:524.75KB
下载 相关 举报
Struts2框架优缺点.docx_第1页
第1页 / 共33页
Struts2框架优缺点.docx_第2页
第2页 / 共33页
Struts2框架优缺点.docx_第3页
第3页 / 共33页
Struts2框架优缺点.docx_第4页
第4页 / 共33页
Struts2框架优缺点.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

Struts2框架优缺点.docx

《Struts2框架优缺点.docx》由会员分享,可在线阅读,更多相关《Struts2框架优缺点.docx(33页珍藏版)》请在冰豆网上搜索。

Struts2框架优缺点.docx

Struts2框架优缺点

IloveyouIloveyou

Iloveyou

Iloveyou

本文介绍了java开发流行框架struts2以及webwork的一些安全缺陷,并举例说明框架本身以及开发人员使用

框架时,所产生的种种安全问题,以及作者挖掘框架安全漏洞的一些心得体会。

推荐以下人群阅读

了解java开发

了解框架开发

了解webapplication安全

“网络安全爱好者”

正文

当前java开发网站,通常不会是纯JSP的,大都使用了javaframework。

有了这些framework,让开发人员更加快速的开发出代码,也让代码非常具有可扩展性,那些分层架构的思想,

更是深入人心。

这些也大大影响了安全代码审核,曾提出“分层审核代码”的思想,比如在DAO层专门检查

sql注入,在view层检查xss等。

这些框架都有自己的层级,本次文章主要讲的是struts这个框架的相关

安全问题,也会有小部分涉及到struts后面的DAO层。

而struts这个框架更新占有市场份额极大的一个框架,它在各个层级中,位于如图所示位置:

可以看到struts在web应用中,负责处理接收用户数据,调用业务处理,以及展示数据的工作。

所以本文把

struts的功能分为controller层和view层,controller层来完成接收用户数据,分发用户请求,而view专门

用于展示数据。

一个单独的struts,是不合逻辑的,因为架构师通常喜欢多种框架集合,让它们各自负责某一层的处理。

研究一个框架的安全问题,不能仅仅站在框架的角度,还应该充分考虑到开发人员是如何使用这些框架的,

他们最喜欢写什么样的代码,这样才能还原一个正常的、完整的web应用场景。

从搜索结果看,互联网中,绝大多数教程推荐struts+hibernate+spring这样的黄金组合,那么,我假设有

一个应用使用了这个组合,以struts为重点,站在攻击者的角度,层层分析struts的设计缺陷。

Struts2开发回顾与简单学习

为了让大家回顾或者学习一下struts2,我们一起来建立一个action、jsp页面,做一个接收用户输入,之后

处理一下,再展示出来给用户的过程,精通struts2的同学可以跳过此步。

-------------------------------------struts回顾start

首先建立action,叫做AaaaAction:

publicclassAaaaActionextendsActionSupport{

privateStringname;

publicStringgetName(){

returnname;

}

publicvoidsetName(Stringname){

this.name=name;

}

publicStringexecute(){

System.out.println("exe");

returnSUCCESS;

}

publicStringbbb(){

System.out.println("bbbbb");

returnSUCCESS;

}

}

请注意execute这个方法,让用户输入action的地址后,默认会访问这个方法。

之后配置struts.xml文件

user/aaa.jsp

配置这个文件后,当用户输入

的时候,struts会负责让AaaaAction中的execute方法处理用户请求。

处理之后,该方法返回“returnSUCCESS;”,struts又负责找到result的name是seccuess所指向的jsp页面。

把该页面解析后,返回给用户。

而用户看到的就是aaa.jsp页面的html代码。

struts2继承了webwork的所有优点,其实等于是webwork的升级,如果开发人员想让用户直接访问action中的

某方法,而不是访问默认的execute方法,只要定义一个方法叫做bbb,并且是public的,用户就可以直接输入

直接访问了bbb方法。

那request中的参数如果接收呢?

struts2中,这个过程被包装了起来,使用非常方便,只要在action中定义

一个属性,叫做publicStringname;。

然后加入getName和setName方法,就可以像正常使用属性一样,接收到

用户传递过来的变量。

无论是get请求还是post请求,都可以使用这种方式接收用户输入。

整个过程就如此简单,现在大家对流程有了了解,我们就开始讨论正文,如果还是想了解更多,请自行google。

----------------------------------struts回顾end

Struts2安全缺陷

可以看到struts2在数据流向方面,有两个重点,一个是进入(in),一个是输出(out)。

而我在做漏洞

挖掘的思路,也是跟着这个数据的流程,开始分析的,下面我们就开始让数据进入。

Action属性默认值可以被覆盖缺陷:

在日常的java项目中,我们经常会遇到保存一个新的对象(比如注册一个用户),然后给这个对象赋予一些

用户提交上来的属性值,在这里,只需要定义一个对象类:

publicclassUser{

privateLongid=0l;

privateStringname;

privateStringpass;

privateIntegertype=1;

下面的get和set方法代码略

}

定义后,在action中,添加一个属性

Userreguser;

用户注册的页面代码如下:

当用户提交这个form到action中后,struts2会负责自动映射reguser.name的值到reguser的相关属性(name)

中,所以在execute这个方法中,就可以使用reguser.getName()拿到用户提交的reguser.name的值。

所以我们

下面的代码就很简单了:

publicStringexecute(){

add(user);

add方法,更简单了,因为我们项目中集成了hibernate,这个框架自动映射user类中的各个属性,自动组成

insert语句。

我们只要在add中调用session.save(user);就可以保存用户到数据库中。

前文提到那么多“简单”两个字,难道这些过程都是安全的而他给我们仅仅带来了方便么?

struts2只负责映射所有对象,他提供了form验证,也只能验证form中属性值的内容,比如email格式等,

并不能约束用户提交其他属性上来,于是这就变成了十分危险的功能。

当User中有个属性type,代表User是否管理员时(1为普通用户,2为管理员),麻烦来了,攻击者在原来的

注册表单中,新加入一个input,叫做

然后输入值是2,把这个值一起交给action。

在这个流程中,这个值,当然也会被自动带到数据库中,向下

处理的逻辑中,这个用户,就已经变成管理员了。

当你看到了一个struts2或者webwork的应用,可以尝试使用属性攻击,修改当前表单,里面有所有你猜测到

的属性,一并提交上来,就可能会影响整个逻辑,达到攻击目的。

文中仅仅是一个例子,事实上,在数据传递

的过程中,可以任意覆盖数据的默认值,本来就是一个危险的缺陷,而struts2和webwork这两个框架仅仅看到

了它带来的好处,忽略了这方面基于安全性的考虑,仅仅关注了用户提交数据的正确性。

对比在没有struts2

这个功能的时候,我们却需要在action中一个一个的把需要的变量,从用户提交的request中解出来,一个一个

处理,不可能出现这种安全问题。

现在它包装了这个过程,自以为很方面,却出了严重问题。

Action中的方法被暴力猜解缺陷

前文提到,有一种方法可以让用户访问action时,不访问默认的execute方法,而是直接访问其他action中

的方法,条件是在action中,写一个public的方法。

开发人员如果需要做一个登陆后,展示所有用户列表的

功能,而他的一个“解耦合”的开发习惯,将在这里导致安全缺陷。

定义一个如下的action

publicclassUserloginextendsActionSupport{

privateStringuname="";

privateStringupwd;

privateListlist;

//getterandsetter方法略

publicStringlogin(){

if(uname!

=null&&upwd!

=null&&uname.equals("kxlzx")&&upwd.equals("pass"))

{//ifloginsuccess

returnlist();

}

returnfalse;

}

publicStringlist(){

list.add("kxlzx");list.add("kxlzx1");list.add("kxlzx2");list.add("kxlzx3");

return"list";

}

}

Userlogin中,因为list这个功能(显示所有用户列表),其实是一个通用的功能,很容易被其他地方调用,

所以开发人员把它单独写成了一个方法。

当用户登陆的时候,打开

来到了用户的登陆页面,可以看到,只有用户输入正确的用户名和密码,才能最终调用list()方法,显示结果。

但是struts2把所有public的方法都暴露了出去,导致现在用户输入了

用户访问这个链接后,struts2调用list方法,然后返回结果给用户,所以没有登陆,就显示了所有用户信息,

直接绕过了login中的登陆验证。

在没有struts2的时候,我们要在servlet的doget或者dopost方法中,写if判断等代码,才能让用户调用其他

servlet中的方法,现在看来其实这也是一种保护措施。

而现在struts2为了方便开发,把所有的public方法

统一映射了出去,导致开发把一个经常使用的功能,习惯写成一个public的方法,现在居然成了严重漏洞。

struts2的action属性设计缺陷

再回头看看我们在action中的属性定义,你会发现,现在他们都成了漏洞,因为struts2规定属性的get和

set方法,都必须是public的。

那么我们定义了

privateStringname;

publicStringgetName(){

returnname;

}

publicvoidsetName(Stringname){

this.name=name;

}

这段代码的时候,实际上,是写了两个public的方法。

那这两个表面上

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1