中国网络渗透测试联盟

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

作者: admin    时间: 2013-7-26 12:42
标题: SDCMS后台绕过直接进入漏洞
要描述:, u! n# Z. Z# S* j1 R
# I& S9 Q+ U/ l) j; C8 P/ j
SDCMS后台绕过直接进入:测试版本2.0 beta2 其他版本未测试
5 A  ~/ r1 y! H' e( S* M3 V, C详细说明:' l' l' M/ r5 i' `6 B, s8 D3 n: J& Q
Islogin //判断登录的方法
( n$ C. I; Q; @. J) |
; D/ K- A5 F3 }- k% ]sub islogin()
7 w" X1 p; X8 V4 V, T# f 1 `& Q0 d' l; o3 e, b  F
if sdcms.strlen(adminid)=0 or sdcms.strlen(adminname)=0 then
, Q3 m% R" B6 E* h * R. I4 g; S: H" u2 I6 o* s
dim t0,t1,t2
$ \, L7 h- K5 N2 ?: {: ^3 S1 K
/ r  L5 W, T8 B6 X* L& L/ pt0=sdcms.getint(sdcms.loadcookie("adminid"),0) loadcookie 2 k  n7 Z& y' {4 a& m- s- I9 H7 v- B

2 f, n6 l" N* `8 st1=sdcms.loadcookie("islogin")
8 N" _2 p4 [" D) p - p0 ]0 m% {, s  i& o' V1 _
t2=sdcms.loadcookie("loginkey")
; [8 q, P* [( k* M- L; o
3 Q9 ~6 o; F9 |% m( t$ w( Xif sdcms.strlen(t0)=0 or sdcms.strlen(t1)=0 or sdcms.strlen(t2)<>50 then //这里判断很坑爹 sdcms.strlen(t2)<>50 loginkey 没有任何要求 只需要输入50个即可往下执行' j& H0 K/ F' n9 n2 j# h2 v1 X5 t
# a: k, B) p/ }8 Z
//' s2 |) L2 H8 ~+ d( ^7 F

* S& B+ ^/ _/ e3 V0 ]  A3 fsdcms.go "login.asp?act=out"' s) ~9 D% S+ e6 ], s

  e  ]: a/ o, P% cexit sub
2 v1 X- L6 T! K4 o) u1 S
5 ], p3 ^- a/ ?8 _, I$ yelse
) H% k8 o- j" @ " t3 \: _1 r' A
dim data5 @3 H. c( d4 q- D

% f" K3 C' E" Q7 C0 a  zdata=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可控
- V  d2 w% }% W: [ & h; x0 c9 i% q7 N- }7 H" {
if ubound(data)<0 then( _5 r: {% Q3 s( U8 p
, E4 O& M, b8 y  Q5 \) u
sdcms.go "login.asp?act=out"
$ j  Z, H' ^5 w# e/ s, b$ W& j+ x) D6 ? 3 {7 ]8 Q, Z! u. U
exit sub
, e9 G" u2 M" f" f2 M5 R# q 1 |( e9 a- H* W# S, ?
else6 K/ u8 H+ M6 j2 h$ o' F
$ c  ^' ?$ j6 z: ?4 p; v( p
if instr(data(1,0)&data(2,0),sdcms.decrypt(t1,t2))<0 or data(3,0)=0 then) ?+ H+ A$ g; I* ?) I7 v
3 l/ o5 M: C3 P# S/ B, _- n
sdcms.go "login.asp?act=out"/ |  _5 {! W. f$ e5 k3 n. K
' _) T: S  a' ?  F, l; d! ?: L5 W$ n0 @2 D
exit sub( s5 v; g0 E  J3 F& ]/ Z7 ]% }
' {- C2 ~; X6 ~' W6 d
else, H5 X" ~/ M$ Z* t* O6 i

2 z1 z4 n( |# Z& B) e2 V- radminid=data(0,0)
9 i: x7 R6 i0 M) p
" \$ _% \/ C* D3 Z% Radminname=data(1,0)
6 ^. J2 e* c# d: }) D9 P
$ o) \' \+ F1 i  R+ m( I! A& I3 ?0 qadmin_page_lever=data(5,0)
. i  R- _7 f, X8 B' Z! i1 t8 ? * P: A: m4 k: Q
admin_cate_array=data(6,0)$ p' K9 V1 J- D/ ?( l* K
2 g- ?7 e+ p  B3 S, B
admin_cate_lever=data(7,0)
9 ^, {& E3 c" Z/ u/ ^
, q3 S$ O$ j# F4 |! O. Jif sdcms.strlen(admin_page_lever)=0 then admin_page_lever=0: A, m9 z. t1 C9 j& \" x  i& P
' q' \" r7 r* G, C  h
if sdcms.strlen(admin_cate_array)=0 then admin_cate_array=0
9 Q: x' `& Q; y2 T 2 ?; D; R9 v! Z
if sdcms.strlen(admin_cate_lever)=0 then admin_cate_lever=0
# |8 I, z9 X$ E7 F+ i/ B
+ I. c6 }$ e6 y' hif clng(admingroupid)<>0 then
  X1 k) M" V4 `7 z4 {! a
9 X4 q. k/ g$ o5 F- E( p" @- qadmin_lever_where=" and menuid in("&admin_page_lever&")"* i! S, j) O6 s8 [. ~3 e# y

, W; i5 O; s' N% vend if2 _* V3 P9 |4 y: _. o/ k% b

2 B) o7 P1 w; S7 g9 bsdcms.setsession "adminid",adminid; o+ A5 f, S8 b3 Y
2 a% }6 L4 |$ C
sdcms.setsession "adminname",adminname
! u" ?4 ]1 O, H3 A   U& T8 ?! S0 r+ f
sdcms.setsession "admingroupid",data(4,0)
3 f" ^. @: T; r# K' f8 o ! M$ ]) ]: |" ~* F' }: f
end if4 a' ~$ g( a1 C& P
* ?: X7 ~8 u5 [# ^$ I6 Y/ j, F
end if
% z1 n9 u4 B, _! m0 i 0 U" B* J: S4 T9 C: g
end if$ Y7 v! f3 |5 |7 @9 j) f6 w. C; W

8 U1 Y  M! U9 N- D& f% g7 v! W2 Velse- y+ F! b( @+ T0 b

8 [" t9 y5 F* R3 d7 a2 tdata=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&"","")
, ~/ a1 D  ?3 U- x. B( _8 k. ]8 x  j- \
% ?# I4 J  E9 z- K# J6 H# yif ubound(data)<0 then, X; P6 n' P% G3 \' x4 t+ W

* S% f& H5 I' J" d) F9 x( {sdcms.go "login.asp?act=out"
5 z! G$ R$ ^3 U: I
9 G. g; d; O; G, R& S) q; x* b4 Mexit sub
- x$ u' p1 b  b9 e, V$ C, Y) v' [   M2 `" A5 ^" a& k
else. m7 S& u- |% g" B5 V
1 u  w: c" _% ?
admin_page_lever=data(0,0)
. }0 v' S8 I2 ~9 j# R # v5 X3 C0 x0 k! t
admin_cate_array=data(1,0)- c# C* }: ?: D" q, c, R" N
9 q+ U2 ~7 `' s  n5 R; [
admin_cate_lever=data(2,0)
& w7 {* W7 v! ^
3 B& j' r* Y/ M# W2 q* Wif sdcms.strlen(admin_page_lever)=0 then admin_page_lever=0
7 E+ T, E2 g2 U* _5 \
) X. u$ u+ @0 t$ a4 _if sdcms.strlen(admin_cate_array)=0 then admin_cate_array=0
/ a- C( N% g& f2 p% _; g; t
5 i/ h2 ~  d7 J' b8 U# D5 r+ Oif sdcms.strlen(admin_cate_lever)=0 then admin_cate_lever=0
4 N5 S# z( J  y) V( t6 a # i+ {! {5 J; f$ i
if clng(admingroupid)<>0 then/ c1 Z+ h+ x* m$ R' s! d3 Z4 G

( j( H3 q4 d4 \$ v) m6 n) e- Sadmin_lever_where=" and menuid in("&admin_page_lever&")"
1 Y/ X% J1 t( P( C" p " T- ]3 p% [" o9 K
end if
( ?8 J; r2 |6 A! X7 X4 h* c
. L- X! `$ T: B4 Eend if9 C# e, X8 F! ]0 i

; e9 g. v' \! p4 iend if
/ h( l6 w9 G: T( j/ S. P
+ J7 ]/ e( n4 v& K; }' r: oend sub$ q7 |' n& u  [( S$ a1 L
漏洞证明:
' j6 m' a% G) _. B/ H' f. C看看操作COOKIE的函数; D7 h1 J& C& ~( u0 s
% e1 e9 w0 P- W6 l
public function loadcookie(t0)
/ p+ {: _  Y& w( K: G
& B" J7 ?7 d3 `$ M2 z  s9 Cloadcookie=request.cookies(prefix&t0)
: `$ j2 D. F. W
$ ]" q' \. `, a6 Send function
  h  b6 E6 f7 a6 y' \' o
' D/ [/ q8 g3 x& d+ spublic sub setcookie(byval t0,byval t1)! B8 v: z" T/ R0 M! f
# Z9 s+ s% |' I7 L
response.cookies(prefix&t0)=t13 j2 \/ n/ h! K* V. M4 n- @8 o! f
* i* S6 V- R9 F6 C* E6 Y
end sub) d1 F& K) G! C" V0 [
  k1 F, {9 R! w1 g  ^
prefix5 k- |, z" x; ^5 F
$ ?* P! |  `9 G) [& l7 U  H6 _8 a
'变量前缀,如一个空间下多次使用本程序的话,请每个程序配置不同的值: |7 ^; ?0 \8 k$ ~& `' v
: d8 p# a# P% Y4 f% d% v: G0 z
dim prefix
  Y, d" G* ]/ P- E) D! j& q6 j 7 j, D3 y2 j% p( q
prefix="1Jb8Ob"
; l; \: C( K+ u% u9 e! P, g/ T
: d0 w! X  r8 e9 L& `'这个值访问一下admin/login.asp?act=out 便可得到 在COOKIE里
  _, k8 R9 t0 p. l; N& K6 a* k
+ l4 s* s" W. x% Ksub out# k# j" W2 A2 U; P' a; l
/ b# _- [2 d3 [% q+ {
sdcms.setsession "adminid","". `: Z5 I" E8 H2 {2 U
+ j% D4 I$ F. Y# k3 D0 e
sdcms.setsession "adminname",""' `1 p2 d) |1 J9 L/ d

- g) D9 m) M- ~4 r4 `sdcms.setsession "admingroupid",""9 [% h3 K7 |3 Z
! n+ \6 }+ F5 D6 B. W1 ?
sdcms.setcookie "adminid",""% \7 W/ S* x# X% c$ G. b8 n

! s/ Q1 _4 i+ V. T+ F1 ^sdcms.setcookie "loginkey",""
  K- o  q: }5 @6 f- @: U* r. F4 ^$ S $ }9 v% |( \$ ?. L- B
sdcms.setcookie "islogin",""1 C( l* L+ x' X$ e0 J0 C  |" z" b+ M

8 `3 }  A$ d/ G+ ]% _sdcms.go "login.asp"* y5 Y# M! J5 v4 U/ v! I3 l- s* f
% N9 ^+ J7 W/ C9 Q% z+ d
end sub$ P/ {& {# c8 ]( [5 w
$ ?; ]' D! s8 N  |

5 l8 a6 S! T4 L( E8 Y) V$ r利用方法:设置cookie prefixloginkey 50个字符 prefixislogin 随意 循环下prefixadminid 即可 默认1 然后访问后台,就可以了!* ^" J" b1 k5 e8 A+ w/ F
修复方案:
  Q9 N4 A# G6 V& V  _* z9 l" I7 @% g修改函数!& l9 u: m7 S% t, A  g2 D4 R





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