中国网络渗透测试联盟

标题: SDCMS后台绕过直接进入漏洞 [打印本页]

作者: admin    时间: 2013-7-26 12:42
标题: SDCMS后台绕过直接进入漏洞
要描述:7 N' A9 V1 d8 p/ \6 v: d7 j

' H& h  x1 M* P% K& s, B2 }SDCMS后台绕过直接进入:测试版本2.0 beta2 其他版本未测试9 W5 ^- f  T  f- g$ w# R+ y
详细说明:; C1 A  [! @( B9 p1 @- H; j
Islogin //判断登录的方法2 z% V8 q, J* X, N8 p7 |

3 |4 A! h4 F! [* ]0 C: k7 u$ Vsub islogin()
. U3 }: A! w8 B& f1 z8 v' W& b
' k. m$ K1 K$ f' k3 {3 yif sdcms.strlen(adminid)=0 or sdcms.strlen(adminname)=0 then
' q! E- ?# b1 J' \* U8 x : r+ A, T5 q- z3 N2 }% V$ y9 H
dim t0,t1,t2
( J# m9 ?2 v- o % ^$ }- e* [" {* `) U. h/ S" R
t0=sdcms.getint(sdcms.loadcookie("adminid"),0) loadcookie # ?& F+ G8 R% Z8 O# \# V; ^6 e
$ t2 }( Z( N7 J/ S
t1=sdcms.loadcookie("islogin")
8 |: L  V3 D% Z  w5 y% R
6 @) G, Z0 @9 d- Et2=sdcms.loadcookie("loginkey")
* ]" q: F* O- F, ?* \, j1 i) S2 p/ p% p+ H 9 k; G" v) Y2 q1 S5 M, ^; }
if sdcms.strlen(t0)=0 or sdcms.strlen(t1)=0 or sdcms.strlen(t2)<>50 then //这里判断很坑爹 sdcms.strlen(t2)<>50 loginkey 没有任何要求 只需要输入50个即可往下执行
8 |  c- I' O, z4 F   n+ F' ~3 o; c$ L3 @1 ~  j/ ]
//% q: _. D( p; D/ _* y9 z9 d
. }6 l3 h0 I' P. L0 i5 q( m( K+ I
sdcms.go "login.asp?act=out"! g' D% ]  K5 u# c% j' O
! M/ @4 h2 r( u/ ]" C
exit sub+ A% F" w2 k8 L
8 n, q/ N; s3 P( e: ^' c( E
else/ K2 ~  m' H0 L& l, e5 c; c5 s  s, l
8 [  d. U+ n& h% Z
dim data
" Z7 w+ h3 B- c  l* ~
& j, N. t- x( xdata=sdcms.db.dbload(1,"adminid,adminname,adminpass,islock,groupid,g.pagelever,g.catearray,g.catelever","sd_admin u left join sd_admin_group g on u.groupid=g.id","adminid="&t0&"","") //根据管理员ID查询 ID可控
; U. j+ ^3 {2 l* O & w# ~) R% r; J5 Y. o9 t6 P; \# |3 r7 t
if ubound(data)<0 then! U1 y' r9 Q6 R; ]+ S# @3 b/ ^

, m$ C. f+ U- `7 T$ ]3 ?* U% o5 Lsdcms.go "login.asp?act=out"
  h% t4 [# ~# V2 v( L4 Z 5 U$ }6 I5 j8 O. c& W: Z
exit sub+ g" q8 V3 Z, W- M

+ G( i# M; w. D$ N$ o/ belse
; c, O7 ~* T6 A. J; R . U  Y; d& j+ a' \
if instr(data(1,0)&data(2,0),sdcms.decrypt(t1,t2))<0 or data(3,0)=0 then
% J; `. E6 r! I5 x3 i% W6 r ) m+ L9 T3 E1 B4 J" d" ?8 E
sdcms.go "login.asp?act=out"( B5 Z' d% n5 Z; ~/ O7 @

* d! R8 Z$ @% T3 M: Wexit sub% g+ `! R2 c9 F) d

4 U& `+ y0 Y5 V! Y9 O, Belse7 ~7 l- A0 C/ Q0 B& o
+ \3 \6 X5 j( a( s6 q
adminid=data(0,0)/ }( J0 e7 h: h  K

, w% t2 r7 ~! F3 ?3 S% Fadminname=data(1,0)+ Y, w. T+ m+ t; G
0 S/ o3 F8 Y7 h8 B% Q! }8 O
admin_page_lever=data(5,0), j1 r1 s) n7 B2 }+ d  {6 w2 y
  l9 W2 i# a& u9 }5 @; Q
admin_cate_array=data(6,0)
% ~. U1 C( l( A' ]; Y
+ n& D3 Z/ J; U3 }! U( A. @8 Uadmin_cate_lever=data(7,0)" @7 C. {1 h4 g$ o+ ?+ a+ A: C

) \& N! Y( V- wif sdcms.strlen(admin_page_lever)=0 then admin_page_lever=0
% L- t+ Z7 s2 q  C  @
1 h5 ]9 C' p" I9 ~+ a5 |if sdcms.strlen(admin_cate_array)=0 then admin_cate_array=0
4 N; {2 O2 W) y; i+ [/ X  O 6 @# {6 K  y! }* w" E* t% g
if sdcms.strlen(admin_cate_lever)=0 then admin_cate_lever=0/ H- W9 w) x  W; I9 t" ]5 `

0 q: B* X* e+ }if clng(admingroupid)<>0 then
( R( F* c# T7 [) \! O / |  t- E" p5 H1 u( h6 T
admin_lever_where=" and menuid in("&admin_page_lever&")"
" z% U' F* T( y) i- C
; y1 L: a/ [0 v' r% Eend if
" d# ~# Q' ~( G/ I6 `. o- ] * C8 \. N' R# e6 _
sdcms.setsession "adminid",adminid- o/ f! Z# Y. z

0 x! l& s# b. f( Z( hsdcms.setsession "adminname",adminname
& N7 p0 Y" ^" N. b* ^, X/ h: I. E ! ~6 s' O' k4 f; ~& D4 @" A3 r
sdcms.setsession "admingroupid",data(4,0)* x& `6 y* @* v$ R; A7 f7 r! H
5 n8 d4 z, s: _* J& O# S! }
end if
4 h8 i0 k- G7 V' L1 o1 j! |0 Y3 ]
% O- q+ c9 v5 d9 p7 D* j/ zend if
  }. g2 h% {& ]9 v+ L7 c- t8 {
. k8 x2 s& }' z4 X* F( `end if& b) K; Q2 \) {, k% a2 |

7 A+ i2 [& m. V/ P3 U+ ]else
" K; {( _8 J4 y; y
, O7 M/ Z* K8 j+ c& C# [! K+ O+ \data=sdcms.db.dbload(1,"g.pagelever,g.catearray,g.catelever","sd_admin u left join sd_admin_group g on u.groupid=g.id","adminid="&adminid&"","")  v# ~" }1 J1 z+ C8 d' E4 d

) }3 g, M; F* r5 iif ubound(data)<0 then" Y1 u5 C+ ?$ K# T

% D' K; B* ^6 V1 P8 Isdcms.go "login.asp?act=out"
' h* v3 }) F) e
% f% {! T# X( _& O/ J2 qexit sub
$ `$ Z! W6 f+ D1 l0 U& r
0 E+ S7 d' D: X& h3 q5 Aelse
7 g# O# {: \1 s% l& h3 F2 }
8 y: @) L0 i% Q5 Gadmin_page_lever=data(0,0)
1 I% V0 r7 Q: a& w 3 V# y9 H! e. c. B! |2 n+ r4 P
admin_cate_array=data(1,0)
% a+ J) J9 g5 ~7 v# ]7 \
+ R; K3 B+ M3 D  g9 l: q  R$ p* madmin_cate_lever=data(2,0)
; Z! p% R8 R( o/ V* ]1 {% T  ^+ V 5 t0 C8 Q& ?5 {8 x% Q. e# L! o
if sdcms.strlen(admin_page_lever)=0 then admin_page_lever=0
0 e5 J1 Q6 W$ d/ [) U, i
+ K  G% A; s# O; P" yif sdcms.strlen(admin_cate_array)=0 then admin_cate_array=0
4 U3 M9 v  U' z- g6 v
' |# E. O/ Y7 F/ L4 r' Sif sdcms.strlen(admin_cate_lever)=0 then admin_cate_lever=0
& T# N$ @; Z+ r: A6 o
8 J7 Z, X: r/ t( z, [+ pif clng(admingroupid)<>0 then0 a  }2 L; f4 i3 p! }

' A7 h: F0 J  {# d4 x) j: qadmin_lever_where=" and menuid in("&admin_page_lever&")"
# Z) V% H& R+ i1 v7 T: T, y
" p; a* K( r, `, Eend if$ v- |& T  n' \$ g& y' A

9 k' i/ l% `) f  l' o, yend if- C- Z% Y( F! ^& C1 x

, h, ~7 K+ l/ A, }0 h2 H3 Hend if3 _/ }  M) C4 j+ k& P7 l

8 K9 V% O0 g: m# E% a; Nend sub
; P, r9 [- n  Q4 I7 K! a漏洞证明:
& k4 ]6 X# v& B6 j8 o8 a# n看看操作COOKIE的函数9 i' v: K+ m& Y" s# L3 [) t9 G
. N1 q. ]- G  z. A* ?3 c  W! a
public function loadcookie(t0)+ [4 z( z9 J5 A# a6 a* u) f

& V- N& w1 D+ a; a+ J/ K4 Qloadcookie=request.cookies(prefix&t0). y! f" y) I" I* h

( K5 O' v' k" k) N( @) G. D$ A) qend function* m) }4 v9 a8 ~  W

: u# B# Z- r( u1 v$ P2 ]! Fpublic sub setcookie(byval t0,byval t1)& y6 T& X) z  o: d- b

7 }; P8 W! J: a; A* o* ]response.cookies(prefix&t0)=t11 L: J7 i7 w6 r) G7 w8 X

" P0 ~+ G0 \2 \8 M7 cend sub
# e$ }+ |: I  M3 w: V0 a" `- k 4 o% K% A" B1 q* a
prefix
2 t9 o) S8 U! q# ?8 ^& \0 u/ N# ^ 0 o2 \2 |& ^- s3 H! \. ?
'变量前缀,如一个空间下多次使用本程序的话,请每个程序配置不同的值
2 d8 r! z$ u7 [( ^% W4 b6 _
# a! @+ t) X7 L6 D& N' S! Udim prefix
) o2 d8 g$ h( W0 q% s  J& V  r
' ]& E! I. T+ j8 w% Y1 lprefix="1Jb8Ob"' X, w& ^2 }; G; ?
. I& \+ o, X" s( H$ p
'这个值访问一下admin/login.asp?act=out 便可得到 在COOKIE里
/ ^# k/ l5 G* l3 @
2 v. Y) M, g8 O0 Rsub out9 |# R' z  R1 j# d
/ E6 r; j; a7 _9 q, d# }. P
sdcms.setsession "adminid",""
6 d* Y5 V; L0 I9 j3 _+ l5 E. F
$ d. a- Q6 ]+ C( x, Vsdcms.setsession "adminname",""
7 b. b# q" m7 k" Y* T
5 k& o( ?9 H& d" P% _, h6 vsdcms.setsession "admingroupid",""5 z3 \+ a4 n. D

7 H1 O( y% G/ z/ f$ Lsdcms.setcookie "adminid",""
9 P' [6 D: L: B3 w9 j( V0 F3 d7 K ; H# V& _  J; J2 H$ W
sdcms.setcookie "loginkey",""
% |( F/ j1 r% y9 ^ 1 Q. |5 Q' ~; C' ]- ^
sdcms.setcookie "islogin",""
" u! Y# e3 }. ~3 c
0 g/ A9 w/ K$ Tsdcms.go "login.asp"
8 u& U$ ~& Y4 |0 l% v
4 P) W! B& A& n. D+ n4 iend sub. K8 d. X6 Y0 V0 d+ }" T- e$ X& w6 l! l

8 C! r7 F% M' o4 ?9 \ ( _8 D& J+ H, }
利用方法:设置cookie prefixloginkey 50个字符 prefixislogin 随意 循环下prefixadminid 即可 默认1 然后访问后台,就可以了!3 f* a' x$ U" B' h. Z3 }$ b' X
修复方案:
! @1 O; C' |/ \  v+ f修改函数!
( Q$ n4 N$ V, Q( s& p! y




欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/) Powered by Discuz! X3.2