网站漏洞检测归类和解决方案.txt同志们:别炒股,风险太大了,还是做豆腐最安全!做硬了是豆腐干,做稀了是豆腐脑,做薄了是豆腐皮,做没了是豆浆,放臭了是臭豆腐!稳赚不亏呀!本文由s8h4a2n6贡献doc文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。一、典型网站漏洞分类根据风险等级,网站漏洞通常可分为高风险、中风险和低风险三种。其中高风险漏洞是必须封堵的。中、低风险漏洞中有一部分是必须封堵的。还有一部分中、低风险漏洞,由于其封堵的代价可能远高于不封堵所造成的损失,因而可以进行选择性封堵。可以采取工具亿思平台进行其网站的漏洞扫描,具体地址为:典型网站漏洞的分类及相应的封堵要求如下表所示:风险等级高风险1、SQL注入漏洞2、跨站漏洞中、低风险1、默认测试用例文件2、管理后台登陆入口中、低风险1、存在电子邮件地址漏洞名称3、XPATH注入漏3、应用程序错误引起的2、无效链接洞信息泄露4、备份文件造成的源代码泄漏3、Web应用默认目录封堵要求必须封堵选择封堵1二、典型网站漏洞影响及解决方案1、SQL注入漏洞漏洞影响:本漏洞属于Web应用安全中的常见漏洞,属于OWASPTOP10(2007)中的注入类漏洞。很多WEB应用中都存在SQL注入漏洞。SQL注入是一种攻击者利用代码缺陷进行攻击的方式,可在任何能够影响数据库查询的应用程序参数中利用。例如url本身的参数、post数据或cookie值。正常的SQL注入攻击很大程度上取决于攻击者使用从错误消息所获得信息。但是,即使没有显示错误消息应用程序仍可能受SQL注入的影响。总体上讲,SQL注入是对web应用而不是对web服务器或操作系统本身的攻击。正如其名称所示,SQL注入是对查询添加非预期SQL命令从而以数据库管理员或开发人员非预期的方式操控数据库的行为。如果成功的话,就可以获得、修改、注入或删除有漏洞web应用所使用数据库服务器的数据。在某些环境下,可利用SQL注入完全控制系统。解决方案:防护建议包括部署分层安全措施(包括在接受用户输入时使用参数化的查询)、确保应用程序仅使用预期的数据、加固数据库服务器防止不恰当的访问数据。建议使用以下措施防范SQL注入漏洞:2对于开发========使用以下建议编写不受SQL注入攻击影响的web应用。参数化查询:SQL注入源于攻击者控制查询数据以修改查询逻辑,因此防范SQL注入攻击的最佳方式就是将查询的逻辑与其数据分隔,这可以防止执行从用户输入所注入的命令。这种方式的缺陷是可能对性能产生影响(但影响很小),且必须以这种方式构建站点上的每个查询才能完全有效。只要无意中绕过了一个查询,就足以导致应用受SQL注入的影响。以下代码显示的是可以进行SQL注入的SQL语句示例。sSql=SELECTLocationNameFROMLocations;sSql=sSql+WHERELocationID=+Request[LocationID];oCmd.CommandText=sSql;下面的例子使用了参数化的查询,不受SQL注入攻击的影响。sSql=SELECT*FROMLocations;sSql=sSql+WHERELocationID=@LocationID;oCmd.CommandText=sSql;oCmd.Parameters.Add(@LocationID,Request[LocationID]);应用程序没有包含用户输入向服务器发送SQL语句,而是使用-@LocationID-参数替代该输入,这样用户输入就无法成为SQL执行的命令。3这种方式可以有效的拒绝攻击者所注入的任何输入,尽管仍会生成错误,但仅为数据类型转换错误,而不是黑客可以利用的错误。以下代码示例显示从HTTP查询字符串中获得产品ID并使用到SQL查询中。请注意传送给SqlCommand的包含有SELECT的字符串仅仅是个静态字符串,不是从输入中截取的。此外还请注意使用SqlParameter对象传送输入参数的方式,该对象的名称(@pid)匹配SQL查询中所使用的名称。C#示例:stringconnString=WebConfigurationManager.ConnectionStrings[myConn].ConnectionString;using(SqlConnectionconn=newSqlConnection(connString)){conn.Open();SqlCommandcmd=newSqlCommand(SELECTCount(*)FROMProductsWHEREProdID=@pid,conn);SqlParameterprm=newSqlParameter(@pid,SqlDbType.VarChar,50);prm.Value=Request.QueryString[pid];cmd.Parameters.Add(prm);intrecCount=(int)cmd.ExecuteScalar();}4VB.NET示例:DimconnStringAsString=WebConfigurationManager.ConnectionStrings(myConn).ConnectionStringUsingconnAsNewSqlConnection(connString)conn.Open()DimcmdAsSqlCommand=NewSqlCommand(SELECTCount(*)FROMProductsWHEREProdID=@pid,conn)DimprmAsSqlParameter=NewSqlParameter(@pid,SqlDbType.VarChar,50)prm.Value=Request.QueryString(pid)cmd.Parameters.Add(prm)DimrecCountAsInteger=cmd.ExecuteScalar()EndUsing验证输入:可通过正确验证用户输入的类型和格式防范大多数SQL注入攻击,最佳方式是通过白名单,定义方法为对于相关的字段只接受特定的帐号号码或帐号类型,或对于其他仅接受英文字母表的整数或字母。很多开发人员都试图使用黑名单字符或转义的方式验证输入。总体上讲,这种方式通过在恶意数据前添加转义字符来拒绝已知的恶意数据,如单引号,这样之后的项就可以用作文字值。5这种方式没有白名单有效,因为不可能事先知道所有形式的恶意数据。对于安全操作============使用以下建议帮助防范对web应用的SQL注入攻击。限制应用程序权限:限制用户凭据,仅使用应用运行所必需权限的。任何成功的SQL注入攻击都会运行在用户凭据的环境中,尽管限制权限无法完全防范SQL注入攻击,但可以大大增加其难度。强系统管理员口令策略:通常攻击者需要管理员帐号的功能才能使用特定的SQL命令,如果系统管理员口令较弱的话就比较容易暴力猜测,增加成功SQL注入攻击的可能性。另一个选项就是根本不使用系统管理员口令,而是为特定目的创建特定的帐号。一致的错误消息方案:确保在出现数据库错误时向用户提供尽可能少的信息。不要泄漏整个错误消息,要同时在web和应用服务器上处理错误消息。当web服务器遇到处理错误时,应使用通用的web页面响应,或将用户重新定向到标准的位置。绝不要泄漏调试信息或其他可能对攻击者有用的细节。有关如何在IIS中关闭详细错误消息的说明请见:6=/windows2000/en/server/iis/htm/core/iierrcst.htm使用以下句法在Apache服务器上取缔错误消息:Syntax:ErrorDocument3-digit-codeExample:ErrorDocument500/webserver_errors/server_error500.txtWebSphere之类的应用服务器通常默认安装启用了错误消息或调试设置。有关如何取缔这些错误消息的信息,请参考应用服务器文档。存储过程:如果不使用的话,请删除master..Xp_cmdshell、xp_startmail、xp_sendmail、sp_makewebtask之类的SQL存储过程。SQL注入漏洞根本上还是取决于web应用程序的代码。尽管不是修复,但可以通过向IDS中添加结合了正则表达式的规则作为紧急措施检测SQL注入攻击。尽管这无法修复所有可能的SQL注入漏洞,但便于实施,并且要求攻击者必须要改进其方法才能实现成功的攻击。可如下使用正则表达式。删除SQL元字符的正则表达式:/(\%27)|(\')|(\-\-)|(\%23)|(#)/ix7可如下将上述正则表达式添加到Snort规则:alerttcp$EXTERNAL_NETany-$HTTP_SERVERS$HTTP_PORTS(msg:SQLInjection-Paranoid;flow:to_server,established;uricontent:.pl;pcre:/(\%27)|(\')|(\-\-)|(%23)|(#)/i;classtype:Web-application-attack;sid:9099;rev:5;)传统SQL注入攻击的正则表达式:/\w*((\%27)|(\'))((\%6F)|o|(\%4F))((\%72)|r|(\%52))/ix删除有UNION关键字的SQL注入攻击的正则表达式:/((\%27)|(\'))union/ix(\%27)|(\')可为其他的SQL查询(如select、insert、update、delete、drop等)编写类似的正则表达式。在MSSQL服务器上检测SQL注入攻击的正则表达式:/exec(\s|\+)+(s|x)p\w+/ix对于质量保证============8解决SQL注入缺陷最终要求基于代码的修复,“对于开发”和“对于安全操作”部分所述的步骤提供了修复这些漏洞所必要的信息。以下步骤概述了如何对应用程序手动测试SQL注入。如何对应用程序手动测试SQL注入:1.在浏览器中打开希望测试SQL注入漏洞的web应用。2.将鼠标光标悬停在Web站点的链接上并注意底部的状态栏,可以看到链接所指向的URL。找到其中带有参数的URL,如=42注释:如果没有在状态栏中看到任何URL,请点击链接然后查看地址栏,直到找到带有参数的URL。3.找到带有参数的URL后,点击链接进入网页,在地址栏中可以看到状态栏中的URL。4.有两种测试SQL注入脚本的方法,请使用全部两种方式依次测试每个参数值。方法1.在地址栏中点击光标,高亮显示参数值,如高亮显示name=value中的value并9用单引号(')替换,这时应类似于name='。方法2.在地址栏中点击光标,在value中间输入单引号('),这时应类似于name=val'ue。5.点击GO键将请求发送到Web服务器。6.分析Web服务器响应中的错误消息,大多数数据库错误消息都类似于以下示例:Exampleerror1:MicrosoftOLEDBProviderforSQLServererror'80040e14'Unclosedquotationmarkbeforethecharacterstring'51ORDERBYsome_name'./some_directory/some_file.asp,line5Exampleerror2:ODBCErrorCode=S1000(Generalerror)[Oracle][ODBC][Ora]ORA-00933:SQLcommandnotproperlyendedExampleerror3:Error:1353SQLSTATE:HY000(ER_VIEW_WR