SQL注入攻击及其防范检测技术研究
陈小兵 【antian365.com
摘要:本文简要介绍了SQL注入攻击的原理,SQL注入攻击实现过程,配合网页木马实施网络入侵的方法,给出了SQL注入攻击的检测方法,并在此基础上给出了一种SQL注入攻击的自动防范模型。
关键词:SQL注入攻击 防范检测技术 网页木马
1  SQL注入攻击概述
1.1  SQL注入技术定义
SQL注入(SQL Injection)技术在国外最早出现在1999年,我国在2002年后开始大量出现,目前没有对SQL注入技术的标准定义,微软中国技术中心从2个方面进行了描述[1]
1)脚本注入式的攻击
2)恶意用户输入用来影响被执行的SQL脚本
Chris AnleySQL注入[2]定义为,攻击者通过在查询操作中插入一系列的SQL语句到应用程序中来操作数据。Stephen Kost[3]给出了SQL注入的一个特征,“从一个数据库获得未经授权的访问和直接检索”。利用SQL注入技术来实施网络攻击常称为SQL注入攻击,其本质是利用Web应用程序中所输入的SQL语句的语法处理,针对的是Web应用程序开发者编程过程中未对SQL语句传入的参数做出严格的检查和处理所造成的。习惯上将存在SQL注入点的程序或者网站称为SQL注入漏洞。实际上,SQL注入是存在于有数据库连接的应用程序中的一种漏洞,攻击者通过在应用程序中预先定义好的查询语句结尾加上额外的SQL语句元素,欺骗数据库服务器执行非授权的查询。这类应用程序一般是基于Web的应用程序,它允许用户输入查询条件,并将查询条件嵌入SQL请求语句中,发送到与该应用程序相关联的数据库服务器中去执行。通过构造一些畸形的输入,攻击者能够操作这种请求语句去获取预先未知的结果。
1.2  SQL注入攻击特点
SQL注入攻击是目前网络攻击的主要手段之一,在一定程度上其安全风险高于缓冲区溢出漏洞,目前防火墙不能对SQL注入漏洞进行有效地防范。防火墙为了使合法用户运行网络应用程序访问服务器端数据,必须允许从InternetWeb服务器的正向连接,因此一旦网络应用程序有注入漏洞,攻击者就可以直接访问数据库进而甚至能够获得数据库所在的服务器的访问权,因此在某些情况下,SQL注入攻击的风险要高于所有其他漏洞[5][6][7]SQL注入攻击具有以下特点:
1)广泛性。SQL注入攻击利用的是SQL语法,因此只要是利用SQL语法的Web应用程序如果未对输入的SQL语句做严格的处理都会存在SQL注入漏洞,目前以Active/Java Server Pages Cold Fusion Management PHPPerl等技术与SQL ServerOracleDB2Sybase等数据库相结合的Web应用程序均发现存在SQL注入漏洞。
2)技术难度不高。SQL注入技术公布后,网络上先后出现了多款SQL注入工具,例如教主的HDSINBSI、明小子的Domain等,利用这些工具软件可以轻易地对存在SQL注入的网站或者Web应用程序实施攻击,并最终获取其计算器的控制权。
3)危害性大,SQL注入攻击成功后,轻者只是更改网站首页等数据,重者通过网络渗透等攻击技术,可以获取公司或者企业机密数据信息,产生重大经济损失。
2  SQL注入攻击的实现原理
2.1  SQL注入攻击实现原理     
结构化查询语言(SQL)是一种用来和数据库交互的文本语言,SQL Injection就是利用某些数据库的外部接口把用户数据插入到实际的数据库操作语言当中,从而达到入侵数据库乃至操作系统的目的。它的产生主要是由于程序对用户输入的数据没有进行细致的过滤,导致非法数据的导入查询[8]
SQL注入攻击主要是通过构建特殊的输入,这些输入往往是SQL语法中的一些组合,这些输入将作为参数传入Web应用程序,通过执行SQL语句而执行入侵者的想要的操作,下面以登录验证中的模块为例,说明SQL注入攻击的实现方法。
Web应用程序的登录验证程序中,一般有用户名(username)和密码(password)两个参数,程序会通过用户所提交输入的用户名和密码来执行授权操作。其原理是通过查找user表中的用户名(username)和密码(password)的结果来进行授权访问,典型的SQL查询语句为:
Select * from users where username='admin' and password='smith’
如果分别给usernamepassword赋值“admin' or 1=1--”和“aaa”。 那么,SQL脚本解释器中的上述语句就会变为:
select * from users where username=’admin’ or 1=1-- and password=’aaa’
该语句中进行了两个判断,只要一个条件成立,则就会执行成功,而1=1在逻辑判断上是恒成立的,后面的“--”表示注释,即后面所有的语句为注释语句。同理通过在输入参数中构建SQL语法还可以删除数据库中的表,查询、插入和更新数据库中的数据等危险操作:
1jo'; drop table authors—如果存在authors表则删除。
2' union select sum(username) from users—users表中查询出username的个数
3'; insert into users values( 666, 'attacker', 'foobar', 0xffff )—user表中插入值
4' union select @@version,1,1,1--查询数据库的版本
5'exec master..xp_cmdshell 'dir' 通过xp_cmdshell来执行dir命令
2.2.  SQL注入攻击实现过程
SQL注入攻击可以手工进行,也可以通过SQL注入攻击辅助软件如HDSIDomainNBSI等,其实现过程可以归纳为以下几个阶段:
1)寻找SQL注入点;寻找SQL注入点的经典查找方法是在有参数传入的地方添加诸如“and  1=1and 1=2以及“”等一些特殊字符,通过浏览器所返回的错误信息来判断是否存在SQL注入,如果返回错误,则表明程序未对输入的数据进行处理,绝大部分情况下都能进行注入。
2)获取和验证SQL注入点;找到SQL注入点以后,需要进行SQL注入点的判断,常常采用2.1中的语句来进行验证。
3)获取信息;获取信息是SQL注入中一个关键的部分,SQL注入中首先需要判断存在注入点的数据库是否支持多句查询、子查询、数据库用户账号、数据库用户权限。如果用户权限为sa,且数据库中存在xp_cmdshell存储过程,则可以直接转(4)。
4)实施直接控制;以SQL Server 2000为例,如果实施注入攻击的数据库是SQL Server 2000,且数据库用户为sa,则可以直接添加管理员账号、开放3389远程终端服务、生成文件等命令。
5)间接进行控制。间接控制主要是指通过SQL注入点不能执行DOS等命令,只能进行数据字段内容的猜测。在Web应用程序中,为了方便用户的维护,一般都提供了后台管理功能,其后台管理验证用户和口令都会保存在数据库中,通过猜测可以获取这些内容,如果获取的是明文的口令,则可以通过后台中的上传等功能上传网页木马实施控制,如果口令是明文的,则可以通过暴力破解其密码。
3  SQL注入攻击检测方法与防范
3.1  SQL注入攻击检测方法
SQL注入攻击检测分为入侵前的检测和入侵后的检测,入侵前的检测,可以通过手工方式,也可以使用SQL注入工具软件。检测的目的是为预防SQL注入攻击,而对于SQL注入攻击后的检测,主要是针对日志的检测,SQL注入攻击成功后,会在IIS日志和数据库中留下“痕迹”。   
1)数据库检查
使用HDSINBSIDomainSQL注入攻击软件工具进行SQL注入攻击后,都会在数据库中生成一些临时表。通过查看数据库中最近新建的表的结构和内容,可以判断是否曾经发生过SQL注入攻击。
2IIS日志检查
Web服务器中如果启用了日志记录,则IIS日志会记录访问者的IP地址,访问文件等信息,SQL注入攻击往往会大量访问某一个页面文件(存在SQL注入点的动态网页),日志文件会急剧增加,通过查看日志文件的大小以及日志文件中的内容,也可以判断是否发生过SQL注入攻击。
3)其它相关信息判断
SQL注入攻击成功后,入侵者往往会添加用户、开放3389远程终端服务以及安装木马后门等,可以通过查看系统管理员账号、远程终端服务器开启情况、系统最近日期产生的一些文件等信息来判断是否发生过入侵。
3.2 一般的SQL注入攻击防范方法
SQL注入攻击防范方法目前已经有很多,总结起来有下面一些:
1 在服务端正式处理之前对提交数据的合法性进行检查;
2 封装客户端提交信息;
3 替换或删除敏感字符/字符串;
4 屏蔽出错信息。
5)不要用字串连接建立SQL查询,而使用SQL变量,因为变量不是可以执行的脚本;
6)目录最小化权限设置,给静态网页目录和动态网页目录分别设置不同权限,尽量不给写目录权限;
7)修改或者去掉Web服务器上默认的一些危险命令,例如ftpcmdwscript等,需要时再复制到相应目录;
8)数据敏感信息非常规加密,通过在程序中对口令等敏感信息加密都是采用md5函数进行加密,即密文=md5(明文),本文推荐在原来的加密的基础上增加一些非常规的方式,即在md5加密的基础上附带一些值,如密文=md5(md5(明文)123456)
4  SQL注入攻击防范模型
4.1SQL注入攻击防范模型
在前人提出的SQL 注入攻击的检测/防御/备案模型基础上[8][9], 我们进行了检测过程的优化,提出了一种SQL自动防范模型如图1所示,本模型中所有检测都在服务器端进行,首先对IP地址进行检测,如果该IP地址在SQL注入攻击库中,则禁止该用户的访问,并再次将相关信息添加到SQL注入攻击库中;如果用户是首次访问,则对提交字符进行检测,如果是非法字符,则检测是否达到规定的访问值,如果达到则禁止用户访问,同时发送邮件给系统管理员。本模型可以防止攻击者穷举攻击并可自由设置攻击次数的上限,一旦到达上限,系统将自动发送邮件给管理员,管理员收到邮件后可以进行相应的处理,如果条件允许,还可以增加短信发送,增强了SQL注入攻击的自动防范能力。
本模型的最大特点是自动将攻击信息及时的传递给管理员,方便管理员及时做出响应。
1 SQL注入攻击自动防范模型
   核心代码如下:
sub stopit()
  response.write "存在禁止访问ip地址:"&rs("ip")
  response.end
  response.redirect "noright.asp"
end sub
dim attack_browser,attack_ip,attack_host
attack_browser=Request.ServerVariables("Http_User_Agent")
attack_ip=Request.ServerVariables("ReMote_Addr")
attack_host=Request.ServerVariables("Remote_Host")
set rs1=server.createobject("adodb.recordset")
'从访问禁止ip中查询是否存在访问者的IP地址,如果存在则禁止其访问
sql1="select ip from prohibit_ip where ip='"&attack_ip&"'"
rs1.open sql1,conn,1,3
if not rs1.eof then
 call stopit()
end if
rs1.close
set rs1=nothing
'从系统防范设置中查出email地址和运行的访问次数
set rs2=server.createobject("adodb.recordset")
sql2="select * from D_setup"
rs2.open sql2,conn,1,3
if not rs2.eof then
  session("email")=rs2("email")
  session("ok_count")=rs2("ok_count")
end if
rs2.close
set rs2=nothing
url=Request.ServerVariables("Query_String")
call chk(url)
'Attack_count表中获取A_count的次数,如果A_count次数不小于默认的访问次数则禁止
if chk(url) then
set rs3=server.createobject("adodb.recordset")
sql3="select A_count from attack_count "
rs3.open sql3,conn,1,3
if not rs3.eof then
  if rs3("A_count")>=session("ok_count") then
                '插入攻击记录信息到attack_record表中
                 t1_sql1="insert into Attack_record(ip,AttacktimeHostBrowser) value('"&attack_ip&"',now()'"&attack_host&"''"&attack_browser&"')"
        set rsdel=conn.execute(t1_sql1)
      call stopit()
    ok=Jmail(session("email"),"SQL注入攻击告警!","攻击者IP地址:"& attack_ip )
  else
       temp_a_count=rs3("a_count")+1
       '插入攻击Ipa_count信息到Attack_count表中
       t1_sql2="insert into Attack_count(ip,A_count) value('"&attack_ip&"','"&temp_a_count&"')"
       set rsdel=conn.execute(t1_sql2)
  end if
