ASP程序安全-如何防止sql注入

在做安全配置前,我们先了解一下入侵者的攻击手法。现在很流行注入攻击,所谓注入攻击,就是利用提交特殊地址将ASP中引用的正常SQL语句和入侵者所需要的SQL语句一并执行,使入侵者达到入侵的目的。现在更是有一些脚本注入工具发布,使菜鸟也可以轻松完成对ASP的注入攻击。那么我们先来了解一下这些工具是怎样注入的。
'J V J Z.];X A @ A0首先,入侵者会对一个网站确定可不可以进行注入,假设一篇文章的地址为:http://www.scccn.com/news.asp?id=1一般会以提交两个地址来测试,如:
O L:x T ?%~8H ]-k-g0http://www.scccn.com/news.asp?id=1 and 1=1
b t1P0w o j7^ ?/a9W Z0http://www.scccn.com/news.asp?id=1 and 1=2
X1K%L#r%S;D*I+e0h0第一个地址后面加了 and 1=1,构成的SQL语句也就变为了:Select * from 表单名 where id=1 and 1=1这句话要成立就必须and前后语句都成立。那么前面的文章地址是可以访问的,后面的1=1也是客观成立的,那么第一个地址就可以正常显示;相反1=2是显然不成立的,关键就看这步了,如果提交and 1=2页面还是正常显示说明他并没有将and 1=2写入SQL语句,此站也就不存在注入漏洞;但如果提交and 1=2之后返回了错误页面则说明此站点将后面的语句带入了SQL语句并执行了,也就说明他可以进行SQL注入。(注:如果地址后面跟的是news.asp?id='1'就得变为news.asp?id=1' and '1'='1来补全引号了) linux博客 X {1O$j Z
那么,知道可以注入后入侵者可以做什么呢? linux博客 e0} y u S ~ H/g E&{ w
这里就简单的说一下,比如提交这样的地址:
]Z%b M:l [ z4g M0http://www.scccn.com/news.asp?id=1 and exists (select * from 表名 where 列名=数据) linux博客 K t8d P r I'B f T i
根据返回的正确或错误页面来判断猜的表名和列名是否正确,具体实现时是先猜表名再猜列名。当猜出表名和列名之后还可以用ASC和MID函数来猜出各列的数据。MID函数的格式为:mid(变量名,第几个字符开始读取,读取几个字符),比如:mid(pwd,1,2)就可以从变量pwd中的第一位开始读取两位的字符。ASC函数的格式为:ASC("字符串"),如:asc("a")就可以读出字母a的ASCII码了。那么实际应用的时候就可以写为:asc(mid(pwd,1,1))这样读取的就是pwd列的第一个字符的ASCII码,提交: asc(mid(pwd,1,1))>97以返回的页面是否为正确页面来判断pwd列的第一个字符的ASCII码是否大于97(a的ASCII码),如果正确就再试是否小于122(z的ASCII码)……这样慢慢缩小字符的ASCII码的范围,猜到真实的ASCII码也只是时间的问题。一位一位的猜就可以得到数据库中的用户名和密码了。还有一种ASP验证缺陷——就是用户名和密码都输'or '1'='1,构造SQL语句Select * form 表单名 where username='' or '1'='1' and pwd='' or '1'='1'就可以达到绕过密码验证的目的。
J G:k i w ? y x0说了那么多,其实防范的方法很简单,我们把特殊字符(如and、or、'、")都禁止提交就可以防止注入了。ASP传输数据分为get和post两种, get是通过将数据添加到URL后提交的方式,post则是利用邮寄信息数据字段将数据传送到服务器。 linux博客-N&k q x Q w2_/`4w L
那么,我们先来看看如何将get方式提交数据中的特殊字符过滤。首先要知道,IIS是以字符串的形式将get请求传给asp.dll的,在将数据传递给Request.QueryString之后,asp解析器会解析出Request.QueryString的信息,然后跟据"&"来分出各个数组内的数据。现在我们要让get方式不能提交以下字符:
*?9])q I i e S5| d0'、and、exec、insert、select、delete、update、count、*、%、chr、mid、master、truncate、char、declare linux博客!j o7W Z B9G d W3n
那么,防止get方式注入的代码就如下: linux博客 M v9L%~&W%p WL r d
<% linux博客*g)` o(G%[
dim sql_leach,sql_leach_0,Sql_DATA linux博客2^ ^ H!w c ? } g Hz o
sql_leach = "',and,exec,insert,select,delete,update,count,*,%, linux博客'zO Y0b.s P,n
chr,mid,master,truncate,char,declare" linux博客&o'eQ D T
sql_leach_0 = split(sql_leach,",")
{ m1L w i&ma J0If Request.QueryString<>"" Then linux博客 d v0a O./#l
For Each SQL_Get In Request.QueryString
.S r9/1W b x0For SQL_Data=0 To Ubound(sql_leach_0) linux博客}1f P b _ j v
if instr(Request.QueryString(SQL_Get),sql_leach_0(Sql_DATA))>0 Then
d%k)A5`*P M'Q6r W0Response.Write "
请不要尝试进行SQL注入!"
/ p#m N.i H N w0Response.end
7a w7`.H k { n#A0end if
$y/P%R4c m0w x&] e0next linux博客 n&i L"o n o$i W L!w R
Next
,y g Q'u(}-z-|0End If linux博客 K$].@ k T I;D
%>

其中,变量sql_leach中的字符串就是指定过滤的字符,以","隔开。
-P W ` q A0接着过滤post提交方式的注入,我们可以看到,request.form也是以数组形式存在的,只要对它再进行一次循环判断就可以了。防止以post方式注入的ASP代码如下:

