Web应用安全漏洞构造与防范设计
作者:张红瑞
来源:《无线互联科技》2014年第04
        要:采用ASP.NETSQL Server数据库开发了基于B/S架构的Web应用安全攻防实训平台,利用SQL注入构造了密码验证漏洞,并给出了SQL注入漏洞的相关防范措施。
        关键词:OWASPSQL注入漏洞;密码验证;防范设计
        开放式Web应用程序安全项目(OWASPOpen Web Application Security Project)在其给出的OWASP Top10_2013中文版安全报告中指出最危险的漏洞是A1-注入漏洞。例如SQLOS以及LDAP注入。这些攻击发生在当不可信的数据作为命令或者查询语句的一部分,被发送给解释器的时候。攻击者发送的恶意数据可以欺骗解释器,以执行计划外的命令或者在未被恰当授权时访问数据[1]
        1 SQL注入漏洞分析
        SQL注入是一种典型的攻击方式,在这种攻击方式中,恶意代码被插入到字符串中,然后
将该字符串传递到数据库中以进行分析和执行。SQL注入的主要形式包括直接将代码插入到与SQL命令串联在一起并使其得以执行的用户输入变量。一种间接的攻击会将恶意代码注入要在表中存储或作为元数据存储的字符串,在存储的字符串随后串连到一个动态SQL命令中时,将执行该恶意代码[2]。为了构造和利用SQL注入漏洞,攻击者必须到一个参数传递数据,然后这个参数传送到操作数据库的SQL语句中,Web应用程序使用该语句操作数据库,可能导致信息泄漏、数据丢失、记录篡改等危害[3]
        为了实现Web应用漏洞的构造、攻击和防范过程,采用ASP.NET+SQL ServerAccess)数据库开发了基于B/S架构的Web应用安全攻防实训平台,系统部署默认采用Windows Sever系列+IIS,后台数据库默认采用SQL Server作为后台数据库系统,根据实际选择需要可以切断换到Access数据库。
        2 SQL注入漏洞设计与利用
        Web应用安全攻防实训平台的登陆模块中,设计了基于SQL注入的密码验证绕过漏洞,其密码验证的关键代码如下:
        SqlConnection Conn=new SqlConnectionWebData.strConn);
        String str="select * from Admin where UserName='" +Name.Text+"'and UserPwd = '"+Pwd.Text+"' "
        SqlCommand Cmd=new SqlCommandstrConn);
        Conn.Open ();
        SqlDataReader Dr=Cmd.ExecuteReader ();
        此段代码通过串联硬编码字符串和用户输入的字符串而生成一个SQL查询:
        String str="select * from Admin where UserName='"+Name.Text+"'and UserPwd='"+Pwd.Text+"' "
        当用户输入用户和密码都是admin时,此SQL语句变成了如下查询语句:
        String str="select*from Admin where UserName='admin' and UserPwd='admin' "
        然后此语句被提交给数据库进行查询。但是,假定用户在管理帐号处输入以下内容:admin' or '1'='1 在管理密码输入test后,此SQL语句变成了如下查询语句:
        String str="select*from Admin where UserName='admin' or '1'='1' and UserPwd='test' "
        然后此语句被提交给数据库进行查询,由于构造的SQL语句中or'1'='1'语句的存在并且条件永远为真,导致UserPwd='test'语句部分被忽略,所以构造出来的特殊输入绕过了密码验证环节直接进入了平台管理后台。
        3 SQL注入漏洞防范
        OWASP Top10_2013中文版安全报告中A1-注入漏洞,包括SQLOS以及 LDAP注入。因此SQL注入漏洞的防范首先要对部署平台:包括操作系统(OS)、Web服务器和数据库的安全进行合理的配置,并在开发过程中注意遵循的规则包括:
        ⑴使用参数化查询(Parameterized Query)进行SQL数据查询存取,在需要提交数据或数值的地方,使用参数 Parameter)进行值传递。数据库服务器不会将参数内容视为SQL指令的一部份来处理,而是在数据库完成SQL指令的编译后,才附加参数值运行[4]。因此就算参数值中含有恶意的语句或指令,由于已经编译完成,因此不会被数据库所运行。
        ⑵spring framework高危漏洞尽量使用存储过程SQL数据查询存取,由于存储过程是存储在数据库管理系统中,使用时由程序通过参数传递数值并可以验证,对于数据的访问是基于存储过程而不是直接访问数据表,可以有效防止对数据表的猜测。
        ⑶使用正则表达式来验证提交信息中是否包含单引号()、分号(;)、结束符(--)等特殊字符,在上面提交的密码信息admin'or'1'='1就可以被检测出来异常。检测提交信息中是否包含andorselectupdateexec等特殊命令,这些命令有可能被带入到数据库并被操作执行。
        4 结束语
        OWASP提供安全报告中的A1-注入漏洞,对SQL漏洞原因进行了分析、并在此基础上构造和设计密码验证漏洞,从使用参数化查询、存储过程以及对对提交信息进行验证的角度给出了SQL注入漏洞的防护措施。
        [参考文献]
        [1]OWASP.OWASP 2013 Top 10中文版[R].http///owasp-project/d
ownload/OWASPTop10 2013V1.2.pdf.2014-03-01.
        [2]Microsoft.SQL注入.http//technet.microsoft/zh-cn/library/ms161953.aspx[EB/OL].2014-03-01.
        [3]张红瑞,郝建,吕延岗.Web应用安全攻防实训平台的设计与实现[J].学周刊,2014228-29.
        [4]李晓龙.基于SQL注入攻击的三种防御技术[J].湖北文理学院学报,2013345):18-21.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。