项目场景:
项目架构:spring+struts2+hibernate
之所以记录为历程不是过程,是因为是第一次修复专业的安测人员检测出来的漏洞,加上前期对于此类漏洞和strust2架构不够深入了解,修复的过程较长,其实做后回想过来,这类问题还是蛮简单的。(慢慢积累吧)
安测人员使用测试工具: Appscan
问题描述:
高危漏洞主要分为两类
测试过程都是从页面的某一个参数从某个位置进行控制(在参数中携带脚本敏感字符)。
推理: 测试结果似乎指示存在脆弱性,因为 Appscan 在响应中成功嵌入了脚本,在用户浏览器中装入页 面时将执行该脚本。
Ⅰ 跨站点脚本编制:
测试请求和响应:
Ⅱ 文件参数 文件参数 Shell 命令注入 命令注入
原因分析:
都是页面参数携带敏感信息,配合脚本通过系统漏洞进行不正常的系统行为。
解决方案:
过滤或者拦截携带脚本关键词。
经过考虑和实践,最终采用的方法是对页面所有的action方法进行一个全局的拦截。
Struts2 拦截器 Interceptor
拦截器的工作原理如上图,每一个Action请求都包装在一系列的拦截器的内部。拦截器可以在Action执行直线做相似的操作也可以在Action执行直后做回收操作。
每一个Action既可以将操作转交给下面的拦截器,Action也可以直接退出操作返回客户既定的画面。
自定义一个拦截器需要三步:
1 自定义一个实现Interceptor接口(或者继承自AbstractInterceptor)的类。
2 在strutx.xml中注册上一步中定义的拦截器。
strust.xml配置文件如下:(在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈defaultStack。)
<interceptors>
<!-- 定义日志拦截器 拦截form表单提交请求含有关键字-->
<interceptor name="logger" class="com.custle.controller.mp.interceptor.OperatorLogInterceptor"></interceptor>