`
zprill
  • 浏览: 36533 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

SQL注入攻击及其防范检测技术研究

阅读更多

2008-12-18 来自:51CTO 作者:陈小兵

本文简要介绍了SQL注入攻击的原理,SQL注入攻击实现过程,并在此基础上给出了一种SQL注入攻击的自动防范模型。

1 SQL注入攻击概述

1.1 SQL注入技术定义

SQL注入(SQL Injection)技术在国外最早出现在1999年,我国在2002年后开始大量出现,目前没有对SQL注入技术的标准定义,微软中国技术中心从2个方面进行了描述:

(1)脚本注入式的攻击

(2)恶意用户输入用来影响被执行的SQL脚本

Chris Anley将SQL注入定义为,攻击者通过在查询操作中插入一系列的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注入攻击的风险要高于所有其他漏洞。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就是利用某些数据库的外部接口把用户数据插入到实际的数据库操作语言当中,从而达到入侵数据库乃至操作系统的目的。它的产生主要是由于程序对用户输入的数据没有进行细致的过滤,导致非法数据的导入查询。

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注入攻击自动防范模型,通过在实际项目中的使用,能够很好的进行主动防范,具有较高的实用价值。

分享到:
评论

相关推荐

    SQL注入攻击及其防范检测技术研究.pdf

    SQL注入攻击及其防范检测技术研究.pdf

    SQL注入攻击及其防范检测技术的研究.pdf

    SQL注入攻击及其防范检测技术的研究.pdf

    SQL注入攻击及其防范技术研究.pdf

    文章还提出了一种基于客户端和服务端的双向SQL注入攻击防范模型。这种模型强调了防范SQL注入攻击应当是多层面、多角度的。在客户端,可以通过前端安全策略减少攻击的发生,例如使用AJAX技术减少页面的全面刷新,从而...

    SQL注入攻击及其防范检测技术的研究 (1).pdf

    总之,SQL注入攻击是一种严重威胁,需要开发者和系统管理员充分了解其原理,并采取适当的预防和检测措施,以保护数据库系统的安全性。定期进行安全审计、更新补丁和持续的安全教育也是防止此类攻击的关键。

    SQL注入攻击原理及其防范技术研究.pdf

    综上所述,SQL注入攻击的原理和防范技术涉及到多个方面,包括攻击的定义、特点、实现原理、检测方法以及防范措施。通过对这些知识点的深入研究和掌握,可以更好地设计和实施有效的防御策略,以保护应用程序和数据库...

    SQL注入攻击原理与防范技术研究.pdf

    SQL注入攻击原理与防范技术研究 SQL注入攻击是一种常见的网络攻击方式,攻击者可以通过Injected恶意SQL代码来获取敏感数据或控制数据库。以下是SQL注入攻击的原理和防范技术研究: SQL注入攻击原理 SQL注入攻击是...

    SQL注入攻击及其预防方法研究

    SQL注入攻击是一种网络攻击技术,攻击者通过在Web表单输入或URL查询字符串中插入恶意SQL代码片段,试图操纵后端数据库执行非法的数据库操作。这种攻击方式可以用来窃取数据、修改数据库中的数据、执行管理操作(比如...

    SQL注入攻击与防范技术

    以下是对SQL注入攻击的详细解释及其防范技术: 1. 攻击方式: - **盲注**:攻击者通过判断性语句,如"1=1"或"1=2",来判断数据库结构或数据内容,而不直接返回结果。 - **联合查询注入**:攻击者利用已知的表名或...

    基于SQL注入的安全防范检测技术研究.pdf

    以下是对SQL注入攻击原理和防范技术的详细阐述。 SQL注入攻击的原理在于,攻击者在Web表单或其他输入字段中输入恶意的SQL代码片段,使得应用程序在构建数据库查询时,无意中将这些代码包含进去。例如,一个简单的...

    校园网SQL注入攻击与防范技术研究.pdf

    校园网SQL注入攻击与防范技术研究.pdf

    WEB应用的SQL注入攻击和防范技术研究.pdf

    WEB应用的SQL注入攻击和防范技术研究.pdf

    SQL注入攻击及防范技术研究.pdf

    7. 使用防火墙和入侵检测系统:这些工具可以识别和阻止SQL注入攻击的尝试。 SQL注入工具如Domain、AD、CASI、SQLmap、Burp Suite等,使得攻击变得更加便捷。它们自动化了注入过程,使得非专业人员也能实施攻击。...

    网络中SQL注入攻击与防范技术研究 (1).pdf

    网络中SQL注入攻击与防范技术研究 (1).pdf

    基于Web应用的SQL注入攻击与防范技术的研究.pdf

    以上内容均以中文呈现,详细讨论了SQL注入攻击的细节以及防范技术,涉及的知识点涵盖了Web安全领域的多个方面。通过对这些内容的深入研究,可以帮助相关开发人员和安全专家更好地理解并应对SQL注入攻击,从而保障Web...

    Python中防止sql注入的方法详解

    ### Python中防止SQL注入的方法详解 #### 前言 SQL注入是一种常见的网络安全攻击手段,攻击者通过在输入数据中嵌入恶意SQL代码,利用应用程序的漏洞执行...遵循这些原则,可以大大降低应用程序遭受SQL注入攻击的风险。

    SQL注入攻击与防范研究.pdf

    1. SQL注入攻击的定义和原理:SQL注入是一种常见的网络攻击技术,攻击者通过在Web应用程序的输入字段中插入恶意的SQL代码片段,从而控制或访问后端数据库。攻击者利用Web系统脚本语言处理用户输入时的缺陷,将用户...

    SQL注入攻击与防御

    为了防范SQL注入,本书《SQL注入攻击与防御》由专注于SQL注入安全研究的专家团队编写,内容涵盖所有与SQL注入攻击相关的信息。书中详细讨论了引发SQL注入的各种行为以及攻击者利用这些行为的方式,并提出了行之有效...

    SQL注入攻击技术及防范措施研究

    sql注入的背景与网络环境,技术分析,及攻击系统的设计与实现

Global site tag (gtag.js) - Google Analytics