您的位置:首页 > 数据库

SQL注入攻击及其防范检测

2009-07-24 10:57 585 查看
版权声明:
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处
、作者信息和本声明。否则将追究法律责任。/article/6931664.html

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
安全回顾
,http://www.microsoft.com/china/ctc/Newsletter/04/ctc2.htm,2004

[2]Chris
Anley, Advanced SQL Injection In SQL Server Applications
,http://www.creangel.com/papers/advanced_sql_injection.pdf,
An NGS Software Insight Security Research (NISR) Publication, 2002

[3] David Litchfield

Web Application Disassembly with ODBC Error Messages,

http://81.cgisecurity.com/lib/webappdis.doc

[4]Sam M.S. NG,SQLBlock: SQL Injection Protection by Variable Normalization of SQL Statement,

http://www.iem.pw.edu.pl/~kozlowk3/biblioteczka/www_SQL/SQL_Injection_Protection_by_Variable_Normalization_of_SQL_Statement.pdf

[5]Dimitris Geneiatakis, Georgios Kambourakis, Costas Lambrinoudakis,SIP Message Tampering THE SQL code INJECTION attack,

http://www.snocer.org/Paper/camera-ready_soft_com.pdf

[6]Pete Finnigan,SQL Injection and Oracle,2002.11.21

http://www.oracledeveloper.nl/newforum/files/2002_11_21%20SecurityFocus%20SQL%20Injection%20and%20Oracle.pdf

[7]Cesar Cerrudo,Manipulating Microsoft SQL Server Using SQL Injection,

http://injection.rulezz.ru/Manipulating_SQL_Server_Using_SQL_Injection.pdf

[8]
徐陋
,
姚国祥
,SQL
注入攻击全面预防办法及其应用
,
微计算机信息
,2006,3(3)

18-20

[9]
张勇
,
李力
,
薛倩
,Web
环境下
SQL
注入攻击的检测与防御
,
现代电子技术
,2004,182(15),

105-107

本文出自 “simeon技术专栏
” 博客,请务必保留此出处/article/6931664.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: