当前位置: 代码迷 >> Java Web开发 >> AppScan - web安全有关问题
  详细解决方案

AppScan - web安全有关问题

热度:459   发布时间:2016-04-17 01:02:31.0
AppScan -- web安全问题
首先简单描述一下系统情况:采用的技术struts1.2,EJB3.0,另外公司以前封装了一套jsp标签;应用服务器jboss4.0.2;数据库为SQL Server2005。
目前我还有2类问题还没有解决—1:会话标识未更新
  2:发现数据库错误模式
希望有解决过此类问题的大虾们,能给予一点帮助!
再次先行谢过!!



系统将近验收的时候,对方发过来一份安全报告- -我们开发的系统有安全漏洞,让我们把漏洞级别为严重的全部解决,否者不予验收。对于这些问题,公司其它项目组包括我都没有人曾经做过(也就是说系统从开始打框架到后来的开发过程没有任何人注意这些问题)。此时脑海浮现一句较为经典的网语“内事问baidu,外事问google…”。经过几天的搜索,简单描述一下我对以下几个安全问题的理解:
1发现数据库错误模式:主要是一些数据连接错误信息,通过提交特殊构造的字符,程序会暴露一些数据库信息,也容易引起SQL注入攻击。
2会话标识未更新:是cookies过期时间未设置,可能会引发一些cookies欺骗攻击。
3跨站点请求伪造:这个是高级攻击技术,是黑客作为中间人攻击,这个漏洞是程序造成的,在不同的会话中两次发送同一请求并且收到相同的响应,也就是说客户端与服务端建立连接后,客户端向服务端提交数据,服务端只认客户端需要什么而返回什么内容给客户端,并没有对客户端的身份进行认证。
4不充分帐户封锁:程序没有使用锁定功能,可以穷举密码。
5跨站点脚本编制:实际翻译应该是跨站脚本攻击。也就是XSS,是服务端没有对客户端提交的参数进行过滤,例如:2009>%22%27><img%20src%3d%22javascript:alert(473443)%
22>,这个就会弹出一个窗口,还可以弹出其他页面,或者做页面跳转等攻击,通常攻击者用来挂马。
6 SQL 盲注也是要对参数进行过滤,包括危险字符,‘,;@,==,而且通过cookies提交的值也要进行过滤。


以下内容是我解决这些问题的过程
首先找了个IBM Rational AppScan 7.8的破解版装上
(一) 既然http访问有问题安全,那么我换个安全点的https试了试,结果发现严重级别的没有减少,反而严重程度为一般的倒是增加了好几类,晕!
(jboss4.0.2配置https服务的步骤在压缩文件里面)
(二) 对于sql盲注有一下2种情况
1:http://172.16.200.219:9090/project/projectmemberaction.do (2)
  code
  name
2:http://172.16.200.219:9090/system/orgbaseinfoaction .do (3)
  TcnSystemOrgDto.code
  TcnSystemOrgDto.fullname
  TcnSystemOrgDto.addrss
[(2)(3)分别表示该链接下面漏洞注入的个数]
我针对安全扫描的提示,逐个修改了对数据库列表及查询的操作,使其全部采用prepareStatement预编译的方式。因为系统涉及到的页面太多,对于用户输入框的过滤就不可能一个一个的去修改,因此我写了个filter
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * <filter>
<filter-name>SQLFilter</filter-name>
<filter-class>com.ebuilds.aas.SqlInjection</filter-class>
<init-param>
<param-name>sqlkey</param-name>
<param-value> '|exec|execute|insert|create|drop|table|having|user|%20|union|where|select|delete|update|count|*|document.cookie|xp_cmdshell|&#39|chr|mid|master|truncate|char|declare|or |;|--|,|%20and%20|%20or%20|//|/|%|#|script|<img|%3cimg </param-value>
</init-param>
</filter>
 * 
 * <filter-mapping>
<filter-name>SQLFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>SQLFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
 */
public class SqlInjection implements Filter {
protected FilterConfig filterConfig;
protected String encodingName;
protected String sqlkey = null;
public void init(FilterConfig filterConfig) throws ServletException{
this.filterConfig = filterConfig;
this.sqlkey = filterConfig.getInitParameter( "sqlkey" ); }

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httprequest = (HttpServletRequest) request;
HttpServletResponse httpresponse = (HttpServletResponse) response;
//用于的使 Browser 不缓存页面的过滤器
httpresponse.setHeader("Cache-Control","no-cache");  
httpresponse.setHeader("Pragma","no-cache");  
httpresponse.setDateHeader ("Expires", -1);  


List<String> list=new ArrayList<String>();