没有合适的资源?快使用搜索试试~ 我知道了~
详细说明了 struts2的一些安全缺陷,可以让开发者,在学习和开发时,避免安全的漏洞。
资源详情
资源评论
资源推荐
正文
当前 java 开发网站,通常不会是纯 JSP 的,大都使用了 java framework。
有了这些 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:
public class AaaaAction extends ActionSupport{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String execute(){
System.out.println("exe");
return SUCCESS;
}
public String bbb(){
System.out.println("bbbbb");
return SUCCESS;
}
}
请注意 execute 这个方法,让用户输入 action 的地址后,默认会访问这个方法。
之后配置 struts.xml 文件
<action name="aaaaaaa" class="net.inbreak.AaaaAction">
<result name="success">user/aaa.jsp</result>
</action>
配置这个文件后,当用户输入
http://www.inbreak.net/app/aaaaaaa.action
的时候,struts 会负责让 AaaaAction 中的 execute 方法处理用户请求。
处理之后,该方法返回“return SUCCESS;”,struts 又负责找到 result 的 name 是 seccuess 所
指向的 jsp 页面。
把该页面解析后,返回给用户。
而用户看到的就是 aaa.jsp 页面的 html 代码。
struts2 继承了 webwork 的所有优点,其实等于是 webwork 的升级,如果开发人员想让用户
直接访问 action 中的
某方法,而不是访问默认的 execute 方法,只要定义一个方法叫做 bbb,并且是 public 的,
用户就可以直接输入
http://www.inbreak.net/app/aaaaaaa!bbb.action
直接访问了 bbb 方法。
那 request 中的参数如果接收呢?struts2 中,这个过程被包装了起来,使用非常方便,只
要在 action 中定义
一个属性,叫做 public String name;。然后加入 getName 和 setName 方法,就可以像正常
使用属性一样,接收到
用户传递过来的变量。无论是 get 请求还是 post 请求,都可以使用这种方式接收用户输入。
整个过程就如此简单,现在大家对流程有了了解,我们就开始讨论正文,如果还是想了解
更多,请自行 google。
----------------------------------struts 回顾 end
Struts2 安全缺陷
可以看到 struts2 在数据流向方面,有两个重点,一个是进入( in ),一个是输出
(out)。而我在做漏洞
挖掘的思路,也是跟着这个数据的流程,开始分析的,下面我们就开始让数据进入。
Action 属性默认值可以被覆盖缺陷:
在日常的 java 项目中,我们经常会遇到保存一个新的对象(比如注册一个用户),然后
给这个对象赋予一些
用户提交上来的属性值,在这里,只需要定义一个对象类:
public class User {
private Long id=0l;
private String name;
private String pass;
private Integer type=1;
。。。下面的 get 和 set 方法代码略
}
定义后,在 action 中,添加一个属性
User reguser;
用户注册的页面代码如下:
<form XXXXXXX>
<input name="reguser.name">
当用户提交这个 form 到 action 中后,struts2 会负责自动映射 reguser.name 的值到 reguser 的
相关属性(name)
中 , 所 以 在 execute 这 个 方 法 中 , 就 可 以 使 用 reguser.getName() 拿 到 用 户 提 交 的
reguser.name 的值。所以我们
下面的代码就很简单了:
public String execute(){
add(user);
add 方法,更简单了,因为我们项目中集成了 hibernate,这个框架自动映射 user 类中的各
个属性,自动组成
insert 语句。我们只要在 add 中调用 session.save(user);就可以保存用户到数据库中。
前文提到那么多“简单”两个字,难道这些过程都是安全的而他给我们仅仅带来了方便么?
struts2 只负责映射所有对象,他提供了 form 验证,也只能验证 form 中属性值的内容,比
如 email 格式等,
并不能约束用户提交其他属性上来,于是这就变成了十分危险的功能。
当 User 中有个属性 type,代表 User 是否管理员时(1 为普通用户,2 为管理员),麻烦来
了,攻击者在原来的
注册表单中,新加入一个 input,叫做
<input name="reguser.type">
然后输入值是 2,把这个值一起交给 action。在这个流程中,这个值,当然也会被自动带
到数据库中,向下
处理的逻辑中,这个用户,就已经变成管理员了。
当你看到了一个 struts2 或者 webwork 的应用,可以尝试使用属性攻击,修改当前表单,
里面有所有你猜测到
的属性,一并提交上来,就可能会影响整个逻辑,达到攻击目的。文中仅仅是一个例子,
事实上,在数据传递
的过程中,可以任意覆盖数据的默认值,本来就是一个危险的缺陷,而 struts2 和 webwork
这两个框架仅仅看到
了它带来的好处,忽略了这方面基于安全性的考虑,仅仅关注了用户提交数据的正确性。
对比在没有 struts2
这个功能的时候,我们却需要在 action 中一个一个的把需要的变量,从用户提交的 request
中解出来,一个一个
处理,不可能出现这种安全问题。现在它包装了这个过程,自以为很方面,却出了严重问
题。
Action 中的方法被暴力猜解缺陷
前文提到,有一种方法可以让用户访问 action 时,不访问默认的 execute 方法,而是直接
访问其他 action 中
的方法,条件是在 action 中,写一个 public 的方法。开发人员如果需要做一个登陆后,展
剩余25页未读,继续阅读
栈木
- 粉丝: 9
- 资源: 9
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0