end if
4.2使用方法
    所有代码均存入一个文件sqlinject.asp,只需要将该文件包含在需要防范的页面中即可;其中需要包含email.aspconn.asp二个文件,前者主要通过Jmail组件来发送email邮件,后者是调用数据库连接,本模型的所采用的数据库是SQL Server 2000
4.3实际应用效果分析
通过实际测试,当入侵者在网页提交一些非法字符达到指定次数后,系统会自动屏蔽掉该IP地址对网站的访问并将攻击IP地址、攻击时间、攻击者浏览器版本等信息写入到数据库中。当本模型存在一个缺陷:当攻击者在一个局域网时,一旦系统自动记录该地址后,其它使用该IP地址的非入侵用户也无法访问网站。本文采取的折衷办法是,在禁止的网页时留有email地址,如果发现是因为SQL入侵导致某个局域网(企业)不能访问网站,则可以通过删除数据库中禁止访问的IP地址,即可恢复正常访问。
5 结束语
    本文对SQL注入攻击的方法、原理以及攻击实施过程进行了阐述和总结,并给出了常见的一些SQL注入攻击防范方法。最后给出了一种SQL注入攻击自动防范模型,通过在实际项目中的使用,能够很好的进行主动防范,具有较高的实用价值。
参考文献:
[1]SQL Server 安全回顾,[url]http://www.microsoft.com/china/ctc/Newsletter/04/ctc2.htm[/url],2004
[2]Chris Anley, Advanced SQL Injection In SQL Server Applications ,[url]http://www.creangel.com/papers/advanced_sql_injection.pdf[/url], An NGS Software Insight Security Research (NISR) Publication, 2002
[3] David LitchfieldWeb Application Disassembly with ODBC Error Messages, [url]http://81.cgisecurity.com/lib/webappdis.doc[/url]
[4]Sam M.S. NG,SQLBlock: SQL Injection Protection by Variable Normalization of SQL Statement, [url]http://www.iem.pw.edu.pl/~kozlowk3/biblioteczka/www_SQL/SQL_Injection_Protection_by_Variable_Normalization_of_SQL_Statement.pdf[/url]
[5]Dimitris Geneiatakis, Georgios Kambourakis, Costas Lambrinoudakis,SIP Message Tampering THE SQL code INJECTION attack, [url]http://www.snocer.org/Paper/camera-ready_soft_com.pdf[/url]
[6]Pete Finnigan,SQL Injection and Oracle,2002.11.21 [url]http://www.oracledeveloper.nl/newforum/files/2002_11_21%20SecurityFocus%20SQL%20Injection%20and%20Oracle.pdf[/url]
[7]Cesar Cerrudo,Manipulating Microsoft SQL Server Using SQL Injection, [url]http://injection.rulezz.ru/Manipulating_SQL_Server_Using_SQL_Injection.pdf[/url]
[8]徐陋,姚国祥,SQL 注入攻击全面预防办法及其应用,微计算机信息,2006,3(3)18-20
[9]张勇,李力,薛倩,Web 环境下SQL 注入攻击的检测与防御,现代电子技术,2004,182(15), 105-107