<%
K7V"X ~ N!h G S;v0If Request.Form<>"" Then
v'` ` ^ L$y*k e X0For Each Sql_Post In Request.Form linux博客!R y/z A N
For SQL_Data=0 To Ubound(sql_leach_0)
d v m"{8? S s Q$J8N0if instr(Request.Form(Sql_Post),sql_leach_0(Sql_DATA))>0 Then linux博客 l j v'P j G G-K
Response.Write "
请不要尝试进行SQL注入!"
4E3V a&~ O'x0Response.end
)` _ _1W6g'@ / I0end if linux博客,@%I%q _ w k&Y y Q
next linux博客 F ` F a2m
next linux博客 {5V8W w3P
end if linux博客 r L } [2?%i
%>

这样,get和post注入都被禁止了。 linux博客 B v/Z m2X I'm
另外就是数据库的问题,首先现在很流行的用*.asp命名数据库已经没什么意义了,因为可以用下载软件来下载;在数据库名前加#的作用也不大,虽然访问时浏览器只访问#前面的内容,但是如果将#用其unicode表达法(%23)替换掉就可以访问了。既然这样,那么我们禁止入侵者暴库就可以了。一般暴数据库的方法,是将读取数据库的文件名(如conn.asp)前的"/"替换为"% 5c "("/"的unicode表达法)这样就可以使ASP将% 5c 解释为访问网站根目录,而实际是数据库不在指定位置,找不到数据库,再将IE设置为"显示友好的HTTP错误信息"的情况下自然就暴出了数据库的路径。 linux博客#Z R D.n j*P t V
防范的方法也比较简单,就是让ASP程序即使在出错的情况下也不报错直接执行下一步就可以了。在ASP文件中加这么一句:on error resume next就OK了。
R T9c p D1u0还有几点要注意的: linux博客6L c6f)t [.{ H
1.数据库命名长些并尽量放在网站根目录下,数据库的表名和字段名尽量不合常规;linux博客%q / / f k6] i
2.保存敏感信息(如用户和密码)的数据库尽量和在前台页面引用的数据库分开(如果用新的暴库方法由前台页面暴出了数据库,那么入侵者也得不到有价值的信息);linux博客 u P ^ o ?-o m F
3.后台的目录名和登陆页面的名字要改的不寻常些,千万不可出现admin或者login之类的字符,以免被注入软件扫描到后台。linux博客 c$h6/#b ? z9g%/ J
4.如果前台或后台有上传文件的功能,切记不能有任何其他功能直接的或间接的拥有更改文件名的权限。
n ^;a!Na I G z m1S0这样的多重保障就更加安全些了。

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值