一次次的SQL注射入侵,一次次的网站被黑,总是那句话,漏洞在所难免,难道一点办法都没吗?这篇文章就是为大家解析下SQL注 射的原理,以及给出一些预防方法。' e- P, K f# E" b
一:基础篇
分析下漏洞产生的原因,主要还是参数没完全过滤。; V) d8 ?9 X J8 Z) U+ m4 d
cntid = Request("cntid") ; q) B& ^ m. I2 S( [
这样的语句就存在一个注入攻击,首先,没验证是否为整数
解决方法:
<% dim cntid8 B- N1 j# m# Z. E* U& E' O
cntid =replace(request("cntid "),"","")
if (not isnumeric(cntid)) then' D2 }6 D' b" A/ w
call error
response.end
end if
sub Error()% p1 G+ J$ S$ F$ E
response.write " <table align=center width=300 border=0 , ^2 K+ O7 R5 y7 Q
cellpadding=4 cellspacing=0 >". V* Q$ I5 j9 u0 @2 I* L
response.write " <tr > "
response.write " <td colspan=2 height=15> "
response.write " <div align=center>% m+ i$ R r9 ]* Z. c% C
操作: 参数错误!</div>"
response.write " </td>"
response.write " </tr>"% l* J; ]/ f) H3 c
response.write " <tr> "
response.write " <td colspan=2 height=23> ", r- G: ~0 T4 R% t
response.write " <div align=center><br><br>"3 r W6 ]3 Q2 r7 ?1 y9 I: k# @0 I
response.write " 参数错误!!!非法探测已经被记录 <br><br>"
response.write " <a href=javascript
nclick=history.go(-1)>返回</a>" + o$ ^$ {1 }8 |* ^6 j
response.write " <br><br></div></td>"5 ?4 x( O! N) c M
response.write " </tr> </table></body></html>" * e, [+ b, t+ b& P, t
end sub, U# c2 z$ {* r" p" o) b6 A
%>
这是一个最基础的过滤,如果提交非法参数效果如图1:" Y1 l3 `1 R" J( |) ^. Y% a
那么我们还需要注意什么?. N0 S' |) N/ {7 l# \+ r
用户名的注册,必须过滤掉一些特殊符号,继续刚才的话题,我们假设是username.
<% dim username, o7 b% X& v1 x* Z+ p2 q% ?
username =replace(request("username "),"","") D6 [) L7 Y# l1 t, J2 d
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 Instr8 t+ u5 L" m0 p- P
(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 Instr
(username,"#")>0 or Instr(username,"@")>0 then
call error
response.end
end if' q4 f9 F1 B6 w9 |" F% P/ T0 y
sub Error()/ Q; j# H5 }( j7 z* }5 ^ s- h1 }6 k
response.write " <table align=center width=300 border=0 + _6 m, y2 e; X) K6 k+ T8 D! k
cellpadding=4 cellspacing=0 >" }2 R4 V, U5 w
response.write " <tr > "# H6 [% v5 Z0 s" b$ [% y' j, v
response.write " <td colspan=2 height=15> "3 u. ?4 {& x- [. L# `% Y9 ^1 a
response.write " <div align=center>操作: 参数错6 Z# I7 ~7 B" M1 U- U4 s
误!</div>"
response.write " </td>"
response.write " </tr>"; G0 {. Z% A: `0 u0 _
response.write " <tr> "- m& R' e9 s' W) t2 x
response.write " <td colspan=2 height=23> ", X5 |# [! ~- P2 h' i5 L. F
response.write " <div align=center><br><br>"( Y7 h* i( Z; W% L% k: Z
response.write " 用户名中含有非法字符(“=”,“%”,* `6 \" `- @% I: D+ b1 W8 H1 a
“?”,“&”,“;”,“,”,“”,”?”,“>”,“<”,“$”,“#”,“@”) <br><br>"; x5 v- z2 q) X- K6 H1 c: {
response.write " <a
href=javascript
nclick=history.go(-1)>返回</a>" ( P4 C2 C( |& s, V# v5 t
response.write " <br><br></div></td>"5 }, M* _' V6 r$ d2 [7 e2 i
response.write " </tr> </table></body></html>" + n# o" q* d: n' T3 J' Y
end sub- Z1 ~* p( v* b; {# U/ ]' \! M
%>
利用这个原理,我们还能过滤一些可能存在cookies跨站脚本的地方:. I; ?/ r( k+ G. u0 j/ o0 x
只要过滤cookie,java这样的字眼,方法同上。需要注意的事,类似与用户登陆的地方,用户名一定要username =replace(request("username "),"",""),意思就是把’过滤成”,这样做的目的就是预防’ or ‘’=’这样的入侵。
可是如果类似www.xx.com/list.asp? action = search; Q! a5 d7 G/ A- n8 Y
我们可以这样过滤
<% action=request("action")
select case action, x5 L6 I4 R! w( [( f6 W/ t
case "search"+ t9 t) {5 V& T8 |2 ~# E9 t6 {
call search()6 [+ C+ J" d: K4 R. ]8 Q
case else1 u+ {2 H7 ]0 n$ Y( T ?7 e# l
call search()9 q4 Q) x. z$ Q; @& U7 f
end select
sub search ()
这里是search的内容 " c+ a! l' F+ C5 S* h
end sub& M* I5 r+ F) |- h, |! O7 D
%>+ V/ ]: N0 ^+ h& M! g
大家可以看到无论对错,都执行search。这样也可以预防SQL。; n e e7 b2 d$ W6 [ j* x
二:密码安全+ m! A# v1 S1 ~4 \* e8 p
采用不可逆加密是必须的选择,防止别人探测到密码后暴力破解,MD5用艿氖迪址浅<虻ィ?姹闳フ腋鯩D5函数体,很多源代码都 带。
<!-- #include file=" md5.asp" --> 这里是引入MD5函数
<% dim username d; V) B+ |4 I9 U
username =md5(md5(replace(request("username "),"","")))' P: I2 I h+ t
%>4 o" w" K9 _+ j5 m( J. U$ C
这里就实现了2次MD5加密,一般2-3次就足够了,暴力破解比较困难:)
COOKIES欺骗问题很严重,所以一般后台管理员一定要session验证。实现方法. T& l1 e3 \$ x( \7 I6 r: V
我们在登入成功后写入
session("btadmin")=rsadmin("admin")) i4 m6 ~; i0 A; Z
建立一个验证函数cookies.asp' Z) y- ]) P [' b6 p
内容如下' V' y$ |, V' ]! K
<%1 }% A. z3 [$ T8 Y ]8 U! q3 \
if session("btadmin")="" then
response.redirect "admin.asp"
end if
%>( W e. S& r6 _4 H1 _6 C/ I
在每个管理员操作文件的开头加上
<!--#include file="cookies.asp" -->/ ]5 G N, L) M- I F6 i
这样就可以预防非法登陆了:)+ Y, T; S* a; S4 q: o4 p
我们经常看到验证码这样的东西,这样做是为了预防暴力破解。6 u' E2 K, k: r" y8 A' w& D& D) J
实现方法,假设登入为login.asp
我们在开头加:
<%
dim p
randomize ‘对随机数生成器做初始化的动作1 a% H, C! A( X U+ o( c- {5 r' a: t6 s
p = Int((8999 * Rnd) + 1000)
session("cntcode")=p %>% d) j+ b" P3 v y# {" I. f
; H; E3 ]9 }$ \" J4 I7 U
插入验证代码的表格2 X" t2 t0 ^- k9 v
<tr>+ ]8 y9 l/ W/ @: Y
<td valign=middle>请输入验证码</td>
<td valign=middle>0 H& Y, u: D' l+ R4 @' o
<INPUT name=yanzhen type=text>
在左边框输入: <%=session("cntcode")%></td></tr>
最后验证程序:4 ?: |4 A( ?, S/ [/ e# Y
<%# Z" ~7 F8 P1 d4 A6 i G
if request("yanzhen")="" or trim(session("cntcode"))$ z/ H5 [# l* q# y3 t
<>trim(replace(request("yanzhen"),"","")) then2 p8 A& m% t& h9 Q' a
response.write " 请正确输入您的验证码。"$ U0 z( e/ H3 b8 y1 J6 \3 |2 }4 _
response.end
else
%>9 m7 g; Z, N+ k; \" e6 I: j/ H; g- d
程序运行效果如图2:
" U: `/ \9 ]# a+ L
三:数据库安全- J# V9 I; X7 @$ X( t( o* S. G C
爆库的方法越来越多,我们来看下:如图38 R1 Y* v8 y( Y5 ~
按X档案以前文章一位大侠说的,将/替换为 %5c,确实很多网站都存在这样的漏洞。大家可以清楚的看到数据库地址。0 r& y9 k9 w; e* v, s
偶什么方法可以预防呢?
。。。(代码见杂志)。。。。。。。。。。。
! [" f! J2 h n
这是一个数据库连接文件,大部分为conn.asp
关键在与on error resume next出错了也执行下一句
我们看下他的运行效果。8 E3 ]5 j+ C5 N7 r. S/ ~1 U) M
. w/ X& ^0 h( C1 C+ v" C8 u
除了图片显示不正常外,没暴露数据库:)
其实浪心建议用WIN2003做服务器,当你用%5c 来替换的时候6 U0 A& ^* X3 [* z
_blank>http://127.0.0.1/fourm.asp?cntid=48 _6 z1 _- I) v# O+ t
自动换成%5cfourm.asp/多个/
_blank>http://127.0.0.1%5cfourm.asp/?cntid=4
找不到服务器,唯一的结果,更厉害:)+ [ ?1 ^6 A4 I3 s5 g$ \
还有一种方法就是不让对方下载数据库
方法是
新建一个notdown表,字段为nodown, 数据类型为ole 如图4
保存为mdb.mdb4 G6 X9 X& w& w7 u
OK,我们写个nodown.asp. U4 j8 x3 |; o9 u
代码如下
。。。(代码见杂志)。。。。。。。。。。。0 { P% ]" s" G- J
把他同数据库一同上传到你的空间,或者本地做个IIS,运行nodown.asp
提示添加记录成功。
OK,把数据库重新命名为mdb.asp
直接在浏览器里输入数据库地址:提示. K) F# J9 V) W8 J/ H
Active Server Pages 错误 ASP 0116 e, b: v- Q- \" c3 }" h) V
丢失脚本关闭分隔符 - U9 o! F. H" e9 m/ Q+ }0 D, I
/bbs/cntlovebbs.asp,行 44042
Script 块缺少脚本关闭标记(%>)。
用快车下载提示HTTP 500错误
OK到这里数据库安全也过去了:)下面说下浪心新的思维:)没任何技术难度,会VB的都会写:)- k) v. Q4 D1 r
四:安全的后台登入
。。。(代码见杂志)。。。。。。。。。。。4 X( g5 p8 p1 q1 M9 i
OK了:)程序简单的出奇,他的功能可不小哦:)你的网站可以比以前安全许多。
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |