一次次的SQL注射入侵,一次次的网站被黑,总是那句话,漏洞在所难免,难道一点办法都没吗?这篇文章就是为大家解析下SQL注 射的原理,以及给出一些预防方法。* u- [( ]# c$ Z' U
一:基础篇1 |# ]3 P6 |* k
分析下漏洞产生的原因,主要还是参数没完全过滤。4 c, R' w4 {' p2 X8 L1 C
cntid = Request("cntid")
这样的语句就存在一个注入攻击,首先,没验证是否为整数
解决方法:, O" {, h7 l2 s
<% dim cntid
cntid =replace(request("cntid "),"","")8 W! D( Z# a# K! Q# t% X' [
if (not isnumeric(cntid)) then2 r. y& i- p8 o
call error: P; S Y4 ^" W/ S
response.end1 E6 Y5 W6 c) ^) ]8 |
end if# Q: F' v( B. u# Y2 g* L. R1 |
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> "$ ^" Y% w G5 {/ L
response.write " <div align=center>+ D7 N! ^. R' f: |7 }
操作: 参数错误!</div>"
response.write " </td>"* R$ L) z9 u. D8 G4 N
response.write " </tr>") f% _1 n/ H6 }3 ?: Z% H. _: r! Q
response.write " <tr> "
response.write " <td colspan=2 height=23> "5 e- c9 K; E0 \& w- }6 s& i
response.write " <div align=center><br><br>"
response.write " 参数错误!!!非法探测已经被记录 <br><br>"
response.write " <a href=javascript
nclick=history.go(-1)>返回</a>" / z0 n K# F- A- W: z5 g6 S0 v7 N
response.write " <br><br></div></td>"
response.write " </tr> </table></body></html>"
end sub
%>% V0 L( @8 p! a7 O# b# w% t
% B1 n3 r" F+ o4 t
这是一个最基础的过滤,如果提交非法参数效果如图1:7 b) k) j- s+ S2 z
. v; K6 ^6 P1 a% t
: P. D6 S" O( u- w) V* l& \; F
那么我们还需要注意什么?; D! `8 Z7 W5 q% L/ [" Q
用户名的注册,必须过滤掉一些特殊符号,继续刚才的话题,我们假设是username.
<% dim username
username =replace(request("username "),"","")5 }4 }+ z3 c6 I0 y
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 $ d3 @. X/ Z8 |) J- a$ l/ h! p
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 $ b- U, l# C" b( {- h
Instr(username,">")>0 or Instr(username,"<")>0 or Instr(username,"$")>0 or Instr- N8 v: F# c2 J d" y6 x
(username,"#")>0 or Instr(username,"@")>0 then
call error, {! x# @5 }/ i$ [/ e( N) m
response.end0 G- t. @3 y- B6 |
end if
sub Error() v/ e. x% c: X0 K4 ^! p% X1 @& B
response.write " <table align=center width=300 border=0 5 T9 `9 d! b3 }; l; @1 Z& d5 k
cellpadding=4 cellspacing=0 >"
response.write " <tr > "
response.write " <td colspan=2 height=15> "
response.write " <div align=center>操作: 参数错7 e# a* D& [, R6 I: v8 e
误!</div>"
response.write " </td>"
response.write " </tr>"6 j1 X2 B) I5 I- `0 `
response.write " <tr> "# h& R) F- e5 Q
response.write " <td colspan=2 height=23> "% ^; C/ W1 E- {5 K5 ]; C
response.write " <div align=center><br><br>"0 o4 b c( g& n( t4 X! y9 X
response.write " 用户名中含有非法字符(“=”,“%”,, N' k- b% H" U( Z
“?”,“&”,“;”,“,”,“”,”?”,“>”,“<”,“$”,“#”,“@”) <br><br>"
response.write " <a " h, Q) ~$ f7 t9 l. e. e! O% S
href=javascript
nclick=history.go(-1)>返回</a>" . K) s% S& ^' t6 C! x$ X5 z6 T. P% r/ @
response.write " <br><br></div></td>"
response.write " </tr> </table></body></html>" ! ?3 @" w6 e/ y- I
end sub p. ~$ ^$ M' r' A
%>: k! o0 N% ^6 R/ m# H9 \
利用这个原理,我们还能过滤一些可能存在cookies跨站脚本的地方:1 D) j9 Z S3 H% f( Y# V( [$ F
只要过滤cookie,java这样的字眼,方法同上。需要注意的事,类似与用户登陆的地方,用户名一定要username =replace(request("username "),"",""),意思就是把’过滤成”,这样做的目的就是预防’ or ‘’=’这样的入侵。
可是如果类似www.xx.com/list.asp? action = search
我们可以这样过滤1 T, g* c5 f+ n5 K5 H) L# A; t, x
<% action=request("action")/ [0 s8 c# w' f6 b/ v1 C( P
select case action+ w& {& G7 c4 M1 B8 K& T5 g, l8 T
case "search"
call search()
case else
call search()$ ~3 H! _1 }9 \
end select0 ~4 S, I% Q' r' E3 u
sub search ()
这里是search的内容
end sub6 k( O2 \5 R) Q5 H7 U' R. `# T2 Y
%>
大家可以看到无论对错,都执行search。这样也可以预防SQL。( }+ S; q* A1 A6 v
二:密码安全5 C) \, @) N3 T: k4 W8 X B! i
采用不可逆加密是必须的选择,防止别人探测到密码后暴力破解,MD5用艿氖迪址浅<虻ィ?姹闳フ腋鯩D5函数体,很多源代码都 带。9 N6 B$ Z) r# K5 k3 X
<!-- #include file=" md5.asp" --> 这里是引入MD5函数
<% dim username
username =md5(md5(replace(request("username "),"","")))0 D8 R* \$ O% ?, p) Q
%>' I; P' }" i! I: u$ ^
这里就实现了2次MD5加密,一般2-3次就足够了,暴力破解比较困难:)
COOKIES欺骗问题很严重,所以一般后台管理员一定要session验证。实现方法1 U3 H( H% Z; A2 Z& a# j, [8 \
我们在登入成功后写入
session("btadmin")=rsadmin("admin"). \0 J+ w( | |, d7 f- j
建立一个验证函数cookies.asp) M& i8 V5 V1 X
内容如下# A, d. K/ G" E' f# j' ]
<%4 r4 @- |* @& B2 `5 j# z
if session("btadmin")="" then
response.redirect "admin.asp"6 s, _) a1 M- V7 H* }# o: e( L* m1 X
end if
%>
在每个管理员操作文件的开头加上: H/ _' _* B3 W: A7 e7 p; _
<!--#include file="cookies.asp" -->; c0 l8 y! A* {- S! l
这样就可以预防非法登陆了:)
我们经常看到验证码这样的东西,这样做是为了预防暴力破解。3 X5 P. C% l6 k$ S7 b% `
实现方法,假设登入为login.asp/ ?: ?. E' [% U4 b
我们在开头加:
<%' I p' y6 s4 ]' c
dim p
randomize ‘对随机数生成器做初始化的动作& H+ [$ i/ _4 U# c4 H0 q
p = Int((8999 * Rnd) + 1000) 0 N3 Z' [0 b2 E( M W
session("cntcode")=p %>0 S/ Q) X, U A( Q, j5 _1 d
8 v9 I( P2 d* I7 W4 D
插入验证代码的表格
<tr>" h! W% W% K3 Y/ _6 a l, E
<td valign=middle>请输入验证码</td>
<td valign=middle>
<INPUT name=yanzhen type=text>3 K, I) G0 c( _7 o* x! p+ k2 _1 P
在左边框输入: <%=session("cntcode")%></td></tr>
最后验证程序:
<%6 j& x! B2 k1 k( D& F
if request("yanzhen")="" or trim(session("cntcode"))
<>trim(replace(request("yanzhen"),"","")) then
response.write " 请正确输入您的验证码。"
response.end' I' f: C) t, R, Y7 p
else0 a+ a* Z: u( I$ j1 p8 |
%>
程序运行效果如图2:6 _4 d) r( F8 [
- q7 D7 O8 i( Q% _& l& K. `" F
三:数据库安全
爆库的方法越来越多,我们来看下:如图3
7 Y. E/ A, o+ [1 b( H" j) T, P
按X档案以前文章一位大侠说的,将/替换为 %5c,确实很多网站都存在这样的漏洞。大家可以清楚的看到数据库地址。
偶什么方法可以预防呢?8 [! W1 P) t9 B2 q7 h+ O6 g
。。。(代码见杂志)。。。。。。。。。。。( S5 r2 O$ R- P/ [( H G* G7 D
这是一个数据库连接文件,大部分为conn.asp
关键在与on error resume next出错了也执行下一句% ?# T9 ?! o4 d
我们看下他的运行效果。
* M6 d1 B7 n# |1 Q% P$ a4 i2 _
7 C* U- _% D5 r/ G
除了图片显示不正常外,没暴露数据库:)
其实浪心建议用WIN2003做服务器,当你用%5c 来替换的时候
_blank>http://127.0.0.1/fourm.asp?cntid=4
自动换成%5cfourm.asp/多个/
_blank>http://127.0.0.1%5cfourm.asp/?cntid=49 T" c& d: q' w2 w, a7 m V7 [8 Z
找不到服务器,唯一的结果,更厉害:)$ J3 P& U7 L+ S6 J @* i2 L& a* ?
还有一种方法就是不让对方下载数据库" R* I J* z- H2 n' r1 Y
方法是) n8 `9 \0 v! \& [% P6 e' z
新建一个notdown表,字段为nodown, 数据类型为ole 如图4
; S! `% }) o' \- F0 o$ V
保存为mdb.mdb
OK,我们写个nodown.asp
代码如下
。。。(代码见杂志)。。。。。。。。。。。) L# X2 H2 c9 x$ ]5 S
把他同数据库一同上传到你的空间,或者本地做个IIS,运行nodown.asp. M. K; T& P( ^' J$ b/ W B
提示添加记录成功。- V7 q5 P$ }1 A. D5 L
OK,把数据库重新命名为mdb.asp
直接在浏览器里输入数据库地址:提示
Active Server Pages 错误 ASP 0116 ; C7 { r) z) a+ _1 Y# i* J! E
丢失脚本关闭分隔符 4 \. U( J* ]# g
/bbs/cntlovebbs.asp,行 44042
Script 块缺少脚本关闭标记(%>)。 |; A1 u6 V3 V: \" N% ?: d$ e' |
用快车下载提示HTTP 500错误
OK到这里数据库安全也过去了:)下面说下浪心新的思维:)没任何技术难度,会VB的都会写:)0 b9 w9 [) p6 u/ i
四:安全的后台登入
。。。(代码见杂志)。。。。。。。。。。。
OK了:)程序简单的出奇,他的功能可不小哦:)你的网站可以比以前安全许多。
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |