EEB开发安全安全漏洞修复方案_第1页
EEB开发安全安全漏洞修复方案_第2页
EEB开发安全安全漏洞修复方案_第3页
EEB开发安全安全漏洞修复方案_第4页
EEB开发安全安全漏洞修复方案_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、PAGE49密级:保密 WEB开发安全漏洞修复方案()文档编号:文档名称:WEB开发安全漏洞修复方案编 写:审 核: 批 准:批准日期:技术研究部文档修订记录编号版本号修订内容简述修订日期作者审核1初稿2012-7678910111213141516 TOC o 1-6 h z u HYPERLINK l _Toc8 () PAGEREF _Toc8 h 1 HYPERLINK l _Toc9 背景 PAGEREF _Toc9 h 1 HYPERLINK l _Toc0 FSDP安全漏洞清单 PAGEREF _Toc0 h 1 HYPERLINK l _Toc1 安全漏洞修复方案 PAGERE

2、F _Toc1 h 1 HYPERLINK l _Toc2 会话标识未更新 PAGEREF _Toc2 h 1 HYPERLINK l _Toc3 登录错误消息凭证枚举 PAGEREF _Toc3 h 2 HYPERLINK l _Toc4 不充分帐户封锁 PAGEREF _Toc4 h 2 HYPERLINK l _Toc5 跨站点脚本编制 PAGEREF _Toc5 h 3 HYPERLINK l _Toc6 已解密的登录请求 PAGEREF _Toc6 h 6 HYPERLINK l _Toc7 跨站点脚本编制 PAGEREF _Toc7 h 9 HYPERLINK l _Toc8 通过

3、框架钓鱼 PAGEREF _Toc8 h 13 HYPERLINK l _Toc9 链接注入(便于跨站请求伪造) PAGEREF _Toc9 h 18 HYPERLINK l _Toc0 应用程序错误 PAGEREF _Toc0 h 25 HYPERLINK l _Toc1 SQL注入 PAGEREF _Toc1 h 29 HYPERLINK l _Toc2 发现数据库错误模式 PAGEREF _Toc2 h 38 HYPERLINK l _Toc3 启用了不安全的HTTP方法 PAGEREF _Toc3 h 48 HYPERLINK l _Toc4 发现电子邮件地址模式 PAGEREF _T

4、oc4 h 50 HYPERLINK l _Toc5 HTML注释敏感信息泄露 PAGEREF _Toc5 h 51 HYPERLINK l _Toc6 发现内部IP泄露模式 PAGEREF _Toc6 h 52 HYPERLINK l _Toc7 主机允许从任何域进行flash访问 PAGEREF _Toc7 h 53 HYPERLINK l _Toc8 主机应用软件漏洞修复 PAGEREF _Toc8 h 53 HYPERLINK l _Toc9 目录列表 PAGEREF _Toc9 h 54 HYPERLINK l _Toc0 跨站点请求伪造 PAGEREF _Toc0 h 55 HYP

5、ERLINK l _Toc1 需要注意的问题 PAGEREF _Toc1 h 56 背景随着移动公司对信息安全的进一步加强,要求我们部署的系统必须满足安全扫描要求。本文档描述了安徽移动对FSDP安全扫描的漏洞的解决方案,并作为WEB开发的安全编程规范。FSDP安全漏洞清单见WEB开发安全漏洞清单.xlsx安全漏洞修复方案会话标识未更新URL安全问题描述根据WASC:“会话固定”是一种攻击技术,会强制用户的会话标识变成显式值。固定会话标识值的技术有许多种,会随着目标Web 站点的功能而不同。从利用“跨站点脚本编制”到向Web 站点密集发出先前生成的HTTP 请求,都在这些技术范围内。用户的会话标

6、识固定之后,攻击者会等待用户登录,然后利用预定义的会话标识值来假定用户的联机身份。攻击方法登录过程前后会话标识的比较,显示它们并未更新,这表示有可能伪装用户。初步得知会话标识值后,远程攻击者有可能得以充当已登录的合法用户。任何时候,只要一名用户与应用程序的交互状态由匿名转变为确认,应用程序就应该发布一个新的会话令牌。这不仅适用于用户成功登录的情况,而且适用于匿名用户首次提交个人或其他敏感信息时。安全规范要求COOKIE中的登陆前JSESSIONID与登陆后JESSIONID不能相同。(只有J2EE应用服务器为JESSIONID,其他应用服务器可能不同)解决方案将如下代码加入到登陆页面()的最后

