论文部分内容阅读
摘要:该文简要介绍了SQL注入攻击的原理,并针对SQL注入的方法,给出了SQL注入攻击的防御方法。
关键词:ASP;SQL注入;防范技术;网络安全
中图分类号:TP393文献标识码:A文章编号:1009-3044(2008)27-1996-02
Protective Artifice for SQL Injection Based on ASP Website
ZHANG Hao-yu,LI Ming-hao,WANG Yu-xin,SHAN Wei-wei
(Liaoning Province Meteorology Information and Technical Support Center, Shenyang 110016, China)
Abstract: The text Introduces elements of SQL Injection and advances protective artifice to aim at SQL Injection.
Key words: ASP; SQL injection; keep away; network safety
1 引言
随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。
2 SQL注入原理
SQL是一种用于关系数据库的结构化查询语言。它分为许多种,但大多数都松散地基于美国国家标准化组织最新的标准SQL-92。SQL语言可以修改数据库结构和操作数据库内容。当一个攻击者能够通过往查询中插入一系列的SQL操作数据写入到应用程序中去,并对数据库实施了查询,这时就已经构成了SQL-Injection。所谓SQL注入(SQL Injection),就是利用某些Web应用程序对用户输入数据的合法性检测不严或不检测的特点,故意从客户端提交一段特殊的数据库查询代码,根据程序返回的结果,达到收集程序、数据库及服务器的信息,获取想得到而通过正常途径无法得到的资料,使整个网站服务器失控甚至对网站进行破坏性攻击的目的。
程序存在SQL注入,追其原因,是因为代码或者编码的不完善。但说到底,是程序员的惰性。代码的不完善,往往是因为在程序编写的过程中,没有考虑到代码的健壮性及安全性的结果,就国内现状来看,大多数网站使用的脚本语言,用ASP Access或SQLServer的占70%以上,PHP MySQL占20%,其他的不足10%,由于开发者代码编写的过程考虑不够周全,往往忽略程序代码的安全性,而使程序脚本被注入也成为必然。从攻击者的角度来看,使用SQL注入能够避免绝大多数防火墙的防御,不留攻击痕迹,攻击手法多种多样,因此才会导致SQL注入攻击手段的兴起。
SQL注入通过网页对网站数据库进行修改。它能够直接在数据库中添加具有管理员权限的用户,从而最终获得系统管理员权限。黑客可以利用获得的管理员权限任意获得网站上的文件或者在网页上加挂木马和各种恶意程序,对网站的正常运营和访问该网站的网友都带来巨大危害。
3 SQL注入防御
SQL注入是从正常的WWW端口通过对页面请求访问,而且表面看起来跟一般的Web页面访问没什么区别,所以目前市面的防火墙很少会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被入侵很长时间都不会发觉。SQL注入的手法相当灵活,可以根据具体情况进行分析,构造巧妙的SQL语句,从而获取想要的数据。针对SQL攻击的防御,现在各网站经常采用的方法,主要有以下一些解决的方法:
3.1 检验敏感字符/字符串
有些程序员采取针对一些敏感的字符串,主要是对SQL命令或关键字进行处理,把它们从客户端提交的信息中找到、删除,并把剩余的信息默认为安全信息写入数据库。虽然在一定程度上有效,但有“治标不治本”的嫌疑,举例来说明他的弱点,当客户端的输入为“…ccmdmcmdd…”时,在对敏感字符串“cmd”替换删除以后,剩下的字符正好是“…cmd…”。新的攻击方式正在被不断发现,只要允许服务端程序使用这些提交信息,就总有受到攻击的可能。可见这个方法是不健全的,稍加变化即可躲过检察。
其实,最好的方法就是一旦检测到敏感字符/字符串,只要把它们屏蔽,并针对数据库的操作即行中止。具体代码如下:
function RequestX(strGet)
strTemp=Request.Form(strGet)
dim nothis(16)
nothis(0)="net user"
nothis(1)="xp_cmdshell"
nothis(2)="/add"
nothis(3)="exec master.dbo.xp_cmdshell"
nothis(4)="net localgroup administrators"
nothis(5)="select"
nothis(6)="count"
nothis(7)="asc"
nothis(8)="char"
nothis(9)="mid"
nothis(10)="’"
nothis(11)=""""
nothis(12)="insert"
nothis(13)="delete"
nothis(14)="drop"
nothis(15)="truncate"
nothis(16)="from"
for i=1 to ubound(nothis)
if instr(strTemp,nothis(i)) then
Response.write "你输入的内容含有非法字符!"
Response.write "请返回重试"
Response.End
end if
next
RequestX=strTemp
end function
将上述代码封装在一个asp文件中,在网页代码中可直接调用。对于纯数字的信息传递,可采用数字检验,不是数字便停止操作。应sql注入检测,主要过滤掉“’”。具体函数代码如下:
Function ReqNum (StrName)
ReqNum = Request (StrName)
if Not isNumeric (ReqNum) then
Response.Write "参数必须为数字型!"
Response.End
End if
End Function
Function ReqStr (StrName)
ReqStr = Replace (Request(StrName), "’", "’’" )
End Function
这两个函数在页面中直接调用即可。
3.2 查堵form或cookies的漏洞
既然攻击者是通过form或cookies提交包含“or”和“=” 等特殊字符,那么我们的防范措施就是在这部分程序中加入检查或过滤这些特殊字符的代码,以实现安全目的。方法是在使用: paraname=Request.form()或paraname=Request. Cookies()获取用户名和密码后加入代码:
If instr(paraname," ")>0 or instr(paraname," or ")>0 or instr(paraname,"=")>0 or instr(paraname,"'")>0 or instr(paraname,";")>0 then
Response.Write "<Script Language=JavaScript>alert('用户参数中含有非法字符串!'); history.back();</Script>"
Response.End
End If
含义:假如在用户参数paraname中找到了(空格)
关键词:ASP;SQL注入;防范技术;网络安全
中图分类号:TP393文献标识码:A文章编号:1009-3044(2008)27-1996-02
Protective Artifice for SQL Injection Based on ASP Website
ZHANG Hao-yu,LI Ming-hao,WANG Yu-xin,SHAN Wei-wei
(Liaoning Province Meteorology Information and Technical Support Center, Shenyang 110016, China)
Abstract: The text Introduces elements of SQL Injection and advances protective artifice to aim at SQL Injection.
Key words: ASP; SQL injection; keep away; network safety
1 引言
随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。
2 SQL注入原理
SQL是一种用于关系数据库的结构化查询语言。它分为许多种,但大多数都松散地基于美国国家标准化组织最新的标准SQL-92。SQL语言可以修改数据库结构和操作数据库内容。当一个攻击者能够通过往查询中插入一系列的SQL操作数据写入到应用程序中去,并对数据库实施了查询,这时就已经构成了SQL-Injection。所谓SQL注入(SQL Injection),就是利用某些Web应用程序对用户输入数据的合法性检测不严或不检测的特点,故意从客户端提交一段特殊的数据库查询代码,根据程序返回的结果,达到收集程序、数据库及服务器的信息,获取想得到而通过正常途径无法得到的资料,使整个网站服务器失控甚至对网站进行破坏性攻击的目的。
程序存在SQL注入,追其原因,是因为代码或者编码的不完善。但说到底,是程序员的惰性。代码的不完善,往往是因为在程序编写的过程中,没有考虑到代码的健壮性及安全性的结果,就国内现状来看,大多数网站使用的脚本语言,用ASP Access或SQLServer的占70%以上,PHP MySQL占20%,其他的不足10%,由于开发者代码编写的过程考虑不够周全,往往忽略程序代码的安全性,而使程序脚本被注入也成为必然。从攻击者的角度来看,使用SQL注入能够避免绝大多数防火墙的防御,不留攻击痕迹,攻击手法多种多样,因此才会导致SQL注入攻击手段的兴起。
SQL注入通过网页对网站数据库进行修改。它能够直接在数据库中添加具有管理员权限的用户,从而最终获得系统管理员权限。黑客可以利用获得的管理员权限任意获得网站上的文件或者在网页上加挂木马和各种恶意程序,对网站的正常运营和访问该网站的网友都带来巨大危害。
3 SQL注入防御
SQL注入是从正常的WWW端口通过对页面请求访问,而且表面看起来跟一般的Web页面访问没什么区别,所以目前市面的防火墙很少会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被入侵很长时间都不会发觉。SQL注入的手法相当灵活,可以根据具体情况进行分析,构造巧妙的SQL语句,从而获取想要的数据。针对SQL攻击的防御,现在各网站经常采用的方法,主要有以下一些解决的方法:
3.1 检验敏感字符/字符串
有些程序员采取针对一些敏感的字符串,主要是对SQL命令或关键字进行处理,把它们从客户端提交的信息中找到、删除,并把剩余的信息默认为安全信息写入数据库。虽然在一定程度上有效,但有“治标不治本”的嫌疑,举例来说明他的弱点,当客户端的输入为“…ccmdmcmdd…”时,在对敏感字符串“cmd”替换删除以后,剩下的字符正好是“…cmd…”。新的攻击方式正在被不断发现,只要允许服务端程序使用这些提交信息,就总有受到攻击的可能。可见这个方法是不健全的,稍加变化即可躲过检察。
其实,最好的方法就是一旦检测到敏感字符/字符串,只要把它们屏蔽,并针对数据库的操作即行中止。具体代码如下:
function RequestX(strGet)
strTemp=Request.Form(strGet)
dim nothis(16)
nothis(0)="net user"
nothis(1)="xp_cmdshell"
nothis(2)="/add"
nothis(3)="exec master.dbo.xp_cmdshell"
nothis(4)="net localgroup administrators"
nothis(5)="select"
nothis(6)="count"
nothis(7)="asc"
nothis(8)="char"
nothis(9)="mid"
nothis(10)="’"
nothis(11)=""""
nothis(12)="insert"
nothis(13)="delete"
nothis(14)="drop"
nothis(15)="truncate"
nothis(16)="from"
for i=1 to ubound(nothis)
if instr(strTemp,nothis(i)) then
Response.write "你输入的内容含有非法字符!"
Response.write "请返回重试"
Response.End
end if
next
RequestX=strTemp
end function
将上述代码封装在一个asp文件中,在网页代码中可直接调用。对于纯数字的信息传递,可采用数字检验,不是数字便停止操作。应sql注入检测,主要过滤掉“’”。具体函数代码如下:
Function ReqNum (StrName)
ReqNum = Request (StrName)
if Not isNumeric (ReqNum) then
Response.Write "参数必须为数字型!"
Response.End
End if
End Function
Function ReqStr (StrName)
ReqStr = Replace (Request(StrName), "’", "’’" )
End Function
这两个函数在页面中直接调用即可。
3.2 查堵form或cookies的漏洞
既然攻击者是通过form或cookies提交包含“or”和“=” 等特殊字符,那么我们的防范措施就是在这部分程序中加入检查或过滤这些特殊字符的代码,以实现安全目的。方法是在使用: paraname=Request.form()或paraname=Request. Cookies()获取用户名和密码后加入代码:
If instr(paraname," ")>0 or instr(paraname," or ")>0 or instr(paraname,"=")>0 or instr(paraname,"'")>0 or instr(paraname,";")>0 then
Response.Write "<Script Language=JavaScript>alert('用户参数中含有非法字符串!'); history.back();</Script>"
Response.End
End If
含义:假如在用户参数paraname中找到了(空格)