1SQL注入攻击防范专题论文摘要:随着网络产业的迅猛发展,基于B/S模式的Web应用程序越来越普及,该模式包括数据库服务器、应用服务器与客户端三级。许多程序员在编写Web应用时只注重功能的实现,没有对用户输入数据的合法性进行有效判断,使应用程序存在安全隐患。所谓SQL注入攻击,就是攻击者通过提交精心构造的数据库查询代码,欺骗服务器执行恶意的SQL命令,以获取用户密码等敏感信息,进而获取主机控制权限等。统计表明,在互联网上的Web服务器遭受的各类应用层攻击中,SQL注入占有极大的比例。针对上述问题,许多研究人员关于如何正确检测和防范SQL注入攻击做了大量工作。其中提出一种基于SQL语法预分析的策略,该策略抽象出各类注入的语法结构,然后将用户输入预先组装成完整的SQL语句,对该语句进行语法分析,如果发现具有SQL注入特征的语法结构,则判定为SQL注入攻击。基于数据库的SQL漏洞注入攻击是如今黑客攻击数据库的常用手段,也是最危险、最普遍的基于Web的攻击之一。它从正常的端口访问,表面看起来跟一般的Web页面访问没什么区别,故防火墙不发出警报。SQL注入的手法相当灵活,在注入的时候会碰到很多意外的情况。本文通过对SQL注入式攻击的常用攻击方法做了逐一的分析,并针对每种攻击方法提出了检测和防范的措施。文章还会对一些网站源代码进行分析,并介绍一些检测工具。关键词:SQL注入、防御方法、黑客入侵、脚本攻击、网站安全、数据库安全引言:随着数据库技术及B/S模式应用技术的发展,SQL注入攻击也成了黑客对数据库进行攻击的常用手段之一。但是由于使用这种模式编写代码的程序员水平有限,相当大一部分程序员在编程的时候,没有考虑用户输入数据的合法性问题,使得应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQLInjection,即SQL注入。正文:一、SQL注入攻击的背景:在信息技术高速发展的今天,各种各样复杂的威胁网站技术也同时快速的“发展”,让2人们防不胜防。他们利用网络的安全漏洞进行各种恶意活动,如账号盗用、私密信息截获、带宽资源占用等。严重破坏了网络的正常健康运行,危害十分严重。网站威胁的目标定位有多个维度,可以是个人、公司、某种行业,甚至国家、地区、性别、种族、宗教等。通常情况下攻击会采用多种形态,如病毒、蠕虫、特洛伊、间谍软件等或是他们的复合形态。可以分为内部攻击和外部攻击两类:内部攻击主要来自信任网络,可能是用户执行了未授权访问或是无意中定制了恶意攻击。外部攻击主要是由于网络漏洞被利用或者用户受到恶意程序制定者的专一攻击。二、SQL注入攻击的概念SQL注入攻击源于英文“SQLInjectionAttack”。目前还没有看到一种标准的定义,常见的是对这种攻击形式、特点的描述。微软技术中心从2个方面进行了描述:脚本注入式的攻击。恶意用户输入用来影响被执行的SQL脚本。SQL注入攻击就其本质而言,他利用的工具是SQL的语法,针对的是应用程序开发者编程过程中的漏洞。“当攻击者能够操作数据,往应用程序中插入一些SQL语句时,SQL注入攻击就发生了”。SQL注入攻击是指黑客利用一些Web应用程序(论坛,留言本,文章发布系统)中某些疏于防范的用户可以提交或修改的数据的页面,精心构造Sql语句,把特殊的SQL指令语句插入到系统实际SQL语句中并执行它,以获取用户密码等敏感信息,以及获取主机控制权限的攻击方法。三、SQL注入攻击特点广泛性SQL注入攻击利用的是SQL语法,因此只要是利用SQL语法的Web应用程序如果未对输入的SQL语句做严格的处理都会存在SQL注入漏洞,目前以Active/JavaServerPages、ColdFusionManagement、PHP、Perl等技术与SQLServer、Oracle、DB2、Sybase等数据库相结合的Web应用程序均发现存在SQL注入漏洞。技术难度不高SQL注入技术公布后,网络上先后出现了多款SQL注入工具,例如啊D、教主的HDSI、NBSI、明小子的Domain等,利用这些工具软件可以轻易地对存在SQL注入的网站或者Web应用程序实施攻击,并最终获取其计算器的控制权。危害性大SQL注入攻击成功后,轻者只是更改网站首页等数据,重者通过网络渗透等攻击技术,可以获取公司或者企业机密数据信息,产生重大经济损失。四、SQL注入攻击的实现原理SQL注入攻击主要是通过构建特殊的输入,这些输入往往是SQL语法中的一些组合,这些输入将作为参数传入Web应用程序,通过执行SQL语句而执行入侵者的想要的操作,下面以登录验证中的模块为例,说明SQL注入攻击的实现方法。3在Web应用程序的登录验证程序中,一般有用户名(username)和密码(password)两个参数,程序会通过用户所提交输入的用户名和密码来执行授权操作。其原理是通过查找user表中的用户名(username)和密码(password)的结果来进行授权访问,典型的SQL查询语句为:Select*fromuserswhereusername='admin'andpassword='smith’如果分别给username和password赋值“admin'or1=1--”和“aaa”。那么,SQL脚本解释器中的上述语句就会变为:select*fromuserswhereusername=’admin’or1=1--andpassword=’aaa’该语句中进行了两个判断,只要一个条件成立,则就会执行成功,而1=1在逻辑判断上是恒成立的,后面的“--”表示注释,即后面所有的语句为注释语句。同理通过在输入参数中构建SQL语法还可以删除数据库中的表,查询、插入和更新数据库中的数据等危险操作:(1)droptableauthors—如果存在authors表则删除。(2)unionselectsum(username)fromusers—从users表中查询出username的个数(3)insertintousersvalues(666,'attacker','foobar',0xffff)—在user表中插入值(4)unionselect@@version,1,1,1--查询数据库的版本(5)execmaster..xp_cmdshell'dir'通过xp_cmdshell来执行dir命令五、SQL注入攻击实现过程SQL注入攻击可以手工进行,也可以通过SQL注入攻击辅助软件如HDSI、Domain、NBSI等,其实现过程可以归纳为以下几个阶段:(1)寻找SQL注入点寻找SQL注入点的经典查找方法是在有参数传入的地方添加一些特殊字符,通过浏览器所返回的错误信息来判断是否存在SQL注入,如果返回错误,则表明程序未对输入的数据进行处理,绝大部分情况下都能进行注入。(2)获取和验证SQL注入点找到SQL注入点以后,需要进行SQL注入点的判断。(3)获取信息获取信息是SQL注入中一个关键的部分,SQL注入中首先需要判断存在注入点的数据库是否支持多句查询、子查询、数据库用户账号、数据库用户权限。(4)实施直接控制以SQLServer2000为例,如果实施注入攻击的数据库是SQLServer2000,且数据库用户为sa,则可以直接添加管理员账号、开放3389远程终端服务、生成文件等命令。(5)间接进行控制间接控制主要是指通过SQL注入点不能执行DOS等命令,只能进行数据字段内容的猜测。在Web应用程序中,为了方便用户的维护,一般都提供了后台管理功能,其后台管理4验证用户和口令都会保存在数据库中,通过猜测可以获取这些内容,如果获取的是明文的口令,则可以通过后台中的上传等功能上传网页木马实施控制,如果口令是明文的,则可以通过暴力破解其密码。六、常见SQL注入攻击及防御方法绕过网站的身份认证一个登陆界面,需要输入用户名和密码,然后Post到另一个页面,进行身份认证,此时进行身份认证的代码如下:username=Request.form(username)password=Request.form(password)sql=select3fromadminwhereusername=’&use2name&’andpassword=’&password&’rs.opensql,conn,0,3ifnotrs.eofthensession(login)=trueResponse.redirect(next.asp)endif从上面的代码中可以看出,程序在得到用户的数据之后,没有进行任何的过滤和处理,直接用来构成SQL语句,其危险性是最高的,攻击者只要根据SQL语句的编写规则就可以跳过身份认证,方法如下:攻击者只需在用户名和密码的输入框中都输入’or’1’=’1的内容,那么攻击者就可以不经过不任何认证而直接进入next.asp页面,并拥有和正常登陆用户一样的全部特权。原因是什么呢?我们比较一下正常用户登陆和攻击者登陆时的两句SQL语句:(1)正常用户(用户名为grace,密码为1111):sql=select3fromadminwhereusername=’grace’andpassword=’1111’(2)攻击者(用户名和密码都为’or’1’=’1):sql=select3fromadminwhereusername=’’or’1’=’1’andpassword=’’or’1’=’1’可以看到由and连接的两个条件都被一个永远成立的’1’=’1’所代替,执行的结果为真,因此服务器也会认为条件成立,于是把login标志设为true,让攻击者以合法身份登陆进入next.asp页面。解决的办法:其实解决的办法很简单,有两种解决的办法。1.通用的办法是对用户提交的数据先进行过滤,把单引号和双引号全部过滤掉,再进行SQL语句的构造,这样就大大降低了攻击者成功的概率,具体代码如下:5username=Replace(Request.form(username),’,)password=Replace(Request.form(password),’,)sql=select3fromadminwhereusername=’&username&’andpassword=’&password&’rs.opensql,conn,0,3ifnotrs.eofthensession(login)=trueResponse.redirect(next.asp)endif2.第二种办法是把一句SQL查询分为两句写,先通过用户名判断数据库中是否存在该用户,如果不存在,直接退回登陆界面,如果存在,再进行密码的校验工作,具体代码如下:username=Request.form(username)password=Request.form(password)sql=select3fromadminwhereusername=’&use2name&’rs.opensql,conn,0,3ifrs.eofthenResponse.redirect(login.asp)ElseifRs(password)=passwordthenResponse.redirect(next.asp)endifendif对数据库系统进行读取、插入、修改等操作如一个商品查询页面find_product.asp?id=1,程序设计者原本设计意图是显示id为1的商品信息,而攻击者利用程序中没有对id的内容进行检查之机,插入自己的代码。从find_product.asp中摘录两句最关键的语句:sql=select3fromproductwhereproductid=’&re2quest(id)&’rs.opensql,conn,0,3可以看到,id没有进行任何的处理,直接构成SQL语句并执行,而攻击者在知道该系统的数据库中表及表中字段名称的情况下(目前网上免费的论坛系统或是商业网站代码非常多),利用SQL语句特性(分号是将两句SQL语句分开的符号),直接向数