标题: ecshop全版本注入分析 [打印本页] 作者: admin 时间: 2013-1-13 09:48 标题: ecshop全版本注入分析 前段时间大概2012年圣诞节左右,在t00ls上看见ecshop全版本注入,当时也下载了最新的程序分析了下,最近考试比较忙,今天刚考完,把我分析的记录下来。 % f+ w4 a. y5 {3 s: H , u" ?3 G3 z2 z% P 漏洞关键文件:6 ?) C! N: L9 A
6 ^& I* m; d7 Z, f6 t6 T9 T
/includes/lib_order.php9 U/ ?/ J. U: w: |* _ Q# F
, \& P1 v( `7 h: u9 Z 关键函数: ; @5 _; S1 \4 L' x8 j . S+ f3 @9 H3 e0 m( L , q' Y6 |9 }8 J# @: l( r! M ( d; J# i+ O2 {# j01 function available_shipping_list($region_id_list) 6 z8 y3 m" z8 G
( P. w, W# ?& M2 Q
02 { $ ?1 d5 z' a: W7 i2 G8 b: s. a8 G- u: s2 Z- O+ q, {
03 $sql = 'SELECT s.shipping_id, s.shipping_code, s.shipping_name, ' . - C0 a0 {- d9 O & K$ m8 t- g( ]# i04 's.shipping_desc, s.insure, s.support_cod, a.configure ' . ) _* Q" S" S( Y t6 L
! |! [. ]1 P) R0 ^
05 'FROM ' . $GLOBALS['ecs']->table('shipping') . ' AS s, ' . 8 t: R& t1 Y1 v" f
D& P8 U% M8 I3 i) N, A06 $GLOBALS['ecs']->table('shipping_area') . ' AS a, ' . : o( C* M3 q' ?' ?8 _1 H6 p7 K5 |2 |
07 $GLOBALS['ecs']->table('area_region') . ' AS r '. / a% L$ H1 w1 a- O4 [3 |: s' E0 S M2 [' f# c0 @
08 'WHERE r.region_id ' . db_create_in($region_id_list) . ! m( P; C: p) ]2 H/ ]
7 a$ C" j7 w) o; y& w3 E* d
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'; 5 z2 ~7 Y3 L1 `
2 ~, J+ ?* g: H6 l8 I10 4 j* a$ w j* c& U
5 T9 k6 v! H, y* l7 Y) H
11 return $GLOBALS['db']->getAll($sql); . b2 w) A/ B" {( b* E K
1 [; b$ `. m$ F8 f0 v12 } " E5 x4 v" A; }1 N
. n7 G* G. e: f c1 m$ y
显然对传入的参数没有任何过滤就带入了查询语句。1 `, Z v7 I; ?+ [5 b5 H2 a+ i0 \
/ ~2 U3 D# m6 H" Y
下面我们追踪这个函数在flow.php中: , v8 \ U# X$ ^3 I* b) i 第531行: ! H5 [, i; i' P: P! e& Q
' ]" v4 \' |) p, w2 _1 $shipping_list = available_shipping_list($region); - v* K% A, O4 V2 W A, m : b9 k( r/ Y3 y$ I ! H- w5 v; S0 l2 |- K: L
$ X: h) Y$ ^4 P# n6 n* X
, v0 ~4 D: h+ A* V, S( w 4 y* p. }- w/ E% X; g' R% i再对传入变量进行追踪:2 w4 l! n. r5 D1 F' T
' v* n/ K+ S* M3 X
第530行: 8 w+ z7 m) ]2 S% j 3 Y7 P9 u6 ~0 Q; E S8 ^1 $region = array($consignee['country'], $consignee['province'],$consignee['city'], $consignee['district']); 6 T9 N7 n& c; {! E: |) Y9 S
( S7 B, P* T7 R0 h& Q 8 X9 c! s8 x" c4 M* ^; W
! }$ |2 f. L) h( K3 @* p% Z5 R$ w
9 j5 Z( b0 X0 X& e# O! _6 N" Y+ f
, Y/ J' g( C9 ]6 P+ M7 s2 H* ^
第473行: 7 [1 X' i% I4 E; [2 o7 \
2 h! Y7 L: _1 I( k3 S4 _
1 $consignee = get_consignee($_SESSION['user_id']); - L% H6 X& {. [1 Y$ _1 K0 \
5 Z$ W9 T$ c' A/ f
到了一个关键函数:. o. E4 [' q6 y. x
+ \2 w7 U/ G! D+ A
/includes/lib_order.php . C+ Z/ ?7 `0 B7 Y7 c' j7 E, `" E8 w o& v6 l( z
4 v& i! ]5 u0 B' F9 m) W: ^
, {6 b) J+ U2 Y! O8 W
8 e1 ?6 R( ]1 {
7 ~4 n% }2 a1 y B4 p01 function get_consignee($user_id) : L2 ]+ `- k" N7 h5 e- R3 q1 p* O0 |( o & c( A: _( n `2 P! W02 { : A9 R& I/ {7 P3 C- W
: j7 ]) r) [7 F- I: A
03 if (isset($_SESSION['flow_consignee'])) # n" ^- m3 u7 i9 p$ O2 H7 D" @: T
, N; |) t+ O' M1 c5 D04 { 8 K7 W0 w, s: O# x$ `, F$ u& F
) x3 r" _" b$ U8 `8 [7 r05 /* 如果存在session,则直接返回session中的收货人信息 */ 5 |# ]7 z$ D6 p
6 J" ~& H2 W" D7 H
06 ! [- w9 H. U. L: g: @7 w- u. b
" u' N/ Y" V" b$ {
07 return $_SESSION['flow_consignee']; / V" ?+ {) l, E3 _! @; c# x$ o- ]/ G$ ?2 h
08 } 8 [& k3 j. J) X3 V . m$ e2 Z( j! P- a4 \09 else + q; r. l) n8 J# a: H; k2 [. S( }2 [
10 { , M& Y9 U' w$ @3 T/ N 8 \: _8 H( N2 J1 Z* r! S3 L. g @- v11 /* 如果不存在,则取得用户的默认收货人信息 */ ! ]7 W# P, i9 |9 Y) S
- \) x9 h2 F8 C/ z4 {12 $arr = array(); 3 Z% D6 T Y: S5 n Q" `# Y `
' Z. b3 F4 Y5 W' T
13 r5 i# `" g7 E# J
, U8 W0 a* s, R4 D3 _) g7 V
14 if ($user_id > 0) + b5 ~* k9 j- t! ?- k " [! @' R% U5 C; W3 C15 { * x, m9 r5 \& E# n' | G4 U W/ E0 l+ T+ Q; G! r. @, K- w9 V
16 /* 取默认地址 */ & k( u% d, q& |1 p2 l4 q
6 `& n9 A" i5 Z7 ]
17 $sql = "SELECT ua.*". / d, q% L3 O0 q5 z
% ?- c4 k/ m. U. B18 " FROM " . $GLOBALS['ecs']->table('user_address') . "AS ua, ".$GLOBALS['ecs']->table('users').' AS u '. a# W) h; {; p. r2 E M+ x3 A( n7 q* J9 V19 " WHERE u.user_id='$user_id' AND ua.address_id = u.address_id"; . n2 M2 X# s0 H$ u' f, e