一次次的SQL注射入侵,一次次的网站被黑,总是那句话,漏洞在所难免,难道一点办法都没吗?这篇文章就是为大家解析下SQL注 射的原理,以及给出一些预防方法。( v8 I, O( l* i: D( g
一:基础篇
分析下漏洞产生的原因,主要还是参数没完全过滤。2 X" `, p2 r- X# v0 Q4 z9 _$ [
cntid = Request("cntid")
这样的语句就存在一个注入攻击,首先,没验证是否为整数
解决方法:2 u1 ^4 K- _/ x( u
<% dim cntid
cntid =replace(request("cntid "),"","")1 F" W, n1 J9 J3 e
if (not isnumeric(cntid)) then
call error
response.end) ?5 d' l+ u" ]2 Y9 }/ G
end if/ {. }% @5 {( Z
sub Error()
response.write " <table align=center width=300 border=0 1 c6 C! _& j5 x
cellpadding=4 cellspacing=0 >"5 H! Y" d. \3 S3 c; Q$ L
response.write " <tr > "- L6 m+ K7 E3 B8 J
response.write " <td colspan=2 height=15> "
response.write " <div align=center># D" e! F, ]% k s4 F
操作: 参数错误!</div>"
response.write " </td>"% n2 e. A" C0 O8 K H% [
response.write " </tr>"4 I! h% Q2 m: {
response.write " <tr> "1 q; e- C6 @3 m: Q# b% r6 u a6 C9 K
response.write " <td colspan=2 height=23> "5 x& g3 |# Q8 B
response.write " <div align=center><br><br>"
response.write " 参数错误!!!非法探测已经被记录 <br><br>"
response.write " <a href=javascript
nclick=history.go(-1)>返回</a>" 9 L/ A) s N) }# X" c
response.write " <br><br></div></td>" ]6 R: H' y5 d& V9 `$ L# e7 p
response.write " </tr> </table></body></html>"
end sub
%>$ E }- U# \8 C/ z# I: ~% f
) f# v5 v. R' j+ e2 C
这是一个最基础的过滤,如果提交非法参数效果如图1:
. j3 X$ c3 v0 Q3 d& Q* F" S
那么我们还需要注意什么?
用户名的注册,必须过滤掉一些特殊符号,继续刚才的话题,我们假设是username.) K; v1 s1 c* g
<% dim username3 e: ]# K" c* u- a, b" U
username =replace(request("username "),"","")8 S6 L7 G/ \7 }" }/ [' t; b( R& ~
if Instr(username,"=")>0 or Instr(username,"%")>0 or Instr(username,chr(32))>0 or Instr(username,"?")>0 or Instr(username,"&")>0 or Instr(username,";")>0 or
Instr(username,",")>0 or Instr(username,"")>0 or Instr(username,",")>0 or Instr
(username,chr(34))>0 or Instr(username,chr(9))>0 or Instr(username,"?")>0 or
Instr(username,">")>0 or Instr(username,"<")>0 or Instr(username,"$")>0 or Instr3 s$ G7 g. H; k: h
(username,"#")>0 or Instr(username,"@")>0 then
' i9 ]* f. s* m g
call error
response.end+ Y$ o, Y# Q" F! Y" r. N8 i
end if, [# E7 ?0 d: m$ u: m
sub Error()7 T8 p) `' p# D0 N1 C) N( k B
response.write " <table align=center width=300 border=0 ! B; e& E$ d* r: g4 Y$ V
cellpadding=4 cellspacing=0 >"; a6 q+ O Q, `3 I( ?
response.write " <tr > "' `' R3 [% \* {7 Y) K
response.write " <td colspan=2 height=15> ": @7 j; S( T; N& }/ Z$ n
response.write " <div align=center>操作: 参数错
误!</div>"9 f5 \! d6 [. A/ ^% @7 D Y
response.write " </td>"
response.write " </tr>"( i- b. D1 |2 e& |8 I. i
response.write " <tr> "
response.write " <td colspan=2 height=23> "
response.write " <div align=center><br><br>"( r- N: z' ^% t8 `& l. ~- Q
response.write " 用户名中含有非法字符(“=”,“%”,' m# m# v/ Q+ L- C
“?”,“&”,“;”,“,”,“”,”?”,“>”,“<”,“$”,“#”,“@”) <br><br>"
response.write " <a ) z* q# ]) }5 L* S) n; j+ r
href=javascript
nclick=history.go(-1)>返回</a>" " Y5 @$ |2 S$ M
response.write " <br><br></div></td>"
response.write " </tr> </table></body></html>" * L$ m& d$ h% Y
end sub
%>5 A8 O- z, y9 Y& a+ j. z
利用这个原理,我们还能过滤一些可能存在cookies跨站脚本的地方:
只要过滤cookie,java这样的字眼,方法同上。需要注意的事,类似与用户登陆的地方,用户名一定要username =replace(request("username "),"",""),意思就是把’过滤成”,这样做的目的就是预防’ or ‘’=’这样的入侵。8 P) {/ g" F/ n: q% T
可是如果类似www.xx.com/list.asp? action = search
我们可以这样过滤' f! c0 [8 Z+ _% l
<% action=request("action")- J# f T" f/ A; J9 f4 r
select case action3 l( r% K3 R( W/ b
case "search"/ o( T) o L, w0 u# F
call search()- s/ v# ]- b5 s' W4 Q( M3 J
case else
call search()! u& K" C0 E3 g7 }( b0 t Y
end select* w& {* H& F- p
sub search ()
这里是search的内容
end sub
%>! q/ m3 m# Z! V) d* g
大家可以看到无论对错,都执行search。这样也可以预防SQL。- i" R2 Z; m; a% {( C
二:密码安全
采用不可逆加密是必须的选择,防止别人探测到密码后暴力破解,MD5用艿氖迪址浅<虻ィ?姹闳フ腋鯩D5函数体,很多源代码都 带。
<!-- #include file=" md5.asp" --> 这里是引入MD5函数3 c7 h9 [# c: E& G5 g3 j6 Q K, w
<% dim username. O% H' ~5 u2 U, [0 {2 B$ Z
username =md5(md5(replace(request("username "),"","")))$ N* |% r" d; t2 f& m/ C" b
%>8 Q- F) a; _. g0 S+ i* \
这里就实现了2次MD5加密,一般2-3次就足够了,暴力破解比较困难:); ^4 u4 p- L; l$ Z2 h7 Z
COOKIES欺骗问题很严重,所以一般后台管理员一定要session验证。实现方法
我们在登入成功后写入9 _" R+ e, {& T3 l9 w$ q
session("btadmin")=rsadmin("admin")
建立一个验证函数cookies.asp
内容如下1 I m; x% |: K. `7 q
<%+ }2 [% l* C- R- i! E1 S
if session("btadmin")="" then A. b7 J7 E" [& Z
response.redirect "admin.asp"
end if
%>
p4 v& |) z5 |' R% P
在每个管理员操作文件的开头加上
<!--#include file="cookies.asp" -->
这样就可以预防非法登陆了:)% f5 r4 F7 x( A
我们经常看到验证码这样的东西,这样做是为了预防暴力破解。
实现方法,假设登入为login.asp6 H: w* [% n. ?# y0 l) v- i
我们在开头加:/ I5 C" \5 U7 N( O. y. f% A
<%
dim p
randomize ‘对随机数生成器做初始化的动作
p = Int((8999 * Rnd) + 1000) 5 v$ X- J# g: a
session("cntcode")=p %>
6 e3 M" ~! Z1 n' B2 r9 g: ?
插入验证代码的表格
<tr>0 M5 q# t9 ]0 B+ N0 ^9 `
<td valign=middle>请输入验证码</td>
<td valign=middle>" A( e+ u9 d6 c' V8 D/ g
<INPUT name=yanzhen type=text>
在左边框输入: <%=session("cntcode")%></td></tr>
最后验证程序:
<%
if request("yanzhen")="" or trim(session("cntcode")) x* m# d8 A5 F) K) a8 B
<>trim(replace(request("yanzhen"),"","")) then: e: b- x; {# N& A$ a0 E: ~
response.write " 请正确输入您的验证码。"
response.end" ]% n* n" }* e, M$ f
else
%>
程序运行效果如图2:
三:数据库安全
爆库的方法越来越多,我们来看下:如图3* u5 d$ e; n+ U l5 x. H
按X档案以前文章一位大侠说的,将/替换为 %5c,确实很多网站都存在这样的漏洞。大家可以清楚的看到数据库地址。
偶什么方法可以预防呢?
。。。(代码见杂志)。。。。。。。。。。。
这是一个数据库连接文件,大部分为conn.asp
关键在与on error resume next出错了也执行下一句
我们看下他的运行效果。
除了图片显示不正常外,没暴露数据库:)
其实浪心建议用WIN2003做服务器,当你用%5c 来替换的时候( ~ W, Y2 ]4 I7 i1 [7 g% y6 ~
_blank>http://127.0.0.1/fourm.asp?cntid=4
自动换成%5cfourm.asp/多个/
_blank>http://127.0.0.1%5cfourm.asp/?cntid=4- L4 x E7 _. P- p0 V# k
找不到服务器,唯一的结果,更厉害:); B3 y+ G! N3 }: ]
还有一种方法就是不让对方下载数据库
方法是
新建一个notdown表,字段为nodown, 数据类型为ole 如图4
6 b: D6 w* \0 q
保存为mdb.mdb
OK,我们写个nodown.asp
代码如下2 X! j- Q0 W& ?2 B: ?
。。。(代码见杂志)。。。。。。。。。。。
把他同数据库一同上传到你的空间,或者本地做个IIS,运行nodown.asp4 r* k5 H, r; ^# ]- M' X5 b
提示添加记录成功。6 ?5 j0 ]# r4 j5 }3 K4 O
OK,把数据库重新命名为mdb.asp6 `; B; J# N7 t% `6 h! i$ V
直接在浏览器里输入数据库地址:提示7 [) e; f t7 c
Active Server Pages 错误 ASP 0116
丢失脚本关闭分隔符 $ W1 A- t1 r( A& W6 n. l
/bbs/cntlovebbs.asp,行 44042
Script 块缺少脚本关闭标记(%>)。 - _) J C! x" G C4 N5 K1 R
用快车下载提示HTTP 500错误
OK到这里数据库安全也过去了:)下面说下浪心新的思维:)没任何技术难度,会VB的都会写:)
四:安全的后台登入
。。。(代码见杂志)。。。。。。。。。。。
OK了:)程序简单的出奇,他的功能可不小哦:)你的网站可以比以前安全许多。 5 g- A8 W" }% N' V% h9 j* ~+ h
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |