版权声明: 原创作品,允许转载,转载时请务必以超链接形式标明文章
原始出处 、作者信息和本声明。否则将追究法律责任。
http://simeon.blog.51cto.com/18680/112244
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 Anley 将 SQL 注入 [2] 定义为,攻击者通过在查询操作中插入一系列的 SQL 语句到应用程序中来操作数据。 Stephen Kost[3] 给出了 SQL 注入的一个特征,“从一个数据库获得未经授权的访问和直接检索”。利用 SQL 注入技术来实施网络攻击常称为 SQL 注入攻击,其本质是利用 Web 应用程序中所输入的 SQL 语句的语法处理,针对的是 Web 应用程序开发者编程过程中未对 SQL 语句传入的参数做出严格的检查和处理所造成的。习惯上将存在 SQL 注入点的程序或者网站称为 SQL 注入漏洞。实际上, SQL 注入是存在于有数据库连接的应用程序中的一种漏洞,攻击者通过在应用程序中预先定义好的查询语句结尾加上额外的 SQL 语句元素,欺骗数据库服务器执行非授权的查询。这类应用程序一般是基于 Web 的应用程序,它允许用户输入查询条件,并将查询条件嵌入 SQL 请求语句中,发送到与该应用程序相关联的数据库服务器中去执行。通过构造一些畸形的输入,攻击者能够操作这种请求语句去获取预先未知的结果。
1.2 SQL 注入攻击特点
SQL 注入攻击是目前网络攻击的主要手段之一,在一定程度上其安全风险高于缓冲区溢出漏洞,目前防火墙不能对 SQL 注入漏洞进行有效地防范。防火墙为了使合法用户运行网络应用程序访问服务器端数据,必须允许从 Internet 到 Web 服务器的正向连接,因此一旦网络应用程序有注入漏洞,攻击者就可以直接访问数据库进而甚至能够获得数据库所在的服务器的访问权,因此在某些情况下, SQL 注入攻击的风险要高于所有其他漏洞 [5][6][7] 。 SQL 注入攻击具有以下特点:
( 1 )广泛性。 SQL 注入攻击利用的是 SQL 语法,因此只要是利用 SQL 语法的 Web 应用程序如果未对输入的 SQL 语句做严格的处理都会存在 SQL 注入漏洞,目前以 Active/Java Server Pages 、 Cold Fusion Management 、 PHP 、 Perl 等技术与 SQL Server 、 Oracle 、 DB2 、 Sybase 等数据库相结合的 Web 应用程序均发现存在 SQL 注入漏洞。
( 2 )技术难度不高。 SQL 注入技术公布后,网络上先后出现了多款 SQL 注入工具,例如教主的 HDSI 、 NBSI 、明小子的 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’
如果分别给 username 和 password 赋值“ admin' or 1=1-- ”和“ aaa ”。 那么, SQL 脚本解释器中的上述语句就会变为:
select * from users where username=’admin’ or 1=1-- and password=’aaa’
该语句中进行了两个判断,只要一个条件成立,则就会执行成功,而 1=1 在逻辑判断上是恒成立的,后面的“ -- ”表示注释,即后面所有的语句为注释语句。同理通过在输入参数中构建 SQL 语法还可以删除数据库中的表,查询、插入和更新数据库中的数据等危险操作:
( 1 ) jo'; 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 注入攻击辅助软件如 HDSI 、 Domain 、 NBSI 等,其实现过程可以归纳为以下几个阶段:
( 1 )寻找 SQL 注入点;寻找 SQL 注入点的经典查找方法是在有参数传入的地方添加诸如“ and 1=1” 、“ and 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 )数据库检查
使用 HDSI 、 NBSI 和 Domain 等 SQL 注入攻击软件工具进行 SQL 注入攻击后,都会在数据库中生成一些临时表。通过查看数据库中最近新建的表的结构和内容,可以判断是否曾经发生过 SQL 注入攻击。
( 2 ) IIS 日志检查
在 Web 服务器中如果启用了日志记录,则 IIS 日志会记录访问者的 IP 地址,访问文件等信息, SQL 注入攻击往往会大量访问某一个页面文件(存在 SQL 注入点的动态网页),日志文件会急剧增加,通过查看日志文件的大小以及日志文件中的内容,也可以判断是否发生过 SQL 注入攻击。
( 3 )其它相关信息判断
SQL 注入攻击成功后,入侵者往往会添加用户、开放 3389 远程终端服务以及安装木马后门等,可以通过查看系统管理员账号、远程终端服务器开启情况、系统最近日期产生的一些文件等信息来判断是否发生过入侵。
3.2 一般的 SQL 注入攻击防范方法
SQL 注入攻击防范方法目前已经有很多,总结起来有下面一些:
( 1 ) 在服务端正式处理之前对提交数据的合法性进行检查;
( 2 ) 封装客户端提交信息;
( 3 ) 替换或删除敏感字符 / 字符串;
( 4 ) 屏蔽出错信息。
( 5 )不要用字串连接建立 SQL 查询,而使用 SQL 变量,因为变量不是可以执行的脚本;
( 6 )目录最小化权限设置,给静态网页目录和动态网页目录分别设置不同权限,尽量不给写目录权限;
( 7 )修改或者去掉 Web 服务器上默认的一些危险命令,例如 ftp 、 cmd 、 wscript 等,需要时再复制到相应目录;
( 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,Attacktime , Host , Browser) 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
' 插入攻击 Ip 和 a_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.asp 和 conn.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 Litchfield , Web 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
本文出自 “simeon技术专栏 ” 博客,请务必保留此出处http://simeon.blog.51cto.com/18680/112244