一次次的SQL注射入侵,一次次的网站被黑,总是那句话,漏洞在所难免,难道一点办法都没吗?这篇文章就是为大家解析下SQL注 射的原理,以及给出一些预防方法。
一:基础篇
分析下漏洞产生的原因,主要还是参数没完全过滤。
cntid = Request("cntid") " n& d4 B" q! I( M0 w
这样的语句就存在一个注入攻击,首先,没验证是否为整数& N# Y# G$ g, ]1 i$ C% k
解决方法:) I' Y0 Y; ]) ~4 r0 H& Z2 f
<% dim cntid+ `4 r% B9 q* r* _! n
cntid =replace(request("cntid "),"","")
if (not isnumeric(cntid)) then# @9 V: E8 P% T5 s) x: X
call error
response.end
end if
sub Error()
response.write " <table align=center width=300 border=0 0 t7 T& g( F. U; n. W0 m
cellpadding=4 cellspacing=0 >"9 n4 }5 i8 ~3 F# S4 H2 A0 t r
response.write " <tr > "
response.write " <td colspan=2 height=15> "
response.write " <div align=center>
操作: 参数错误!</div>"
response.write " </td>"9 f4 q# Y0 o. _+ x. a p% J
response.write " </tr>"+ x. w1 ]+ h* ?0 I/ K/ `- A! T
response.write " <tr> "- M: p" I* F' k/ W1 M+ K4 d4 @, q. {
response.write " <td colspan=2 height=23> "
response.write " <div align=center><br><br>"
response.write " 参数错误!!!非法探测已经被记录 <br><br>". G9 z# @% v# s S# W6 @2 e; ?
response.write " <a href=javascript
nclick=history.go(-1)>返回</a>" 4 {# o0 b( S% v2 H
response.write " <br><br></div></td>"* E2 \4 Y7 ~" O2 T- ?: R
response.write " </tr> </table></body></html>"
end sub
%>* h6 J3 A g) s4 N& e1 a% v
1 ^) u; p' h: o9 t+ M
这是一个最基础的过滤,如果提交非法参数效果如图1:
5 x& Z" C' c& F, |( w- ~" r; _
那么我们还需要注意什么?
用户名的注册,必须过滤掉一些特殊符号,继续刚才的话题,我们假设是username.2 Q! ]& N9 Z. y; a( K! s
<% dim username
username =replace(request("username "),"","")
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 5 K( j4 V/ l. `0 X" W
Instr(username,",")>0 or Instr(username,"")>0 or Instr(username,",")>0 or Instr7 Y6 |( e' H$ |) s9 x" Y
(username,chr(34))>0 or Instr(username,chr(9))>0 or Instr(username,"?")>0 or t" T9 m( o3 m# M2 p
Instr(username,">")>0 or Instr(username,"<")>0 or Instr(username,"$")>0 or Instr U3 ?9 B( G0 O
(username,"#")>0 or Instr(username,"@")>0 then
call error8 ~5 x- h0 s, G: M
response.end
end if9 m0 q; B' k! t- G+ B
sub Error()
response.write " <table align=center width=300 border=0
cellpadding=4 cellspacing=0 >"
response.write " <tr > "
response.write " <td colspan=2 height=15> "0 @+ \9 L( p. r( \: t; U
response.write " <div align=center>操作: 参数错( F M$ l/ @' w
误!</div>"
response.write " </td>"
response.write " </tr>"
response.write " <tr> "
response.write " <td colspan=2 height=23> "4 B l' m! u% P1 k# P
response.write " <div align=center><br><br>"
response.write " 用户名中含有非法字符(“=”,“%”,
“?”,“&”,“;”,“,”,“”,”?”,“>”,“<”,“$”,“#”,“@”) <br><br>") q& v, q& h8 I5 ^; H* ~7 e
response.write " <a
href=javascript
nclick=history.go(-1)>返回</a>" 5 t& U+ K7 j, Y4 a4 h3 |
response.write " <br><br></div></td>"
response.write " </tr> </table></body></html>" + r: f. e$ Q& e% i
end sub* F. x( o, n$ @9 c# ^( K
%>
利用这个原理,我们还能过滤一些可能存在cookies跨站脚本的地方:: K: F* s% X* b/ A K, M
只要过滤cookie,java这样的字眼,方法同上。需要注意的事,类似与用户登陆的地方,用户名一定要username =replace(request("username "),"",""),意思就是把’过滤成”,这样做的目的就是预防’ or ‘’=’这样的入侵。1 J/ j) _6 B' o, y8 X
可是如果类似www.xx.com/list.asp? action = search
我们可以这样过滤
<% action=request("action")1 ?7 v; ~$ {1 s: x: C5 j6 X% |
select case action
case "search"
call search()
case else: | G+ |! O+ }: {, R$ v
call search()
end select
sub search ()
这里是search的内容 1 f* C' p9 a8 _/ V, h4 p7 K
end sub4 B& T( H, p8 J6 V' w6 e$ d$ Z7 E
%>
大家可以看到无论对错,都执行search。这样也可以预防SQL。8 N. f. N7 v8 I9 K q
二:密码安全
采用不可逆加密是必须的选择,防止别人探测到密码后暴力破解,MD5用艿氖迪址浅<虻ィ?姹闳フ腋鯩D5函数体,很多源代码都 带。5 g/ S0 a) d. Y8 k/ k7 n
<!-- #include file=" md5.asp" --> 这里是引入MD5函数5 L9 @& J# [- {7 i4 M
<% dim username6 D, |9 _: M$ j+ W
username =md5(md5(replace(request("username "),"","")))
%>$ n6 P$ Z0 x5 H1 a/ L
这里就实现了2次MD5加密,一般2-3次就足够了,暴力破解比较困难:), C/ i- i( z9 H9 y o
COOKIES欺骗问题很严重,所以一般后台管理员一定要session验证。实现方法
我们在登入成功后写入
session("btadmin")=rsadmin("admin")2 O8 [3 d* s8 Y* X, Y
建立一个验证函数cookies.asp7 X6 K& }; h/ U4 Y0 H/ n! P/ A8 S% V
内容如下' j: H: v5 a% h$ `8 m) V
<%: b8 D B& d" n# t' j& t' s
if session("btadmin")="" then1 v5 Q1 b9 q _0 I
response.redirect "admin.asp"# m, x [4 Z8 j$ o6 `
end if" a$ i6 t+ u: j3 L- \
%>
在每个管理员操作文件的开头加上
<!--#include file="cookies.asp" -->! O/ H! M" j: E9 ] C1 Y
这样就可以预防非法登陆了:)
我们经常看到验证码这样的东西,这样做是为了预防暴力破解。
实现方法,假设登入为login.asp0 ?# `. s, v8 C- h9 Y$ w
我们在开头加:
<%
dim p, c5 p5 D2 }6 N
randomize ‘对随机数生成器做初始化的动作' f' [7 y. ^4 }3 ^9 `2 h$ |8 e
p = Int((8999 * Rnd) + 1000) " g* }( f6 d( S: _4 K! J
session("cntcode")=p %>& p. P, x& \& y4 r, t
; [1 R: T5 @' i
插入验证代码的表格
<tr>
<td valign=middle>请输入验证码</td>) P0 V1 a: B! e3 m! t9 [$ [8 m
<td valign=middle>4 E' R5 m! C' s$ L( a( |. s
<INPUT name=yanzhen type=text>+ _$ y; R, a) y
在左边框输入: <%=session("cntcode")%></td></tr>) V, b/ J- T9 { b- D- u
$ p! z5 L/ X# I2 `! v9 z; t' E' U) t
最后验证程序:* i9 `9 ^. T. X+ z1 p; G$ Z
<%
if request("yanzhen")="" or trim(session("cntcode"))) L7 R: A2 Y q4 C8 z
<>trim(replace(request("yanzhen"),"","")) then
response.write " 请正确输入您的验证码。"5 J2 b; ?; H9 d5 y5 q$ s5 i' p
response.end X1 U1 [9 U5 S( L9 m- R" e
else ^/ w6 u& R4 K. Y* W7 y
%>
程序运行效果如图2:
/ B, f- k' y: W7 [
三:数据库安全 N+ W: @ U3 D) K
爆库的方法越来越多,我们来看下:如图3: e0 X4 V* {5 H( y( A9 }" [
1 x* N+ j0 V: I! P( P2 {3 V9 {
按X档案以前文章一位大侠说的,将/替换为 %5c,确实很多网站都存在这样的漏洞。大家可以清楚的看到数据库地址。
偶什么方法可以预防呢?/ s$ T/ `) j5 {
。。。(代码见杂志)。。。。。。。。。。。
这是一个数据库连接文件,大部分为conn.asp
关键在与on error resume next出错了也执行下一句
我们看下他的运行效果。
# {) ]# X# p b( F$ V5 i! Z
除了图片显示不正常外,没暴露数据库:)' t- Q* D J5 T+ j: Y" k
其实浪心建议用WIN2003做服务器,当你用%5c 来替换的时候* d( P& Z2 g0 S) h
_blank>http://127.0.0.1/fourm.asp?cntid=4
自动换成%5cfourm.asp/多个/
_blank>http://127.0.0.1%5cfourm.asp/?cntid=4* m P7 L: d2 o R
找不到服务器,唯一的结果,更厉害:)) \# x! b! z* q' ?& H$ p' z/ M
还有一种方法就是不让对方下载数据库
方法是0 q- A2 d# p) L2 K( Z
新建一个notdown表,字段为nodown, 数据类型为ole 如图4
' E4 D1 t) M9 X5 G @
保存为mdb.mdb
OK,我们写个nodown.asp4 c- Z" _% `6 {" {+ @
代码如下! j& Z4 ]5 P. a# E
。。。(代码见杂志)。。。。。。。。。。。' w% @0 W/ F& i6 Z- N
把他同数据库一同上传到你的空间,或者本地做个IIS,运行nodown.asp8 k/ _1 h4 X9 p% n; Q2 o' c
提示添加记录成功。
OK,把数据库重新命名为mdb.asp' j/ p! S5 v7 B: Y/ M; q; U+ U
直接在浏览器里输入数据库地址:提示& }; [4 ~) b% y6 ^
Active Server Pages 错误 ASP 0116 5 L. Y- k( j( f1 u
丢失脚本关闭分隔符
/bbs/cntlovebbs.asp,行 44042
Script 块缺少脚本关闭标记(%>)。 6 t0 L3 M. Y5 V1 `* U+ Y, m
用快车下载提示HTTP 500错误
OK到这里数据库安全也过去了:)下面说下浪心新的思维:)没任何技术难度,会VB的都会写:)
四:安全的后台登入
。。。(代码见杂志)。。。。。。。。。。。3 |9 ~* w9 Z( {; o B- T) B' o) ?- @
OK了:)程序简单的出奇,他的功能可不小哦:)你的网站可以比以前安全许多。
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |