安全攻击及防范手册.docx

上传人:牧羊曲112 文档编号:1942230 上传时间:2022-12-27 格式:DOCX 页数:39 大小:544.49KB
返回 下载 相关 举报
安全攻击及防范手册.docx_第1页
第1页 / 共39页
安全攻击及防范手册.docx_第2页
第2页 / 共39页
安全攻击及防范手册.docx_第3页
第3页 / 共39页
安全攻击及防范手册.docx_第4页
第4页 / 共39页
安全攻击及防范手册.docx_第5页
第5页 / 共39页
点击查看更多>>
资源描述

《安全攻击及防范手册.docx》由会员分享,可在线阅读,更多相关《安全攻击及防范手册.docx(39页珍藏版)》请在三一办公上搜索。

1、安全攻击及防范手册_版本 1.0 2010年8月1 概述1.1 简介 当今世界,Internet(因特网)已经成为一个非常重要的基础平台,很多企业都将应用架设在该平台上,为客户提供更为方便、快捷的服务支持。这些应用在功能和性能上,都在不断的完善和提高,然而在非常重要的安全性上,却没有得到足够的重视。随着WEB技术应用的范围越来越广泛,WEB技术相关的安全漏洞越来越多的被挖掘出来,而针对WEB站点的攻击已经成为了最流行的攻击途径。 不久前项目管理部对公司内外重点系统进行了一次安全隐患分析测试,并总结出了公司安全测试问题分类及描述的报告文档。本文针对此报告中提到的一些重大安全隐患问题逐一分析,并给

2、出相应的解决方案。1.2 参考资料Java安全性编程实例网站系统安全开发手册企业级Java安全性(构建安全的J2EE应用)2 WEB安全隐患及预防措施2.1 会话标识未更新2.1.1 描述登陆过程前后会话标识的比较,显示它们并未更新,这表示有可能伪装用户。初步得知会话标识值后,远程攻击者有可能得以充当已登录的合法用户。2.1.2 安全级别高。2.1.3 安全风险可能会窃取或操纵客户会话和 cookie,它们可能用于模仿合法用户,从而使黑客能够以该用户身份查看或变更用户记录以及执行事务。2.1.4 解决方案u 不要接受外部创建的会话标识。u 始终生成新的会话,供用户成功认证时登录。u 防止用户操

3、纵会话标识。u 请勿接受用户浏览器登录时所提供的会话标识。u 如果有验证码的。验证码改用application存储。同时记得释放资源2.1.5 技术实现u 登陆界面和登陆成功的界面一致时修改后台逻辑,在验证登陆逻辑的时候,先强制让当前session过期,然后用新的session存储信息。u 登陆界面和登陆成功的界面不一致时在登陆界面后增加下面一段代码,强制让系统session过期。request.getSession().invalidate();/清空sessionCookie cookie = request.getCookies()0;/获取cookiecookie.setMaxAge(

4、0);/让cookie过期 注意:框架2.0已经修改了登陆验证类,登陆成功后会清理掉当前session,重新创建一个新的session。凡是使用框架2.0的项目均可统一增加此功能。2.2 不充分帐户封锁2.2.1 描述程序没有使用锁定功能,可以穷举密码,可以造成蛮力攻击,恶意用户发送大量可能的密码和/或用户名以访问应用程序的尝试。 由于该技术包含大量登录尝试,未限制允许的错误登录请求次数的应用程序很容易遭到这类攻击。2.2.2 安全级别高。2.2.3 安全风险可能会升级用户特权并通过 Web 应用程序获取管理许可权。2.2.4 解决方案请确定允许的登录尝试次数(通常是 3-5 次),确保超出允

5、许的尝试次数之后,便锁定帐户。 为了避免真正的用户因帐户被锁定而致电支持人员的麻烦,可以仅临时性暂挂帐户活动,并在特定时间段之后启用帐户。帐户锁定大约 10 分钟,通常用这样的方法阻止蛮力攻击。2.2.5 技术实现u 提供锁定信息配置类,可根据项目特定需求修改此配置信息。u 修改登陆验证逻辑,根据上面的配置信息提供帐户锁定功能。注意: 框架2.0已经实现了此功能,凡是使用框架2.0的项目均可统一增加此功能。2.3 可预测的登录凭证2.3.1 描述发现应用程序会使用可预期的认证凭证(例如:admin+admin、guest+guest)。 攻击者很容易预测用户名和密码,登录应用程序,从而获取未获

6、授权的特权。2.3.2 安全级别高。2.3.3 安全风险可能会升级用户特权并通过 Web 应用程序获取管理许可权。2.3.4 解决方案不应使用易于预测的凭证(例如:admin+admin、guest+guest、test+test 等),因为它们可能很容易预测,可让用户不当进入应用程序。2.3.5 技术实现只要养成良好的习惯,坚决不使用容易预测的名和密码,即可彻底杜绝此类问题。2.4 登录错误消息凭证枚举2.4.1 描述当试图利用不正确的凭证来登录时,当用户输入无效的用户名和无效的密码时,应用程序会分别生成不同的错误消息。 通过利用该行为,攻击者可以通过反复试验(蛮力攻击技术)来发现应用程序的

7、有效用户名,再继续尝试发现相关联的密码。2.4.2 安全级别高。2.4.3 安全风险可能会升级用户特权并通过 Web 应用程序获取管理许可权。2.4.4 解决方案不论名和密码哪个错误,都提示同样的消息。且同时加上登陆失败次数达到规定的帐户锁定功能。2.4.5 技术实现不论名和密码哪个错误,都提示如下所示同样的消息:一旦某个帐户连续登陆失败次数达到了规定的数值,就会按配置的时间被锁定,如下提示:如此一来,攻击者就没机会穷举帐户和密码了,此类攻击也就不可能发生了! 注意:框架2.0已经实现了此功能,凡是使用框架2.0的项目均可统一增加此功能。2.5 已解密的登录请求2.5.1 描述通过HTTP P

8、OST 发送表单数据,这些数据将在HTTP报文中以明文的形式传输。对于一些敏感的数据(如用户名/密码、信用卡密码)以传统的HTTP报文传输存在巨大的风险。2.5.2 安全级别中。2.5.3 安全风险可能会窃取诸如用户名和密码等未经加密即发送了的用户登录信息。2.5.4 解决方案(1) 饶过AppScan软件扫描(2) 对提交的敏感信息,一律以加密方式传给服务器。(3) 采用基于SSL的HTTPS传输协议,对提交的敏感信息在传输过程中加密。 敏感信息包括:用户名、密码、社会保险号码、信用卡号码、驾照号码、电子邮件地址、电话号码、邮政编码等。注意:如果不是基于SSL的HTTPS传输协议的话。对于提

9、交的敏感信息即使加密后,AppScan软件同样认为该漏洞存在。所以避免这一漏洞的有效方案是饶过扫描或者采用基于SSL的HTTPS传输协议。虽然采取HTTPS传输数据有很高的安全性,但是也有以下几个显著的缺点:u 需要申请一个合法组织颁发的用来加/解密的证书。u 部署、配置繁琐。u 同样的硬件环境,效率比HTTP慢很多。 通过上述分析,采取基于SSL的HTTPS传输协议,付出的代价有点大,是否有必要这样做,值得深入讨论。:把text=password这个用其他的代替,就可以解决已解密的登录请求密  码: js代码function hiddenPass(e) e = e ? e

10、 : window.event; var kcode = e.which ? e.which : e.keyCode; var pass = document.getElementById(password1); var j_pass = document.getElementById(password); if(kcode!=8) var keychar=String.fromCharCode(kcode); j_pass.value=j_pass.value+keychar; j_pass.value=j_pass.value.substring(0,pass.length); 2.5.5

11、 技术实现(1) 饶过AppScan软件扫描绕过软件扫描有两种方式,如下:u 修改密码输入框名字和类型经过不断扫描测试分析,如果密码输入框的名字不包含password、pwd等关键字的话,大部分页面就不会扫描出漏洞。如果还能扫描出漏洞的话,那就在修改密码输入框名字的基础上,把输入框的type的属性值为password的值改为text,然后用Javascript函数来模拟实现星号代替输入值的密码输入效果即可饶过该扫描。示例步骤如下: 在原来的密码输入框前添加一个新的输入控件:如:注:其中document.getElementById(cipher).focus()中 cipher为原来密码输入框

12、的ID值,这个是为了Tab键能起作用而设置的。 修改原来密码框的type属性为text,并添加onkeyup函数如下:其中的code为新添加的输入控件ID。 在页面的head标签中间添加如下样式: 其中code代表新添加的输入控件ID,cipher代表原来密码输入框的ID。样式表的ID必须和控件的ID一致。u 采用AJAX登录 把登陆界面的Form标签去掉,采用AJAX登录。示例代码如下:登陆页面用户: 密码:   记住密码          var request = false;try request = ne

13、w XMLHttpRequest(); catch (trymicrosoft) try request = new ActiveXObject(Msxml2.XMLHTTP); catch (othermicrosoft) try request = new ActiveXObject(Microsoft.XMLHTTP); catch (failed) request = false; function getCustomerInfo() var url = j_acegi_security_check?j_username=+document.getElementById(j_usern

14、ame).value+&j_cipher=+document.getElementById(j_password).value;alert(url+url);request.open(GET, url, true);/调用回调函数request.onreadystatechange = updatePage;request.send(null);function updatePage() if (request.readyState = 4) if (request.status = 200) var response = request.responseText; document.writ

15、e(response); else if (request.status = 404) alert(Requested URL is not found.); else if (request.status = 403) alert(Access denied.); else alert(status is + request.status); (2) 采用基于SSL的HTTPS传输协议 以Weblogic默认配置为例,步骤如下:u 启动Weblogic,进入Console。展开Servers,单击服务器名,在右边的配置栏中,选择常规。在出现的内容中选中已启用SSL监视端口,并配置监视端口,如

16、下图:u 重新启动Weblogic,测试HTTPS协议,测试地址格式示例:https:/IP:端口/ApplicationName2.6 SQL 注入2.6.1 描述随着B/S模式应用开发的发展,使得使用这种模式编写应用程序的程序员也越来越多。但是由于这个行业的入门门槛不高,程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。攻击者可以通过互联网的输入区域,利用某些特殊构造的SQL语句插入SQL的特殊字符和指令,提交一段数据库查询代码(一般是在浏览器地址栏进行,通过正常的www端口访问),操纵执行后端的DBMS查询并获得

17、本不为用户所知数据的技术,也就是SQL Injection(SQL注入)。2.6.2 安全级别高。2.6.3 安全风险可能会查看、修改或删除数据库条目和表。2.6.4 解决方案u 过滤掉用户输入中的危险字符。u 检查用户输入的字段类型,确保用户输入的值和类型(如 Integer、Date 等)有效,且符合应用程序预期。u 屏蔽一些详细的错误消息,因为黑客们可以利用这些消息。u 使用专业的漏洞扫描工具。u 企业要在Web应用程序开发过程的所有阶段实施代码的安全检查。首先,要在部署Web应用之前实施安全测试,这种措施的意义比以前更大、更深远。企业还应当在部署之后用漏洞扫描工具和站点监视工具对网站进

18、行测试。2.6.5 技术实现(1)采用过滤器技术。过滤技术是通过特定过滤函数,去查找每个请求的每个参数对应的值,如果出现了不允许的字符,就会弹出如下提示: 点确定后即可回到请求页面,删除敏感字符即可请求成功!过滤器ParameterFilter.Java代码如下:/* * 参数过滤类,过滤普通表单 */public class ParameterFilter implements Filter private Pattern scriptPattern;private Pattern sqlPattern;private Pattern letterPattern;private String

19、 notProtect = ;private String totalLetter = ;public void destroy() public void doFilter(ServletRequest request, ServletResponse response,FilterChain filtreChain) throws IOException, ServletException HttpServletRequest req = (HttpServletRequest) request;String contentType = request.getContentType() =

20、 null ? : request.getContentType();if (!contentType.startsWith(multipart/form-data)& !FilterUtils.isContainUrl(notProtect, FilterUtils.getFullUrlFromRequest(req) Enumeration params = req.getParameterNames();boolean isSecurity = true;while (null != params & params.hasMoreElements() String para_name =

21、 (String) params.nextElement();String para_value = null;para_value = (String) req.getParameterValues(para_name);for (int i = 0; i para_value.length; i+) String _para_value = para_valuei.toLowerCase();if (scriptPattern.matcher(_para_value).matches()| sqlPattern.matcher(_para_value).matches() isSecuri

22、ty = false;break;if (!isSecurity)break;if (!isSecurity) response.setContentType(text/html; charset=GBK);response.getWriter().write(alert(输入有误,请不要包含+totalLetter+中的任何敏感字符!);history.go(-1););return;filtreChain.doFilter(request, response);public void init(FilterConfig filterConfig) throws ServletExcepti

23、on letterPattern = Ppile(a-z*);String scriptPara = filterConfig.getInitParameter(scriptRegx).toLowerCase();String sqlPara = filterConfig.getInitParameter(sqlRegx).toLowerCase();notProtect = filterConfig.getInitParameter(notProtect);scriptPattern = Ppile(resultStr(scriptPara);sqlPattern = Ppile(resul

24、tStr(sqlPara);totalLetter = scriptPara+|+sqlPara;int index = totalLetter.indexOf();if(index 0)totalLetter = totalLetter.substring(0, index)+totalLetter.substring(index+1);public String resultStr(String oldStr) String newStr = ;if (oldStr != null & !oldStr.equals() String temp = oldStr.split(|);if (t

25、emp.length 0) for (int i = 0; i temp.length; i+) String tempStr = ;boolean isLetter = false;for (int j = 0; j tempi.length(); j+) String str = tempi.substring(j, j + 1);if (letterPattern.matcher(str).matches() tempStr = tempStr+ (%+ parseAscii(str.toUpperCase() + )| + (%+ parseAscii(str)+ )|( + str

26、+ );isLetter = true; else if(str.equals( )| str.equals()str = +str;tempStr = tempStr + (%+ parseAscii(str) + )|( + str+ );isLetter = false;if(isLetter)if (newStr.equals() newStr = newStr + .*(s+)( + tempStr + )(s+).*; else newStr = newStr + |.*(s+)( + tempStr + )(s+).*;elseif (newStr.equals() newStr

27、 = newStr + .*( + tempStr + ).*; else newStr = newStr + |.*( + tempStr + ).*;return newStr;private String toHexUtil(int n)String rt=;switch(n)case 10:rt+=A;break;case 11:rt+=B;break;case 12:rt+=C;break;case 13:rt+=D;break;case 14:rt+=E;break;case 15:rt+=F;break;default:rt+=n;return rt;public String

28、toHex(int n)StringBuffer sb=new StringBuffer();if(n/16=0)return toHexUtil(n);elseString t=toHex(n/16);int nn=n%16;sb.append(t).append(toHexUtil(nn);return sb.toString();public String parseAscii(String str)StringBuffer sb=new StringBuffer();byte bs=str.getBytes();for(int i=0;ibs.length;i+)sb.append(t

29、oHex(bsi);return sb.toString();辅助类如下:public class FilterUtils public static String getFullUrlFromRequest(HttpServletRequest httRequest) String url = httRequest.getRequestURI();String queryString = httRequest.getQueryString();if (null != queryString & !queryString.trim().equals() url = url + ? + queryString;return url;public static boolean isContainUrl(String urlList, String url) boolean isExclude = false;if (null != urlList & !urlList.trim().equals() String resources = urlList.split(,);if (null != resources) for (int i = 0; i = 0) isExclude = true;break;

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号