7、行:%().invalidate();etInitParameter(CROSS_DOMAIN_STR);String crossDomainAry = (,);for(String s : crossDomainAry) = getServletContext().getInitParameter(LOGIN_ERROR_TIMES); = getServletContext().getInitParameter(LOGIN_ERROR_LOCK_SECOND);(LOGIN_ERROR_TIMES=+;(LOGIN_ERROR_LOCK_SECOND=+;在init方法中直接调用在类中增加

8、checkCrossDomain 跨域特殊字符串检查,并在doFilter 中进行判断验证,如果存在特殊字符,则直接跳转到登陆界面修改,此处是用于处理返回的错误信息目前是通过标签方式加载错误信息,此处可根据输入的条件来进行错误注入,执行js代码,修改该当如下:一、将此错误标签通过textarea进行包装,错误信息是以文本方式显示,无法执行,如下: 同时修改类的processError 方法,将(stei).append(); 这段代码改为(stei).append(n); 二、无论返回什么错误信息,此处只显示“操作故障,请确认操作是否合法或联系管理员检查!”启用了不安全的HTTP 方法/*PU

9、TDELETEHEADOPTIONSTRACESEARCHCOPYMOVEPROPFINDPROPPATCHMKCOLLOCKUNLOCKBASIC已解密的登录请求URL安全问题描述用户登录密码为明文攻击方法可通过http报文截取登录用户密码安全规范要求发送敏感信息时,始终使用SSL 和HTTP POST 方法解决方案修改标红的地方注意,要与附件中存放的位置一致标蓝的8443要注意,外网的一律全用443端口,BOSS网系统还是全用8443端口。修改,在welcome-file-list后面增加如下配置 CLIENT-CERT Client Cert Users-only Area BASIC

10、SSL/*/oa/ 为应用登录URL,此为公司OA则为此串*/ /oa/ CONFIDENTIAL fortune /* PUT DELETE HEAD OPTIONS TRACE 增加初始化变量:HTTP_URI8080此为从https转到http时的跳转值, 为应用部署服务器IP地址为端口修改如下:Login方法修改如下:String requesturl = ().toString();requesturl = (etServletContext().getAttribute(sessions); HttpSession session = (HttpSession)(value); i

11、f(session != null) HttpSession nsession = (); ,); (value, nsession); session = null; return new ActionForward(/+/frames/);catch(Exception e)(LoginAction Exception Error:+();throw e;修改类的systemLogout方法:String requesturl = ().toString(); requesturl = (在响应页面中,返回发送给CGI 脚本的参数值,嵌入在HTML 中。例如:请求GET /cgi-bin/

12、name=JSmith HTTP/响应HTTP/ 200 OKServer: SomeServerDate: Sun, 01 Jan 2002 00:31:19 GMTContent-Type: text/htmlAccept-Ranges: bytesContent-Length: 27Hello JSmithB. 在HTML 参数值上下文中,返回发送给CGI 脚本的参数值。例如:请求GET /cgi-bin/name=JSmith HTTP/响应 HTTP/ 200 OK Server: SomeServer Date: Sun, 01 Jan 2002 00:31:19 GMT Cont

13、ent-Type:text/html Accept-Ranges: bytes Content-Length: 254Please fill in your zip code: 安全规范要求通过验证用户输入未包含危险字符,便可能防止恶意的用户导致应用程序执行计划外的任务,例如:启动任意SQL 查询、嵌入将在客户端执行的Javascript 代码、运行各种操作系统命令,等等。建议过滤出所有以下字符:1 |(竖线符号)2 & (& 符号)3;(分号)4 $(美元符号)5 %(百分比符号)6 (at 符号)7 (单引号)8 (引号)9 (反斜杠转义单引号)10 (反斜杠转义引号)11 (尖括号)12

14、 ()(括号)13 +(加号)14 CR(回车符,ASCII 0 x0d)15 LF(换行,ASCII 0 x0a)16 ,(逗号)17 (反斜杠)解决方案类中的getLoginInfo 方法,将之前的操作员工号与密码拼接方式改成SQL变量绑定方式StringBuffer sqlbuf = new StringBuffer();(SELECT .orgcode,);( now() AS logindate,sp_genseqfunc(S,D) AS sessionid,);( (SELECT GROUP_CONCAT FROM tb_userdatarel B WHERE = ) AS dat

15、atypes ,PASSWORD()= AS pwdiscorrect);( FROM tb_user A,tb_organization C);( WHERE = AND = CURDATE() AND = );增加如下配置:CROSS_DOMAIN_STR,%3C,%3EGET_CROSS_DOMAIN_STR,%,;,(,),&,+,HTTP,http,%0a类增加如下变量:/* 跨域特殊字符判断*/public static List CROSS_DOMAIN_STR = new ArrayList();public static List GET_CROSS_DOMAIN_STR =

16、 new ArrayList();类增加initSafetyConf 安全初始化配置方法private void initSafetyConf() crossDomainStr = getServletContext().getInitParameter(CROSS_DOMAIN_STR);String crossDomainAry = (,);for(String s : crossDomainAry) = getServletContext().getInitParameter(GET_CROSS_DOMAIN_STR);crossDomainAry = (,);for(String s

17、: crossDomainAry) = getServletContext().getInitParameter(LOGIN_ERROR_TIMES); = getServletContext().getInitParameter(LOGIN_ERROR_LOCK_SECOND); = getServletContext().getInitParameter(HTTP_URI);(LOGIN_ERROR_TIMES=+;(LOGIN_ERROR_LOCK_SECOND=+;(HTTP_URI=+;在init方法中直接调用在类中增加checkCrossDomain 跨域特殊字符串检查,并在doF

18、ilter 中进行判断验证,如果存在特殊字符,则直接跳转到登陆界面修改,此处是用于处理返回的错误信息目前是通过标签方式加载错误信息,此处可根据输入的条件来进行错误注入,执行js代码,修改该当如下:一、将此错误标签通过textarea进行包装,错误信息是以文本方式显示,无法执行,如下: 同时修改类的processError 方法,将(stei).append(); 这段代码改为(stei).append(n); 二、无论返回什么错误信息,此处只显示“操作故障,请确认操作是否合法或联系管理员检查!”通过框架钓鱼URL安全问题描述网络钓鱼是一个通称,代表试图欺骗用户交出私人信息,以便电子欺骗身份。攻

19、击者有可能注入frame 或iframe 标记,其中含有类似受攻击之网站的恶意属性。不小心的用户有可能浏览它,但并不知道他正在离开原始网站,冲浪到恶意的网站。之后,攻击者便可以诱惑用户重新登录,然后获取他的登录凭证。攻击方法伪造的网站嵌入在原始网站中,这个情况对攻击者有帮助,因为他的网络钓鱼企图会披上更可信赖的外表。利用的样本:如果参数值未经适当清理便反映在响应中,那么下列请求: name=evil src=会使响应含有通往这个邪恶站点的框架。安全规范要求若干问题的补救方法在于对用户输入进行清理。通过验证用户输入未包含危险字符,便可能防止恶意的用户导致应用程序执行计划外的任务,例如:启动任意S

20、QL 查询、嵌入将在客户端执行的Javascript 代码、运行各种操作系统命令,等等。建议过滤出所有以下字符:1 |(竖线符号)2 & (& 符号)3;(分号)4 $(美元符号)5 %(百分比符号)6 (at 符号)7 (单引号)8 (引号)9 (反斜杠转义单引号)10 (反斜杠转义引号)2012-7-4 16:57:34 154/18711 (尖括号)12 ()(括号)13 +(加号)14 CR(回车符,ASCII 0 x0d)15 LF(换行,ASCII 0 x0a)16 ,(逗号)17 (反斜杠)以下部分描述各种问题、问题的修订建议以及可能触发这些问题的危险字符:SQL 注入和SQL

21、盲注:A. 确保用户输入的值和类型(如Integer、Date 等)有效,且符合应用程序预期。B. 利用存储过程,将数据访问抽象化,让用户不直接访问表或视图。当使用存储过程时,请利用ADO 命令对象来实施它们,以强化变量类型。C. 清理输入以排除上下文更改符号,例如:1 (单引号)2 (引号)3 (反斜线转义单引号)4 (反斜杠转义引号)5 )(结束括号)6 ;(分号)跨站点脚本编制:A. 清理用户输入,并过滤出JavaScript 代码。我们建议您过滤下列字符:1 (尖括号)2 (引号)3 (单引号)4 %(百分比符号)5 ;(分号)6 ()(括号)7 &(& 符号)8 +(加号)B. 如果

22、要修订 变体,请参阅MS 文章 821349C. 对于UTF-7 攻击: - 可能的话,建议您施行特定字符集编码(使用 Content-Type 头或 标记)。HTTP 响应分割:清理用户输入(至少是稍后嵌入在HTTP 响应中的输入)。请确保输入未包含恶意的字符,例如:1 CR(回车符,ASCII 0 x0d)2 LF(换行,ASCII 0 x0a)远程命令执行:清理输入以排除对执行操作系统命令有意义的符号,例如:1 |(竖线符号)2 & (& 符号)3;(分号)执行shell 命令:A. 绝不将未检查的用户输入传递给eval()、open()、sysopen()、system() 之类的Pe

23、rl 命令。B. 确保输入未包含恶意的字符,例如:1 $(美元符号)2 %(百分比符号)3 (at 符号)XPath 注入:清理输入以排除上下文更改符号,例如:1 (单引号)2 (引号) 等LDAP 注入:A. 使用正面验证。字母数字过滤(A.Z,a.z,0.9)适合大部分LDAP 查询。B. 应该过滤出或进行转义的特殊LDAP 字符:2012-7-4 16:57:34 155/1871 在字符串开头的空格或“#”字符2 在字符串结尾的空格字符3 ,(逗号)4 +(加号)5 (引号)6 (反斜杠)7 (尖括号)8 ;(分号)9 ()(括号)MX 注入:应该过滤出特殊MX 字符:1 CR(回车符

24、,ASCII 0 x0d)2 LF(换行,ASCII 0 x0a)记录伪造:应该过滤出特殊记录字符:1 CR(回车符,ASCII 0 x0d)2 LF(换行,ASCII 0 x0a)3 BS(退格,ASCII 0 x08)ORM 注入:A. 确保用户输入的值和类型(如Integer、Date 等)有效,且符合应用程序预期。B. 利用存储过程,将数据访问抽象化,让用户不直接访问表或视图。C. 使用参数化查询APID. 清理输入以排除上下文更改符号,例如: (*):1 (单引号)2 (引号)3 (反斜线转义单引号)4 (反斜杠转义引号)5 )(结束括号)6 ;(分号)(*) 这适用于SQL。高级查

25、询语言可能需要不同的清理机制。解决方案类中的getLoginInfo 方法,将之前的操作员工号与密码拼接方式改成SQL变量绑定方式StringBuffer sqlbuf = new StringBuffer();(SELECT .orgcode,);( now() AS logindate,sp_genseqfunc(S,D) AS sessionid,);( (SELECT GROUP_CONCAT FROM tb_userdatarel B WHERE = ) AS datatypes ,PASSWORD()= AS pwdiscorrect);( FROM tb_user A,tb_or

26、ganization C);( WHERE = AND = CURDATE() AND = );增加如下配置:CROSS_DOMAIN_STR,%3C,%3E类增加如下变量:/* 跨域特殊字符判断*/public static List CROSS_DOMAIN_STR = new ArrayList();类增加initSafetyConf 安全初始化配置方法private void initSafetyConf() crossDomainStr = getServletContext().getInitParameter(CROSS_DOMAIN_STR);String crossDomai

27、nAry = (,);for(String s : crossDomainAry) = getServletContext().getInitParameter(LOGIN_ERROR_TIMES); = getServletContext().getInitParameter(LOGIN_ERROR_LOCK_SECOND);(LOGIN_ERROR_TIMES=+;(LOGIN_ERROR_LOCK_SECOND=+;在init方法中直接调用在类中增加checkCrossDomain 跨域特殊字符串检查,并在doFilter 中进行判断验证,如果存在特殊字符,则直接跳转到登陆界面修改,此处

28、是用于处理返回的错误信息目前是通过标签方式加载错误信息,此处可根据输入的条件来进行错误注入,执行js代码,修改该当如下:一、将此错误标签通过textarea进行包装,错误信息是以文本方式显示,无法执行,如下: 同时修改类的processError 方法,将(stei).append(); 这段代码改为(stei).append(n); 二、无论返回什么错误信息,此处只显示“操作故障,请确认操作是否合法或联系管理员检查!”链接注入(便于跨站请求伪造)URL安全问题描述可能会劝说初级用户提供诸如用户名、密码、信用卡号、社会保险号等敏感信息可能会窃取或操纵客户会话和cookie,它们可能用于模仿合法

29、用户,从而使黑客能够以该用户身份查看或变更用户记录以及执行事务可能会在Web 服务器上上载、修改或删除Web 页面、脚本和文件攻击方法“链接注入”是修改站点内容的行为,其方式为将外部站点的URL 嵌入其中,或将有易受攻击的站点中的脚本的URL 嵌入其中。将URL 嵌入易受攻击的站点中,攻击者便能够以它为平台来启动对其他站点的攻击,以及攻击这个易受攻击的站点本身。在这些可能的攻击中,有些需要用户在攻击期间登录站点。攻击者从这一易受攻击的站点本身启动这些攻击,成功的机会比较大,因为用户登录的可能性更大。“链接注入”漏洞是用户输入清理不充分的结果,清理结果会在稍后的站点响应中返回给用户。攻击者能够将

30、危险字符注入响应中,便能够嵌入URL 及其他可能的内容修改。以下是“链接注入”的示例(我们假设“站点有一个用来问候用户的参数,称为“name”)。下列请求: Smith会生成下列响应:Hello, John Smith.然而,恶意的用户可以发送下列请求: SRC=这会返回下列响应:Hello, .2012-7-4 16:57:34 149/187如该示例所示,这有可能导致用户浏览器向几乎是攻击者所期待的任何站点发出自动请求。因此,他可能利用这个“链接注入”漏洞来启动若干类型的攻击:跨站点伪造请求:攻击者可以让用户的浏览器向用户目前登录的站点发送请求,以及执行用户并不想执行的操作。这些操作可能包

31、括从站点中注销,或修改用户的概要文件、电子邮件地址,甚至是修改密码,结果造成彻底的帐户接管。跨站点脚本编制:任何“跨站点脚本编制”攻击都开始自诱惑用户单击精心制作的URL,以便利用受害者站点中的漏洞。发送含有恶意链接的电子邮件,或创建一个Web 站点来包含指向易受攻击的站点的链接,通常可以做到这一点。当采用“链接注入”漏洞时,有可能在A 站点中嵌入一个恶意的URL,当单击这个链接时,便启动对B 站点的“跨站点脚本编制”攻击。网络钓鱼:攻击者有可能注入指向类似受攻击站点的恶意站点的链接。不小心的用户可能单击这个链接,但并不知道自己即将离开原始站点而浏览到恶意站点。之后,攻击者便可以诱惑用户重新登

32、录,然后获取他的登录凭证。安全规范要求通过验证用户输入未包含危险字符,便可能防止恶意的用户导致应用程序执行计划外的任务,例如:启动任意SQL 查询、嵌入将在客户端执行的Javascript 代码、运行各种操作系统命令,等等。建议过滤出所有以下字符:1 |(竖线符号)2 & (& 符号)3;(分号)4 $(美元符号)5 %(百分比符号)6 (at 符号)7 (单引号)8 (引号)9 (反斜杠转义单引号)10 (反斜杠转义引号)11 (尖括号)12 ()(括号)13 +(加号)14 CR(回车符,ASCII 0 x0d)15 LF(换行,ASCII 0 x0a)16 ,(逗号)17 (反斜杠)以下

33、部分描述各种问题、问题的修订建议以及可能触发这些问题的危险字符:SQL 注入和SQL 盲注:A. 确保用户输入的值和类型(如Integer、Date 等)有效,且符合应用程序预期。B. 利用存储过程,将数据访问抽象化,让用户不直接访问表或视图。当使用存储过程时,请利用ADO 命令对象来实施它们,以强化变量类型。C. 清理输入以排除上下文更改符号,例如:1 (单引号)2 (引号)3 (反斜线转义单引号)4 (反斜杠转义引号)5 )(结束括号)6 ;(分号)2012-7-4 16:57:34 150/187跨站点脚本编制:A. 清理用户输入,并过滤出JavaScript 代码。我们建议您过滤下列字

34、符:1 (尖括号)2 (引号)3 (单引号)4 %(百分比符号)5 ;(分号)6 ()(括号)7 &(& 符号)8 +(加号)B. 如果要修订 变体,请参阅MS 文章 821349C. 对于UTF-7 攻击: - 可能的话,建议您施行特定字符集编码(使用 Content-Type 头或 标记)。HTTP 响应分割:清理用户输入(至少是稍后嵌入在HTTP 响应中的输入)。请确保输入未包含恶意的字符,例如:1 CR(回车符,ASCII 0 x0d)2 LF(换行,ASCII 0 x0a)远程命令执行:清理输入以排除对执行操作系统命令有意义的符号,例如:1 |(竖线符号)2 & (& 符号)3;(分

35、号)执行shell 命令:A. 绝不将未检查的用户输入传递给eval()、open()、sysopen()、system() 之类的Perl 命令。B. 确保输入未包含恶意的字符,例如:1 $(美元符号)2 %(百分比符号)3 (at 符号)XPath 注入:清理输入以排除上下文更改符号,例如:1 (单引号)2 (引号) 等LDAP 注入:A. 使用正面验证。字母数字过滤(A.Z,a.z,0.9)适合大部分LDAP 查询。B. 应该过滤出或进行转义的特殊LDAP 字符:1 在字符串开头的空格或“#”字符2 在字符串结尾的空格字符3 ,(逗号)4 +(加号)5 (引号)6 (反斜杠)7 (尖括号

36、)8 ;(分号)9 ()(括号)MX 注入:应该过滤出特殊MX 字符:1 CR(回车符,ASCII 0 x0d)2 LF(换行,ASCII 0 x0a)记录伪造:应该过滤出特殊记录字符:1 CR(回车符,ASCII 0 x0d)2 LF(换行,ASCII 0 x0a)3 BS(退格,ASCII 0 x08)ORM 注入:A. 确保用户输入的值和类型(如Integer、Date 等)有效,且符合应用程序预期。2012-7-4 16:57:34 151/187B. 利用存储过程,将数据访问抽象化,让用户不直接访问表或视图。C. 使用参数化查询APID. 清理输入以排除上下文更改符号,例如: (*)

37、:1 (单引号)2 (引号)3 (反斜线转义单引号)4 (反斜杠转义引号)5 )(结束括号)6 ;(分号)(*) 这适用于SQL。高级查询语言可能需要不同的清理机制。解决方案类中的getLoginInfo 方法,将之前的操作员工号与密码拼接方式改成SQL变量绑定方式StringBuffer sqlbuf = new StringBuffer();(SELECT .orgcode,);( now() AS logindate,sp_genseqfunc(S,D) AS sessionid,);( (SELECT GROUP_CONCAT FROM tb_userdatarel B WHERE =

38、 ) AS datatypes ,PASSWORD()= AS pwdiscorrect);( FROM tb_user A,tb_organization C);( WHERE = AND = CURDATE() AND = );增加如下配置:CROSS_DOMAIN_STR,%3C,%3E类增加如下变量:/* 跨域特殊字符判断*/public static List CROSS_DOMAIN_STR = new ArrayList();类增加initSafetyConf 安全初始化配置方法private void initSafetyConf() crossDomainStr = getS

39、ervletContext().getInitParameter(CROSS_DOMAIN_STR);String crossDomainAry = (,);for(String s : crossDomainAry) = getServletContext().getInitParameter(LOGIN_ERROR_TIMES); = getServletContext().getInitParameter(LOGIN_ERROR_LOCK_SECOND);(LOGIN_ERROR_TIMES=+;(LOGIN_ERROR_LOCK_SECOND=+;在init方法中直接调用在类中增加ch

40、eckCrossDomain 跨域特殊字符串检查,并在doFilter 中进行判断验证,如果存在特殊字符,则直接跳转到登陆界面修改,此处是用于处理返回的错误信息目前是通过标签方式加载错误信息,此处可根据输入的条件来进行错误注入,执行js代码,修改该当如下:一、将此错误标签通过textarea进行包装,错误信息是以文本方式显示,无法执行,如下: 同时修改类的processError 方法,将(stei).append(); 这段代码改为(stei).append(n); 二、无论返回什么错误信息,此处只显示“操作故障,请确认操作是否合法或联系管理员检查!”应用程序错误URL安全问题描述未对入局参

41、数值执行适当的边界检查未执行验证以确保用户输入与预期的数据类型匹配攻击方法如果攻击者通过伪造包含非应用程序预期的参数或参数值的请求,来探测应用程序(如以下示例所示),那么应用程序可能会进入易受攻击的未定义状态。攻击者可以从应用程序对该请求的响应中获取有用的信息,且可利用该信息,以找出应用程序的弱点。例如,如果参数字段是单引号括起来的字符串(如在ASP 脚本或SQL 查询中),那么注入的单引号将会提前终止字符串流,从而更改脚本的正常流程/语法。错误消息中泄露重要信息的另一个原因,是脚本编制引擎、Web 服务器或数据库配置错误。以下是一些不同的变体:1 除去参数2 除去参数值3 将参数值设置为空值

42、4 将参数值设置为数字溢出(+/- )5 将参数值设置为危险字符,如 ) ;6 将某字符串附加到数字参数值安全规范要求所有涉及到拼接SQL的地方,用绑定变量方式解决方案非模糊匹配的很好改,将以前拼接的形式找成“”号,如果是动态拼接,无法确定数量的,如通过如下形式:List args = new ArrayList();if(!.equals()( and like );(%+()+%); quals()( and = );();if(!.equals()( and = to_date(,yyyy-mm-dd);quals()( and = to_date(,yyyy-mm-dd);();拼接后

43、查询如下:String sqlexec = (), getSimpleJdbcTemplate(), (); 还有一种命名参数变量绑定的形式: String sql = SELECT * FROM tb_oa_files where id=:id ;List files = new Map parameters = new HashMap();(id, id);这种在查询时传入的是Map(key、value的键值对),key的值必需与绑定变量的名称一致,查询如下:getSimpleJdbcTemplate().query(sql, tb_oa_files_map, parameters);SQ

44、L查询条件中带In条件的变量绑定方法:如这种:select dsname from tb_da_datasource where dsid in (111,222)首先我们确定从前台传过来的ID必需是不带单引号括起来的,如上面这种,传过来用逗号分开应该是:111,222这种形式,在进行变量绑定拼接SQL时进行如下操作:StringBuffer sql = new StringBuffer(“select dsname from tb_da_datasource where dsid in (”);String idAry = (“,”);for(int i = 0; i ; i+)if(i !

45、= 0)(“,”);(“”);(“)”);getSimpleJdbcTemplate().query(), map, idAry);如果查询的变量不止这些ID还有其它的值,可通过下面方式:List args = new ArrayList();if(!.equals(dsname)( and dsname like );(%+dsname+%); uery(), map, ();重新初始化一个ArrayList(此种List是顺序存储结构,此止必需是顺序存储结构),将数组的字增加到List,再通过toArray转成数组。SQL查询条件中带In条件的命名参数的变量绑定。命名参数就是通过冒号+变量

46、名的形式进行绑定,在传入参数时是一个key、value的键值对,key必需与变量名保持一致,value就是对应输入的值。Map parameters = new HashMap();StringBuffer sql = new StringBuffer(“select dsname from tb_da_datasource where dsid in (”);String idAry = (“,”);for(int i = 0; i 0。这是应用程序的基本认证机制。但攻击者可以用下列方式来更改此查询:1. 攻击者可以提供单引号字符()所组成的输入,使数据库发出错误消息,其中通常包含关于SQL

47、 查询的有价值的信息。攻击者只需在发送的请求中包含用户值 ,并在密码中包含任何值(如foobar)。结果便是下列(格式错误)的SQL 查询:SELECT COUNT(*) FROM accountsWHERE username= AND password=foobar这可能会产生以下错误消息(取决于后端所使用的特定数据库):查询表达式 username = AND password = foobar 中发生语法错误(遗漏运算符)。2012-7-4 16:57:29 71/187这时攻击者便得知查询是根据表达式username=$user AND password=$pass 来构建的。利用手边

48、的SQL 查询时需要这一关键信息。攻击者了解查询的格式后,下一步只需使用:user = or 1=1 or =password = foobar生成的查询如下:SELECT COUNT(*) FROM accounts WHERE username= or 1=1 or = AND password=foobar这表示查询(在SQL 数据库中)对于“accounts”表的每项记录都会返回TRUE,因为 1=1 表达式永远为真。因此,查询会返回“accounts”中的记录数量,于是用户(攻击者)也会被视为有效。这个探测方法有若干变体,例如,发送 ; or (您应该记住,几乎所有供应商都有他们自己

49、唯一的SQL“版本”。具体地说,发送 having 1=1,也会生成错误消息,此消息会泄露有关列名称的信息。在某些情况下,用户输入不会并入字符串上下文(用单引号括住),而是并入数字上下文,换言之,就是依现状嵌入。因此,在这种情况下,可以使用输入字符串 1 having1=1。2. 在某些情况下,有可能将原始查询替换为其他查询。提早终止原始查询(例如:使用单引号来结束字符串上下文,用分号之类的查询分隔符来强制终止,然后撰写新的查询),便可以做到这一点。如果应用程序够灵活,可以从已修改的查询中接收(及显示)数据(虽然不完全符合预期的数据),那么就可以使用这项技术来下载各种数据库表和记录。即使应用程

50、序处理从数据库返回的意外数据的方式还不至于将该数据显示出来,它仍可能在数据库上运行恶意查询(例如:更改表、删除表,以及运行Shell 命令)。最后,在某些情况下,按一定方式设计恶意查询,使所需数据依照应用程序预期的格式返回,便可得到所需数据。下列输入字符串可用来从数据库的系统表中生成敏感信息(这取决于应用程序处理返回的查询结果的方式):; select version,1,1,1-(MS-SQL 数据库 返回数据库版本); select * from master.sysmessages(MS-SQL 数据库 返回系统信息); select * from (MS-SQL 数据库 返回数据库服务

51、器所管理的数据库名称); select * from (Oracle 数据库 返回数据库用户名)由此可见,如果用户输入未经清理(也就是确保字符串数据不含 或 这些字符必须编码/转义,且必须确保数字/布尔型或其他类型化数据的格式适当),攻击者便可以使用这个情况来操纵数据库。在Oracle 测试变体中,由强制Oracle 数据库利用UTL_HTTP 程序包建立从Oracle 服务器返回测试机器的HTTP 连接来验证SQL 注入。发送的注入有效内容是: | ( 假设原始SQL 查询是:SELECT COUNT(*) FROM accounts WHERE username=$user ANDpass

52、word=$pass,在SQL 注入测试期间实际的SQL 查询是:SELECT COUNT(*) FROM accounts WHERE username= | ( | AND password=$pass当运行此SQL 查询时,Oracle 服务器会执行 入口点,这个入口点会联系测试机器,通过HTTP 来请求 /SQL_Injection_Validation 文件。注意:为了能够适当验证这项测试,在Oracle 服务器和测试机器之间,必须能够建立直接的TCP 连接。在MS SQL 端口侦听器测试变体中,也使用类似的方法。发送的注入有效内容是: ; select * from openrow

53、set(sqloledb,Network=DBMSSOCN;Address=IP_Address,9999;uid=myUsr;pwd=myPass,select foofrom bar)-假设原始SQL 查询是:SELECT COUNT(*) FROM accounts WHERE username=$user ANDpassword=$pass,在SQL 注入期间,实际的SQL 查询是:SELECT COUNT(*) FROM accounts WHERE username=; select * from openrowset2012-7-4 16:57:29 72/187(sqloled

54、b,Network=DBMSSOCN;Address=IP_Address,9999;uid=myUsr;pwd=myPass,select foofrom bar)- AND password=$pass当运行这个SQL 查询时,MS SQL 服务器会在 9999 端口上建立指向 IP_Address 的连接,这是openrowset() 的执行结果。注意:为了能够适当验证这项测试,在MS SQL 服务器和测试机器之间,必须能够建立直接的TCP 连接。安全规范要求通过验证用户输入未包含危险字符,便可能防止恶意的用户导致应用程序执行计划外的任务,例如:启动任意SQL 查询、嵌入将在客户端执行的

55、Javascript 代码、运行各种操作系统命令,等等。建议过滤出所有以下字符:1 |(竖线符号)2 & (& 符号)3;(分号)4 $(美元符号)5 %(百分比符号)6 (at 符号)7 (单引号)8 (引号)9 (反斜杠转义单引号)10 (反斜杠转义引号)11 (尖括号)12 ()(括号)13 +(加号)14 CR(回车符,ASCII 0 x0d)15 LF(换行,ASCII 0 x0a)16 ,(逗号)17 (反斜杠)以下部分描述各种问题、问题的修订建议以及可能触发这些问题的危险字符:SQL 注入和SQL 盲注:A. 确保用户输入的值和类型(如Integer、Date 等)有效,且符合应

56、用程序预期。B. 利用存储过程,将数据访问抽象化,让用户不直接访问表或视图。当使用存储过程时,请利用ADO 命令对象来实施它们,以强化变量类型。C. 清理输入以排除上下文更改符号,例如:1 (单引号)2 (引号)3 (反斜线转义单引号)4 (反斜杠转义引号)5 )(结束括号)6 ;(分号)跨站点脚本编制:A. 清理用户输入,并过滤出JavaScript 代码。我们建议您过滤下列字符:1 (尖括号)2 (引号)3 (单引号)4 %(百分比符号)5 ;(分号)6 ()(括号)7 &(& 符号)2012-7-4 16:57:29 73/1878 +(加号)B. 如果要修订 变体,请参阅MS 文章 8

57、21349C. 对于UTF-7 攻击: - 可能的话,建议您施行特定字符集编码(使用 Content-Type 头或 标记)。HTTP 响应分割:清理用户输入(至少是稍后嵌入在HTTP 响应中的输入)。请确保输入未包含恶意的字符,例如:1 CR(回车符,ASCII 0 x0d)2 LF(换行,ASCII 0 x0a)远程命令执行:清理输入以排除对执行操作系统命令有意义的符号,例如:1 |(竖线符号)2 & (& 符号)3;(分号)执行shell 命令:A. 绝不将未检查的用户输入传递给eval()、open()、sysopen()、system() 之类的Perl 命令。B. 确保输入未包含恶

58、意的字符,例如:1 $(美元符号)2 %(百分比符号)3 (at 符号)XPath 注入:清理输入以排除上下文更改符号,例如:1 (单引号)2 (引号) 等LDAP 注入:A. 使用正面验证。字母数字过滤(A.Z,a.z,0.9)适合大部分LDAP 查询。B. 应该过滤出或进行转义的特殊LDAP 字符:1 在字符串开头的空格或“#”字符2 在字符串结尾的空格字符3 ,(逗号)4 +(加号)5 (引号)6 (反斜杠)7 (尖括号)8 ;(分号)9 ()(括号)MX 注入:应该过滤出特殊MX 字符:1 CR(回车符,ASCII 0 x0d)2 LF(换行,ASCII 0 x0a)记录伪造:应该过滤

59、出特殊记录字符:1 CR(回车符,ASCII 0 x0d)2 LF(换行,ASCII 0 x0a)3 BS(退格,ASCII 0 x08)ORM 注入:A. 确保用户输入的值和类型(如Integer、Date 等)有效,且符合应用程序预期。B. 利用存储过程,将数据访问抽象化,让用户不直接访问表或视图。C. 使用参数化查询APID. 清理输入以排除上下文更改符号,例如: (*):1 (单引号)2 (引号)3 (反斜线转义单引号)4 (反斜杠转义引号)5 )(结束括号)6 ;(分号)2012-7-4 16:57:29 74/187(*) 这适用于SQL。高级查询语言可能需要不同的清理机制。解决方

60、案非模糊匹配的很好改,将以前拼接的形式找成“”号,如果是动态拼接,无法确定数量的,如通过如下形式:List args = new ArrayList();if(!.equals()( and like );(%+()+%); quals()( and = );();if(!.equals()( and = to_date(,yyyy-mm-dd);quals()( and = to_date(,yyyy-mm-dd);();拼接后查询如下:String sqlexec = (), getSimpleJdbcTemplate(), (); 还有一种命名参数变量绑定的形式: String sql

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论