SQL注入攻击漏洞研究与防范措施论文正稿Word格式文档下载.docx
《SQL注入攻击漏洞研究与防范措施论文正稿Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《SQL注入攻击漏洞研究与防范措施论文正稿Word格式文档下载.docx(9页珍藏版)》请在冰豆网上搜索。
(1)droptableauthors—如果存在authors表则删除。
(2)unionselectsum(username)fromusers—从users表中查询出username的个数。
(3)insertintousersvalues(666,′attacker′,′foobar′,0xffff)—在user表中插入值。
(4)unionselectversion,1,1,1--查询数据库的版本。
(5)execmaster.xp_cmdshell′dir′通过xp_cmdshell来执行dir命令。
1.2SQL注入攻击分析
SQL注入可以说是一种漏洞,也可以说是一种攻击。
当程序中的变量处理不当,对用户提交的数据过滤不足,都可能产生这个漏洞。
它的攻击原理就是利用用户提交或可修改的数据,把想要的SQL语句插入到系统实际SQL语句中,轻则获得敏感的信息,重则控制服务器。
例如Web应用有一个登录页面,这个登录页面控制着用户是否有权访问应用,要求用户输入一个名称和密码。
攻击者在用户名字和密码输入框中输入1'
or'
1'
='
1之类的容。
该容提交给服务器之后,服务器运行上面的代码构造出查询用户的SQL命令,但由于攻击者输入的容非常特殊,所以最后得到的SQL命令变成:
“select*fromuserswhereusername='
'
or'
andpassword='
'
”。
服务器执行查询或存储过程,将用户输入的身份信息和服务器中保存的身份信息进行对比,由于SQL命令实际上已被注入式攻击修改,已经不能真正验证用户身份,所以系统会错误地授权给攻击者。
SQL注入是通过目标服务器的80端口进行的,这和普通的Web页面访问没什么两样,所以一般的防火墙不会对这种攻击发出警告或拦截。
这种攻击可能引起的危害取决于该的软件环境和配置。
当Web服务器以操作员的身份访问数据库时,利用SQL注入攻击就可能删除所有表格,创建新表格。
而当管理员以超级用户的身份访问数据库时,利用SQL注入攻击就可能控制整个SQL服务器,在某些配置下攻击者甚至可以自行创建用户账号以完全操作数据库所在的服务器。
SQL注入的方法很多,而且在攻击时会碰到各种各样的SQL语句,所以一般攻击者需要丰富的经验和耐心,才能绕过一些检测和处理提交构造的SQL语句,从而获得想要的有用信息。
这个过程需要花费很多的时间,如果仅以这种手动方式进行SQL注入攻击的话,许多存在SQL注入漏洞的ASP会安全很多了,不是漏洞不存在了,而是利用这个漏洞入侵的成本太高了。
但现在攻击者可用一些现成的黑客工具来辅助SQL注入攻击,加快入侵的速度。
由于SQL注入攻击利用的是SQL语法,使得这种攻击具有广泛性。
理论上说,对于所有基于SQL语言标准的数据库软件都是有效的,包括MSSQLServer,Oracle,DB2,Sybase,MySQL等。
当然,各种软件有自身的特点,最终的攻击代码可能不尽相同。
1.3SQL注入攻击过程
(1)绕过身份认证机制
一个登录界面,需要输入用户名和密码,然后Post到另一个页面,进行身份认证,因此攻击者只需在用户名和密码的输入框中都输入"
’or’1’=’1"
的容,那么攻击者就可以不经过任何认证而直接进入下一个页面,并拥有和正常登录用户一样的全部特权。
原因是什么呢?
我们比较一下正常用户登录和攻击者登录时的两种SQL语句:
1)正常用户(用户名为grace,密码为1111):
SQL="
select3fromadminwhereusername=’grace’andpassword=’1111’
2)攻击者(用户名和密码都为"
’or’1’=’1"
):
select3fromadminwhereusername=’’or’1’=’1’andpassword=’’or’1’=’1’
可以看到由and连接的两个条件都被一个永远成立的’1’=’1’所代替,执行的结果为真,因此服务器也会认为条件成立,于是把login标志设为true,让攻击者以合法身份登录进入下一个页面。
(2)对数据库系统进行读取、插入、修改等操作
如一个商品查询页面findproduct.asp?
id=1,程序设计者原本设计意图是显示id为1的商品信息,而攻击者利用程序中没有对id的容进行检查之机,插入自己的代码。
从findproduct.asp中摘录两句最关键的语句:
select3fromproductwhereproductid=’"
&
request("
id"
)&
"
’"
rs.openSQL,conn,0,3
可以看到,id没有进行任何的处理,直接构成SQL语句并执行,而攻击者在知道该系统的数据库中表及表中字段名称的情况下(目前网上免费的论坛系统或是商业代码非常多),利用SQL语句特性(分号是将两句SQL语句分开的符号),直接向数据库中添加记录:
findproduct.asp?
id=1;
Insertinto"
admin"
(’username’,’password’,’type’)values(’hacker’,’pass123456’,’管理员’),然后攻击者就可以直接用刚才建立的进行登录了。
通过这样的方法,攻击者还可以对系统做任何的事情,包括增加、修改、删除记录。
(3)执行系统命令
如果Web主机使用MSSQL数据库系统,而list.asp中存在注入点,那么攻击者就可以用到xp_cmdshell这个扩展存储过程,xp_cmdshell是一个非常有用的扩展存储过程,用于执行系统命令,比如dir,net等,攻击者可以根据程序的不同,提交不同的语句:
www.XXX.comö
list.asp?
?
exec?
master.dbo.xp_cmdshell?
’dir’
.XXX.comö
master.xp_cmdshell?
或者可以插入下面的语句
netuserhacker/add
netlocalgroupadministratorshacker/add
来向Web主机系统中加入一个非法的管理员,不过这样的做法必须同时满足几个条件,首先ASP使用的SQLSERVER必须是管理员,其次请求的提交变量在整个SQL语句的最后,否则构造出来的SQL语句在语法上是错误的,也就不可能执行成功。
2.SQL注入攻击的检测方式及方法
2.1检测方式
SQL注入攻击检测分为入侵前的检测和入侵后的检测。
入侵前的检测,可以通过手工方式,也可以使用SQL注入工具软件。
检测的目的是为预防SQL注入攻击,而对于SQL注入攻击后的检测,主要是针对日志的检测,SQL注入攻击成功后,会在IIS日志和数据库中留下“痕迹”。
2.2检测方法
(1)输入验证检查
动态的SQL语句是一个进行数据库查询的强大的工具,但把它和用户输入混合在一起就使SQL注入成为了可能。
将动态的SQL语句替换成预编译的SQL或者存储过程对大多数应用程序是可行的。
预编译的SQL或者存储过程可以将用户的输入作为参数而不是SQL命令来接收,这样就限制了入侵者的行动。
当然,它不适用于存储过程中利用用户输入来生成SQL命令的情况。
在这种情况下,用户输入的SQL命令仍可能得到执行,数据库仍然有受SQL注入攻击的危险。
如果一个输入框只可能包括数字,那么要通过验证确保用户输入的都是数字。
如果可以接受字母,那就要检查是不是存在不可接受的字符。
确保应用程序要检查以下字符:
分号、等号、破折号、括号以及SQL关键字。
(2)数据检查
使用HDSI、NBSI和Domain等SQL注入攻击软件工具进行SQL注入攻击后,都会在数据库中生成一些临时表。
通过查看数据库中最近新建的表的结构和容,可以判断是否曾经发生过SQL注入攻击。
(3)日志检查
在Web服务器中如果启用了日志记录,则IIS日志会记录访问者的IP地址,访问文件等信息,SQL注入攻击往往会大量访问某一个页面文件(存在SQL注入点的动态网页),日志文件会急剧增加,通过查看日志文件的大小以及日志文件中的容,也可以判断是否发生过SQL注入攻击。
(4)其他
SQL注入攻击成功后,入侵者往往会添加用户、开放3389远程终端服务以及安装木马后门等,可以通过查看系统管理员账号、远程终端服务器开启情况、系统最近日期产生的一些文件等信息来判断是否发生过入侵。
3.SQL注入攻击防模型及措施
3.1防模型
在前人提出的SQL注入攻击的检测/防御/备案模型基础上,本人进行了检测过程的优化,提出了一种SQL自动防模型如图1所示,本模型中所有检测都在服务器端进行。
首先对IP地址进行检测,如果该IP地址在SQL注入攻击库中,则禁止该用户的访问,并再次将相关信息添加到SQL注入攻击库中;
如果用户是首次访问,则对提交字符进行检测,如果是非法字符,则检测是否达到规定的访问值,如果达到则禁止用户访问,同时发送给系统管理员。
本模型可以防止攻击者穷举攻击并可自由设置攻击次数的上限,一旦到达上限,系统将自动发送给管理员,管理员收到后可以进行相应的处理,如果条件允许,还可以增加短信发送,增强SQL注入攻击的自动防能力。
图1
本模型的最大特点是自动将攻击信息及时地传递给管理员,方便管理员及时做出响应。
核心代码如下:
substopit()
response.write"
存在禁止访问ip地址:
&
rs("
ip"
)
response.end
response.redirect"
noright.asp"
endsub
dimattack_browser,attack_ip,attack_host
attack_browser=Request.ServerVariables("
Http_User_Agent"
attack_ip=Request.ServerVariables("
ReMote_Addr"
attack_host=Request.ServerVariables("
Remote_Host"
setrs1=server.createobject("
adodb.recordset"
)'
从访问禁止ip中查询是否存在访问者的IP地址,如果存在则禁止其访问
SQL1="
selectipfromprohibit_ipwhereip=′"
attack_ip&
"
′"
rs1.openSQL1,conn,1,3
ifnotrs1.eofthen
callstopit()
endif
rs1.close
setrs1=nothing'
从系统防设置中查出email地址和运行的访问次数
setrs2=server.createobject("
SQL2="
select*fromD_setup"
rs2.openSQL2,conn,1,3
ifnotrs2.eofthen
session("
email"
)=rs2("
ok_count"
rs2.close
setrs2=nothing
url=Request.ServerVariables("
Query_String"
callchk(url)'
从Attack_count表中获取A_count的次数,如果A_count次数不小于默认的访问次数则禁止
ifchk(url)then
setrs3=server.createobject("
SQL3="
selectA_countfromattack_count"
rs3.openSQL3,conn,1,3
ifnotrs3.eofthen
ifrs3("
A_count"
)>
=session("
)then'
插入攻击记录信息到attack_record表中
t1_SQL1="
insertintoAttack_record(ip,Attacktime,Host,Browser)value(′"
′,now(),′"
attack_host&
′,′"
attack_browser&
′)"
setrsdel=conn.execute(t1_SQL1)
ok=Jmail(session("
),"
SQL注入攻击告警!
"
攻击者IP地址:
attack_ip)
else
temp_a_count=rs3("
a_count"
)+1'
插入攻击ip和a_count信息到Attack_count表中
t1_SQL2="
insertintoAttack_count(ip,A_count)value(′"
′,′"
temp_a_count&
setrsdel=conn.execute(t1_SQL2)
3.2防措施
SQL注入攻击防方法目前已经有很多,总结起来有以下方法:
(1)在服务端正式处理之前对提交数据的合法性进行检查。
另外限制表单或查询字符串输入的长度也是一个好方法。
如果用户的登录名字最多只有10个字符,那么不要认可表单中输入的10个以上的字符,这将大大增加攻击者在SQL命令中插入有害代码的难度。
(2)封装客户端提交信息;
(3)替换或删除敏感字符/字符串。
使用双引号替换掉所有用户输入的单引号,这个简单的预防措施将在很大程度上预防SQL注射攻击,单引号常常结束掉SQL语句,可能给予输入者不必要的权力。
用双引号替换掉单引号可以使许多SQL注入攻击失败。
如:
“select*fromuserswhereusername=or1=1andpassword=or1=1”显然会得到与“select*fromuserswhereusername='
andpassword='
”不同的结果。
(4)屏蔽出错信息。
攻击者有时从客户端提交特殊的代码,根据IIS给出的出错提示信息来收集程序及服务器的信息,从而获取想得到的资料。
如果把IIS设置成不管出什么样的ASP错误,只给出一种错误提示信息,那么攻击者就没办法入侵了。
(5)不要用字串连接建立SQL查询,而使用SQL变量,因为变量不是可以执行的脚本。
(6)目录最小化权限设置,给静态网页目录和动态网页目录分别设置不同权限,尽量不给写目录权限;
(7)修改或者去掉Web服务器上默认的一些危险命令,例如ftp、cmd、wscript等,需要时再复制到相应目录;
(8)将用户登录名称、密码等数据加密保存,然后再将它与数据库中保存的数据比较,这相当于对用户输入的数据进行了“消毒”处理,用户输入的数据不再对数据库有任何特殊的意义,从而也就防止了攻击者注入SQL命令。
数据敏感信息非常规加密,通常在程序中对口令等敏感信息加密都是采用md5函数进行加密,即密文=md5(明文),本文推荐在原来的加密的基础上增加一些非常规的方式,即在md5加密的基础上附带一些值,如密文=md5(md5(明文)+123456)。
(9)数据库最小权利法则。
应用程序使用的连接数据库的账户应该只拥有必需的特权,这样有助于保护整个系统尽可能少的受到入侵者的危害。
通过限制用户权限,隔离了不同账户可执行的操作,用不同的用户账户执行查询、插入、更新、删除操作,可以防止原本用于执行SELECT命令的地方却被用于执行INSERT、UPDATE或DELETE命令。
应用程序不应该用SA或者管理员账户去连接数据库。
作为替代,它应该只有访问它要调用的单个库的权力。
4.结束语
SQL注入攻击在网上非常普遍,许多ASP、PHP论坛和文章管理系统、下载系统以及新闻系统都存在这个漏洞。
由于SQL注入攻击针对的是应用开发过程中的编程不严密,因而对于绝大多数防火墙来说,这种攻击是“合法”的,问题的解决只有依赖于完善编程。
此外,也可以使用现有的SQL注入漏洞扫描器对整个中的关键代码进行扫描,查找页面中存在的SQL注入攻击点。
对于有问题的页面,可以及时删除或更新。
本文通过对SQL注入攻击的方法、原理以及攻击实施过程进行了阐述和总结,并给出了一些常见的SQL注入攻击防的方法。
参考文献
[1]高永强郭世泽网络安全技术与应用大典人民邮电2003.3
[2]匀等网络渗透测试-保护网络安全的技术、工具和过程电子工业2007.12
[3]温鹏滕大鹏仲治国七剑黑客入门工具实例演练100电子音像2005.10
[4]SQL注入攻击及其防检测技术研究tech.ddvip./2008-11/7859_6.html宁可累死在路上,也不能闲死在家里!
宁可去碰壁,也不能面壁。
是狼就要练好牙,是羊就要练好腿。
什么是奋斗?
奋斗就是每天很难,可一年一年却越来越容易。
不奋斗就是每天都很容易,可一年一年越来越难。
能干的人,不在情绪上计较,只在做事上认真;
无能的人!
不在做事上认真,只在情绪上计较。
拼一个春夏秋冬!
赢一个无悔人生!
早安!
—————献给所有努力的人.